S-JIS[2013-11-24/2015-04-23] 変更履歴

Asakusa Framework 空演算子

Asakusa FrameworkOperator DSLの空演算子(empty)のメモ。


概要

空演算子は、0件入力データを生成する演算子。
性能特性は無し。

入力
ポート数
入力データモデル
の制約
イメージ 出力
ポート数
出力データモデル
の制約
入力1レコード
に対する
出力レコード数
0   1   0レコード。

普通は演算子は何らかの入力データを必要とするので、そこに空演算子を接続するパターンは思い付かない^^;
が、フロー演算子(FlowPart)を使うときに、使用しない入力ポートに空演算子を接続することはありそう。

(AsakusaFWでは、入力ポートには必ず何かしらの接続をしないといけない。ポートに接続が無いということは設計/実装漏れではないか?という判断でエラーになる)


空演算子とは反対に、出力データが不要な場合は停止演算子(stop)を使う。


空演算子のコーディング例。
(この図はToad Editorを用いて作っています)

Toad Editorでは、空演算子を 丸の中にφ(ファイ:空集合によく使われる記号)の入った図形で表している。

example.dmdl(DMDL):

hoge = {
    〜
};

ExampleJob.java(Flow DSL):

import com.asakusafw.vocabulary.flow.util.CoreOperatorFactory;
import com.asakusafw.vocabulary.flow.util.CoreOperatorFactory.Empty;

import com.example.flowpart.ExampleFlowPartFactory;
import com.example.flowpart.ExampleFlowPartFactory.ExampleFlowPart;

import com.example.modelgen.dmdl.model.Hoge;
	private final In<Hoge> in1;
	private final In<Hoge> in2;

	private final Out<Hoge> out;
	@Override
	public void describe() {
		ExampleFlowPartFactory exampleFlowPartFactory = new ExampleFlowPartFactory();
		CoreOperatorFactory core = new CoreOperatorFactory();

		// 空演算子
		Empty<Hoge> empty = core.empty(Hoge.class);

		// フロー演算子
		ExampleFlowPart fp = exampleFlowPartFactory.create(this.in1, this.in2, empty.out);

		this.out.add(fp.out);
	}

空演算子はコア演算子なので、Operatorクラスにプログラマーが何かを実装する必要は無い。

Flow DSLでは、emptyメソッドの第1引数に出力データモデル(のクラス)を指定する。

なお、空演算子の出力データの指定方法は、「empty.out」でも「empty」でも同じ。見た目が違うだけ。


asの例

AsakusaFW 0.7.3から、新しい表記方法が出来るようになった。[2015-04-23]
メソッドの引数にデータモデルクラスを渡すのではなく、In・SourceやOutのデータソースを指定し、それと同じデータモデルであることを表す。

	private final In<Hoge> in;

	private final Out<Hoge> out;
		// 従来の書き方
		this.out.add(core.empty(Hoge.class));

		// AsakusaFW 0.7.3 で書けるようになった書き方
		this.out.add(core.empty().as(Hoge.class));
		this.out.add(core.empty().as(this.in));
		this.out.add(core.empty().as(this.out));

この表記方法は、多相データフロー(ジェネリクス(型引数)を使ってフローパートを定義する)で便利。
(Javaでは、型引数から「T.class」のようにしてクラスを指定することは出来ない為)

@FlowPart
public class EmptyFlowPart<T extends ProjHoge> extends FlowDescription {
	private final In<T> in;

	private final Out<T> out;

	public EmptyFlowPart(In<T> in, Out<T> out) {
		this.in = in;
		this.out = out;
	}
	@Override
	public void describe() {
		CoreOperatorFactory core = new CoreOperatorFactory();

		core.stop(this.in);

//×		this.out.add(core.empty(T.class));
//		this.out.add(core.empty().as(this.in));
		this.out.add(core.empty().as(this.out));
	}
}

単体テスト

空演算子はコア演算子なので、(Operatorクラスにプログラマーが何も実装していないので)Operatorの単体テストを実装する必要は無い。


類似

空演算子は、MS-DOSのNULデバイスやUNIXの/dev/nullを入力ファイルとして使うのに似ている。

MS-DOS:

> copy NUL out

UNIX:

> cp /dev/null out

Operator DSLへ戻る / AsakusaFW目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま