処理を分岐する
前回 は、Wedge ノードを使用して WorkItem を作成し
アトリビュートを使用して処理のバリエーションを作成しました。
これで、1 つの処理(サンプルの場合 Python の関数)に対して n × n のバリエーションを生成し
実行できるようになりました。
しかし、これだけだと、処理が直列につながって同一の処理を実行しただけになります。
そうではなく、例えば特定の条件によって特定の処理を分岐したい といったこともやりたくなります。
そういった場合は、Filter や Partition、Expand などを駆使することで
条件に応じた処理を作ることができます。
Filter
前回、PythonScript ノードを使用して、足し算した結果を result アトリビュートに追加しました。
この WorkItem を 1.5 以下の場合かそれ以外かで処理をわけたいとします。
このような、「条件にマッチした or マッチしない WorkItem だけを抽出する」のが FilterExpression です。 FilterExpression は、その名の通り Expression の結果にマッチした WorkItem のみフィルタリングします。
Operation はデフォルトでは RemoveMatchingItem(条件にマッチしたものをブロックする)になっています。
今回はマッチする内容のみ取得したいので Keep Matching Items にして、Expression を書きます。
@アトリビュート名 で、アトリビュート名を取得できるので、式を記述します。
実行すると、マッチした WorkItem だけになっているのがわかります。
TaskGraphTable を見ると、条件にマッチした WorkItem になっているのがわかります。
同様に 1.5 以下の WorkItem だけを取得するように FilterExpression を作成すると
1.5 以下の WorkItem と、それ以外の WorkItem にまとまりました。
それぞれで何かしらの処理を実行した後に、まとめて再度処理をしたいとかもあるはずです。
その場合は、いくつか手段はありますが、特に条件がない場合は Merge ノードを使用すればそれぞれの処理を統合することができます。
Partition
複数の処理を並行して実行させて、最終的にすべてのWorkItemが終わるまで待機 したいというケースもあるはずです。
そういった場合は「パーティション」と呼ばれるノードを使用します。
WaitForAllノードは、すべての入力WorkItemを単一のパーティションに追加します。
パーティションは「そのパーティションに属するWorkItemがすべて完了するまで待つ」ので
結果的に、WaitForAllノードを使用すると、入力した処理を待機するのに使用します。
また、すべての処理を待ってから1つのWorkItemに統合することから
最後にメールを送信する といったことをやりたい場合にも使用できます。
Expand
終了するのではなく、再開したい場合は Expandノードを使用します。
WaitForAllノードの次に、PartitionExpandを接続します。
Apply Expansion To を Items in Upstream Partition にすると、パーティションですべてのWorkItemが完了するのを待ってから
再開することができます。