Workatoのformulaを使い倒してみる2 - List処理時の where と format_map
まえがき
いろいろなアプリを連携するときに便利なWorkatoですが、アプリからデータを受け取った時にJSON形式でデータを受け取るケースは多々あると思います。
JSON形式だと構造化されていて扱いやすいのですが、「この条件に適合する値だけ欲しい」というケースでは "Repeat Each Actionを使ってループ" のように実装されることもあるのではないでしょうか
しかしループ処理で多量のデータを扱うと「タスク数」の観点で辛い目にあったりするので、タスク数を最適化しつつシュッと実現できる方法としてformulaを使った実装を書いてみます
サンプルデータ
例えばこういったシンプルがJOSNでデータを受け取ったとします
{
"items" :[
{
"name" : "7 inch",
"quantity": 10
},
{
"name" : "12 inch",
"quantity": 6
},
{
"name" : "LP",
"quantity": 100
}
]
}
サンプルレシピ
このやり方でも間違ってはいないですし、処理が見てわかりやすいので良いと思います。
quantityが10を超えるデータだけ出力したいときにはこのような実装ですね。
全部でどれだけ出力されたかわかりやすいようにVariableとして val1
を作成して、ループしながら条件にマッチしたデータだけvariableのval1に 「item: {name}, quantity:{quantity}」となるように文字列を追記していっています。
最後のlog出力でval1の値を出力しています
実行結果
これでも良いのですが「タスク数を消費する」という課金モデルに直結する問題を含んだものになります
ループ処理だけに着目するとif
はタスク数にカウントされませんが、update variable
はタスク数にカウントされるため、条件にマッチする行数によっては膨大なタスク数を消費する可能性を秘めています
今回ご紹介するformula
そこで今回ご紹介したいが where
と format_map
です
今回紹介するformulaを使用したレシピ
4step目のlogへFormulaとして直接記述しています。
これ1つで「出力条件」と「出力したい文字列」をそれぞれ定義しています。
今回紹介するformulaを使用したレシピの実行結果
ループ処理を用いたレシピと同じデータが出力されています
ポイント
処理の実行には順序があり、 1の処理が実行された後に2の処理が実行されます。
今回のサンプルだと
- whereで条件の確認とフィルタが実行されます
- 条件の判定で偽となった行はここで処理が終わって次の行へ処理が移動します
- format_mapで文字列を生成し次の行へ処理が移動します
それぞれの説明
where
Listから 「quantityが10を超えるものだけを取得」 として使用しています。
docsから引用しますが条件式は一般的なものが使用できます
ここではシンプルな紹介にしていますが、複合条件や正規表現を使用したパターンマッチにも対応しているのである程度複雑な表現できます
format_map
docsの冒頭を引用すると
与えられたハッシュの配列の各行を整形して、文字列の配列を作り出します。作り出した文字列に静的なテキストを追加することもできます。フィールドは %{ <field_name> } という形式で表現します。
と書いてあります。
あらかじめ定義していた文字列へ取得してきた値をいい感じに埋め込んでくれる処理。という理解で良いと思います。
今回のサンプルだと name: %{name}, quantity:%{quantity}
という文字列を定義していて、%{name}
と%{quantity}
へ取得できた値を埋め込んで出力できた。というものになります。
whereの条件を変えてみる
10以上
where("quantity >=": 10)
としてみます。期待する結果はquantityが10の行も含んでlogに2行出力されることです
実行結果
期待通り2行出力されました。
100を超える
where("quantity >": 100)
としてみます。期待する結果はquantityが100の行も含まずに0行が出力されることです。
出力する値が無くてもエラーにならず正常終了していることも重要なポイントです
実行結果
期待通り出力する値はない状態で正常終了しました。
formulaを使用することでList型のデータを使用するときでもループ処理を使用せずに実現することができてformulaは便利でした。
今回はこれで終わりです。
Discussion