Skip to main content

処理を分岐する

前回 は、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が完了するのを待ってから
再開することができます。