Asakusa FrameworkのOperator DSLの分割演算子(@Split)のメモ。
|
分割演算子は、結合モデル(マスター結合演算子の出力)を結合元のデータモデルに分解する演算子。
性能特性はExtract(旧ドキュメントではMap)。[/2016-02-11]
入力 ポート数 |
入力データモデル の制約 |
イメージ | 出力 ポート数 |
出力データモデル の制約 |
入力1レコード に対する 出力レコード数 |
|
---|---|---|---|---|---|---|
1 | 結合モデル |
![]() |
2 | left | inの元の データモデル |
1レコード。 |
right | inの元の データモデル |
1レコード。 |
(結合モデルを元のデータモデルに分割する以外で)入力データモデルを別のデータモデルに変換する場合は変換演算子(@Convert)や抽出演算子(@Extract)を使う。
joined_hogeという結合モデルを元のhoge_masterとhoge_transactionに分割する例。
(この図はToad Editorを用いて作っています)
入力データ例 | 出力データ例 | ||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
in |
|
→ | master |
|
|||||||||||||||||||||||||||||||||||||||||||||
→ | tx |
|
hoge_master = { id : TEXT; name : TEXT; }; hoge_transaction = { date : DATE; master_id : TEXT; value : LONG; }; joined joined_hoge = hoge_master % id + hoge_transaction % master_id;
import com.asakusafw.runtime.core.Result; import com.asakusafw.vocabulary.operator.Split; import com.example.modelgen.dmdl.model.HogeMaster; import com.example.modelgen.dmdl.model.HogeTransaction; import com.example.modelgen.dmdl.model.JoinedHoge;
public abstract class ExampleOperator { /** * JoinedHogeを分割する * * @param joined * 分割するレコード * @param master * 分割後のHogeMaster * @param tx * 分割後のHogeTransaction */ @Split public abstract void split( JoinedHoge in, Result<HogeMaster> master, Result<HogeTransaction> tx ); }
分割演算子は抽象メソッドとして定義する。
第1引数で結合モデル、第2引数と第2引数で分割して出力されるデータモデル(結合前のデータモデル)を指定する。
戻り型は無し。
import com.example.modelgen.dmdl.model.HogeMaster; import com.example.modelgen.dmdl.model.HogeTransaction; import com.example.modelgen.dmdl.model.JoinedHoge; import com.example.operator.ExampleOperatorFactory; import com.example.operator.ExampleOperatorFactory.SplitFields;
private final In<JoinedHoge> in; private final Out<HogeMaster> out1; private final Out<HogeTransaction> out2;
@Override public void describe() { ExampleOperatorFactory operators = new ExampleOperatorFactory(); // joined_hogeを分割する Split split = masterOperator.split(this.in); this.out1.add(split.master); this.out2.add(split.tx); }
Flow DSLでは、自分が作ったOperatorのFactoryクラス(AsakusaFWのコンパイラーによって生成される)を使用する。
メソッド名はOperatorクラスに書いたメソッド名と同じ。
戻り値の型はAsakusaFWのコンパイラーによって生成されたクラス。(メソッド名を先頭が大文字のキャメルケースに変換したもの)
出力ポートの名前は、Operatorクラスのメソッドに出力ポート(Result<データモデル>)として指定した変数名が使われる。
分割演算子は抽象メソッドなので、(Operatorクラスにプログラマーがメソッド本体を実装していないので)Operatorの単体テストを実装する必要は無い。
分割演算子は、Scalaのunzipメソッドと概念的には似ている 。
//「StringとIntのペア」のListを、StringのList と IntのListに分割する scala> val joined = List(("a", 123), ("b", 456), ("c", 789)) joined: List[(String, Int)] = List((a,123), (b,456), (c,789)) scala> val (left, right) = joined.unzip left: List[String] = List(a, b, c) right: List[Int] = List(123, 456, 789)