第5回では、AsakusaのDSLで記述したサンプルプログラムを紹介する。プログラムの内容は、受注データを商品マスターを使ってチェックし、問題がなければ注文ごとに集計するというシンプルなものだ。

 このサンプルプログラムは、オープンソースソフトウエア(OSS)の一部として配布している。OSSの配布を昨日開始したので、実物を試しながら読んでもらえれば理解が深まるだろう(URLはこちら)。

 Asakusaには3種類のDSLがある。3層からなるマルチティアのDSLで、三つを総称してAsakusa DSLと呼ぶ。まず、それらをおさらいしよう。

(1)Batch DSL

 Batch DSLは、業務部門のユーザーから見たときの、いわゆる「バッチ」という単位を構成する最上位のDSLである。下位のFlow DSLで作成するジョブフローをつなぎ合わせて、一連のバッチ処理にすることが目的である。

 バッチは、ユーザーが必要とするアウトプットを生成する一連の処理を指す。基本的にアトミック性の管理はなく、適切な粒度で運用監視ができることを目的にしている。設計の視点では、一連のDAGの流れ全体を見る形になる。このバッチを作成するDSLが、Batch DSLである。

(2)Flow DSL

 バッチのビルディングブロックを形成する、ジョブフローとフロー部品を作成するためのDSLである。ジョブフローは、フロー部品や後述する演算子を組み合わせて記述し、アトミックな処理単位になる。フロー部品も、他のフロー部品と演算子を組み合わせる点ではジョブフローと同じだが、アトミックではない点が異なる。

 Flow DSLでは、データフローの記述を行う。データの入出力管理も併せて記述できる。DAG上では適切な粒度を保つため、頂点(処理)を形成し、各頂点を辺(データ)で結線する役割がある。

(3)Operator DSL

 最下層のDSLで、最もプリミティブな処理を記述する。上位のFlow DSLが部品であるとするならば、いわば部品を構成するねじやくぎに当たる。

 Operator DSLも頂点を形成し、それを部品としてFlow DSLに提供する。最終的な、データを直接操作する処理の固まりと見てもよい。Asakusaでは、フロー制御や業務系の処理などの演算子が標準で提供されており、それを拡張することができる。

DSLの記述例

 それではAsakusa DSLの実際の記述例を紹介していこう。Asakusaに付属するチュートリアルを基に解説していく。Asakusaをセットアップすると、デフォルトで準備される二つのサンプルプログラムのうちの一つを用いる。

 チュートリアルで想定しているユースケースは次のようなものである。受注データ(ORDER_DETAIL)を商品マスター(ITEM_INFO)でチェックして、問題がなければ注文ごとで集計し、集計データ(ORDER_AMOUNT)を出力するというものだ。

 処理されるデータと処理を行うプロセスは車の両輪であり、両者を適切に取り扱っていくことが重要である。DAGの設計でいえば、それぞれがグラフの辺(エッジ)と頂点(ノード)に当たる。まずはデータモデルの実装を見ていこう。