Asakusa FrameworkのOperator DSLの空演算子(empty)のメモ。
|
空演算子は、0件入力データを生成する演算子。
性能特性は無し。
入力 ポート数 |
入力データモデル の制約 |
イメージ | 出力 ポート数 |
出力データモデル の制約 |
入力1レコード に対する 出力レコード数 |
---|---|---|---|---|---|
0 |
![]() |
1 | 0レコード。 |
普通は演算子は何らかの入力データを必要とするので、そこに空演算子を接続するパターンは思い付かない^^;
が、フロー演算子(FlowPart)を使うときに、使用しない入力ポートに空演算子を接続することはありそう。
(AsakusaFWでは、入力ポートには必ず何かしらの接続をしないといけない。ポートに接続が無いということは設計/実装漏れではないか?という判断でエラーになる)
空演算子とは反対に、出力データが不要な場合は停止演算子(stop)を使う。
空演算子のコーディング例。
(この図はToad Editorを用いて作っています)
※Toad Editorでは、空演算子を 丸の中にφ(ファイ:空集合によく使われる記号)の入った図形で表している。
hoge = { 〜 };
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
」でも同じ。見た目が違うだけ。
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を入力ファイルとして使うのに似ている。
> copy NUL out
> cp /dev/null out