S-JIS[2013-11-24] 変更履歴

Asakusa Framework 停止演算子

Asakusa FrameworkOperator DSLの停止演算子(stop)のメモ。


概要

停止演算子は、出力データをどこにも出力しない演算子。
性能特性は無し。

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

演算子からの出力データを使用しない(どの演算子でも使用しない・どのファイルにも出力しない)場合は、停止演算子に接続する。
つまり、出力データを破棄する為に停止演算子を使う。

停止演算子もあまり使うことは無いと思うが、空演算子(empty)よりは使いそう。変換演算子(@Convert)のオリジナルデータ出力に対してはよく使う(笑)

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


停止演算子のみに接続している演算子は、最適化されて処理自体が削除され、何も実行されないことがある。
(除去抑制(@Sticky)を参照)


停止演算子とは反対に、入力データが無い場合は空演算子(empty)を使う。


停止演算子のコーディング例。
変換演算子(@Convert)の変換前データ出力(original)を停止演算子に接続する。
(この図はToad Editorを用いて作っています)

Toad Editorでは、 停止演算子を「丸の中に×(バツ印)の入った図形」で表している。

example.dmdl(DMDL):

hoge = {
    〜
};

ExampleJob.java(Flow DSL):

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

import com.example.modelgen.dmdl.model.Hoge;

import com.example.operator.ExampleOperatorFactory;
import com.example.operator.ExampleOperatorFactory.ToFoo;
	private final In<Hoge> in1;
	private final In<Hoge> in2;

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

		// HogeをFooに変換する
		ToFoo toFoo = operators.toFoo(this.in);

		// 停止演算子
		core.stop(toFoo.original);

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

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

Flow DSLでは、stopメソッドの引数に(破棄したい)出力データを指定する。


単体テスト

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


類似

停止演算子は、MS-DOSのNULデバイスやUNIXの/dev/nullを 出力先として使うのに似ている。

MS-DOS:

> copy in NUL

UNIX:

> cp in /dev/null

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