前回はSwitchノードを使って「仕分け」をやってみましたが、Sequence rulesによる仕分けというものは出来ませんでした。今回はSplitノードを使って配列要素をSequenceとして並べ、それをSwitchノードで仕分けてみたいと思います。まさにベルトコンベアで流れてくる箱を行き先別に仕分けるイメージ。
※「ブロックを積みながら」投稿順 index はこちら
今回のフローを先頭のアイキャッチ画像に掲げました。
-
- Injectノードで、配列(Array)をInjectする
- Splitノードで、配列を要素毎に分解して、一連のSequenceとして送り出す。
- Switchノードで、連続して到着するSequenceを、先頭、途中、末尾に仕分けてそれぞれの行き先に送り出す。
Injectノード
Injectノードでは、msg.payloadに数値を3要素(べたな数値で1,2,3)含む配列を載せて送り出しています。こんな感じ。
Splitノード
後続のSplitノードでは、3要素の配列を「固定長1」要素毎に分割し、Sequenceとしています。
上記で分かるとおり、Splitノードは到来する配列を分割する以外にも文字列を分割したり、key/valueペア事に分割したりと、なんでも細切れのシーケンスにしてしまう作用を持つようです。
この逆の作用を持つノードとして Joinノードがあるので、これは次回やって見ようと思います。
Switchノード
さて、前回も使ったSwitchノードですが。Sequence rulesに関しては、3つの項目にわけてルールを記述可能です。
headで、最初の要素を処理できますが、JSONata式を記述可能なので、さらに条件を加えることができます。以下では、payloadに数値が載っていて、かつ2より小さいと指定しています。JSONata式を満たさなければ仕分けは行われません。
index betweenは、Sequenceの要素のインデックス番号で取り出す範囲を決められます。下限<インデックス≦上限、と上限を含む指定のようでした。以下では0より大きく1以下のインデックスを取り出しています。「+追加」ボタンを押せば複数の index betweenを並べられるので仕分け先を増やすことができます。
tailは末尾の取り出しですが、head同様JSONata式を記述可能でした。
以下では「最初に合致した条件で終了」としてあるので、どれか一つのルールに合致すれば他のルールが適用されることはありません。行き先は一つだけ。「全ての条件を適用」にすれば合致した行き先の全てに積荷が配られることになります。
仕分けの結果(Debug)
実際にフローを適用したときの、Debug Windowの様子が以下に。最初の3つ、Debug_Arrayからの報告はSplitの結果のシーケンスです。配列 [1,2,3]はめでたく3個のメッセージに分割され、順番通りに出力されています。payloadには要素の数値がそのまま載っています。
後半の3個は仕分けた結果です。それぞれ異なるDebugノード、Debug1,Debug2,Debug3に、数値データ1,2,3を載せたmsg.payloadが送られています。
というわけで仕分け成功。次回は、SplitしたものをJoin?