2017年1月20日金曜日

LogicFlow における式の書き方

LogicFlow を作成するうえで、値を編集したり、部分的に使いたいなどといったことをやりたくなるのは結構あります。その際には各種関数を用いてやりくりするのですが、そこを含めて書き方についてあまりわかりやすい資料がみあたらなかったのもあり、自分用にまとめてみました。

1.式の書き方と演算子

LogicFlow で提供されている関数は @ を先頭につけることで呼び出されます。ただし、複数の関数をネストさせるような場合は、最初の関数にのみ @ をつけ内部に含まれる関数には @ をつけません。

ex) @string(@rand(0, 10))  → @string(rand(0,10))

また、関数の結果を文字列としたい場合、{}でくくることで string 関数を用いなくても文字列に変換できます。

ex) @string(rand(0, 10)) = @{rand(0,10)}

またプロパティや子要素を参照する際には . で結合した書き方を行いますが、その際に参照できる要素がない場合には、実行時例外となってしまい LogicFlow が終了してしまいます。それを回避するための演算子として ? 演算子が用意されています。

ex) 値に subject 要素がない場合 @item().subject は実行時例外だが、@item()?.subject は OK

?演算子を用いた場合に、参照した要素がない場合は Null を返却します。そのためそのまま利用しようとした場合にはいろいろと問題があるケースが多いので、指定したものが Null だった場合に別の値を返却する coalesce 関数と合わせて使うことが多くなります。

ex) @coalesce(item()?.subject, ‘Nullの時の値’)

配列を扱う場合は[]で配列の要素を指定することができます。

ex) @triggerbody()[0].subject = トリガから渡された値の [0] 番目要素がもつ subject の値を参照する

JSON で配列を渡された場合などで、hogehoge[0] などと指定して利用することになると思います。また、この場合は ForEach コネクタを利用して、配列の要素すべてに対しての処理を行うことも可能です。その場合、ForEach コネクタ内部で @item() という関数を利用して、繰り返し対象となる要素を参照できます。

2.関数が返す値

LogicFlow で用意されている関数から戻される値は、大きく分けると

  • 文字列
  • 数値
  • true / false
  • 配列
  • オブジェクト

になります。文字列や数値を戻すものは、そのものずばりですのであまり気にしないでしょう。配列についても同様です。true/false は、例えば empty 関数のように、「空かどうか」を true(空です)か false(空でない)を戻すものです。

image

image

上記は If コネクタによる条件判断を行った場合の結果です。equals 関数で、empty 関数の結果が「true」かどうかを判断しています。この場合、empty 関数は false を戻しており、equals 関数も true ではないということで、結果として false を戻しています。

次に配列やオブジェクトを返却する場合ですが、以下のようにしてみるとわかります。

image

最初に json 関数を用いて、文字列を JSON に変換しています。この部分を実行すると、次のように値が戻されます。

image

json 関数の結果として、JSON なオブジェクトが戻されているのがわかります。この場合は、JSON で配列という結果になっていますので、直接 val1 や val2 という値を利用することはできません。[]による何番目の値かを指定したうえで、val1 等の値を参照することができます。

ex) @json(~)[0].val1 = json 関数の結果から、最初の配列の値にある val1

配列を戻す関数の場合は、上記のような JSON ではなく、配列そのものが戻されてきます。

image

配列を作成する createarray 関数を利用してみた場合の結果が以下のようになります。

image

先ほどの JSON 値と異なり、配列として値が戻されているのがわかります。

もう一つの例として、XML を扱う場合を見てみます。

image

最初に xml 関数を用いて、文字列を xml オブジェクトに変換し、その結果から xpath 関数で条件に見合った要素の値を文字列として取得しています。

image

最初の 作成_3 コネクタでの結果は、JSON でも配列でもない xml オブジェクトなので、上記のように BASE64 エンコードされた状態で LogicFlow へと渡されます。LogicFlow 上で利用する場合には、自動でデコードされるので気にしなくてよいところですが、挙動としてこういうものになります。

次の 作成_4 コネクタでは xpath 関数を利用して、値を抽出しています。ここでの戻る値は次のようになっています。

image

xpath 関数で抽出した値を文字列としたため、このようにオブジェクトではなく、文字列での結果だけが戻されているのがわかります。ここで xpath に指定している string を外すと、結果は xml のオブジェクトになりますので、作成_3 の時のように BASE64 でエンコードされた値がここに表示されることになります。

このあたりを押さえておくことで、どういう風に書けばいいのかな、と悩むことも少しは減るのではないでしょうか。

0 件のコメント:

コメントを投稿