DataWeave での優先順位

DataWeave 式は特定の順序でコンパイルされます。1 つのレベルのコンパイル結果をより高いレベルの式の入力として使用することはできますが、より低いレベルの式の入力として使用することはできません。 開始する前に、Mule 4 アプリケーションでは DataWeave のバージョン 2.x が使用されることに注意してください。Mule 3 アプリケーションでの DataWeave については、​DataWeave バージョン 1.2 のドキュメント​を参照してください。 他の Mule バージョンの場合は、DataWeave の目次のバージョンセレクターを使用できます。

コンパイルの順序

次の表では、演算子と関数を、最初にコンパイルされるもの (1) から最後にコンパイルされるもの (10) への順に並べています。

レベル 演算子または関数

1

  • using​: DataWeave スクリプトでローカル変数を初期化するために使用。

  • このレベルの DataWeave 単項演算子:

    • .^​: スキーマセレクター。

    • .#​: 名前空間セレクター。

    • ..​: 子孫セレクター。

    • not​: 否定の論理演算子。

    • .@​: 全属性セレクター。オブジェクトの配列 ​{ "attr1": "foo", "attr2": "bar" }​ 内で入力ペイロード ​<root> <a attr1="foo" attr2="bar" /></root>​ の属性と値を返す式 ​payload.root.a.@​ を使用する場合などで使用。

2

  • as​: 型強制に使用。

3

  • *​: 乗算。

  • /​: 除算。

4

  • +​: 加算。

  • -​: 減算。

  • >>​: データを先頭に追加。

  • <<​: データを末尾に付加。

5

  • >​: 以上。

  • =​: 等しい。

  • <​: 以下。

  • <​: より小さい

  • >​: より大きい。

  • is​: 型を比較。​指定した XML 属性の削除​などで使用。

6

  • !=​: 等しくない。

  • ~=​: 含む。

  • ==​: 値の型が異なる場合、等価演算子は、1 つの値をもう 1 つの値の型に強制変換しようとします。

7

  • and​: and​ 論理演算子。

8

  • or​: or​ 論理演算子。

9

  • default​: デフォルト値の設定に使用。

  • case​ と ​else​: パターン一致に使用。

  • このレベルの DataWeave 関数:

    • matches

    • match

    • map

    • mapObject

    • groupBy

    • filter

  • このレベルの DataWeave バイナリセレクター:

    • .@keyName​ と ​.*@​: DataWeave バイナリ属性セレクター。

    • .*​: 複数値セレクター。

    • .^​: メタデータセレクター。

    • .&​: キー/値ペアセレクター

    • [?()]​: 絞り込みセレクター

  • .keyName​: 値セレクター。

  • [<index> to <index>]​: 範囲セレクター。

10

  • if else​: DataWeave でのフロー制御に使用する条件式。

チェーニングされた関数コールの順序

複数の関数がチェーニングによって 1 つにまとめられると、それらの関数はチェーンで指定された順序で最初の関数から最後の関数まで処理されます。

たとえば、次のスクリプトは、変数 ​flights​ によって定義された入力オブジェクトの配列に対して動作します。スクリプトは最初に 500 未満の ​price​ 値をすべて受け入れる配列を返す ​filter​ をコールします。次に、入力内のオブジェクトを ​price​ 値が低い順に並び替えた配列を返す ​orderBy​ をコールします。最後に、入力オブジェクト配列を ​toAirport​ 値のアルファベット順にグループ化する ​groupBy​ をコールします。

DataWeave スクリプト:
%dw 2.0
output application/json
var flights = [
  { "toAirport": "SFO", "price": 550, "airline": "American" },
  { "toAirport": "MUA", "price": 200, "airline": "American" },
  { "toAirport": "SFO", "price": 300, "airline": "American" },
  { "toAirport": "CLE", "price": 600, "airline": "American" },
  { "toAirport": "CLE", "price": 190, "airline": "American" },
  { "toAirport": "SFO", "price": 400, "airline": "American" }
]
---
flights filter $.price < 500 orderBy $.price groupBy $.toAirport

結果は、キー-値ペアのコレクションを含むオブジェクトになります。

出力:
{
  "CLE": [
    {
      "toAirport": "CLE",
      "price": 190,
      "airline": "American"
    }
  ],
  "SFO": [
    {
      "toAirport": "SFO",
      "price": 300,
      "airline": "United"
    },
    {
      "toAirport": "SFO",
      "price": 400,
      "airline": "American"
    }
  ],
  "MUA": [
    {
      "toAirport": "MUA",
      "price": 200,
      "airline": "American"
    }
  ]
}

DataWeave 式に括弧 ​(​ および ​)​ を挿入することで、評価の順序を指定できます。次の例は、前の例と同じ出力を返します。

DataWeave スクリプト:
%dw 2.0
output application/json
var flights = [
  { "toAirport": "SFO", "price": 550, "airline": "American" },
  { "toAirport": "MUA", "price": 200, "airline": "American" },
  { "toAirport": "SFO", "price": 300, "airline": "American" },
  { "toAirport": "CLE", "price": 600, "airline": "American" },
  { "toAirport": "CLE", "price": 190, "airline": "American" },
  { "toAirport": "SFO", "price": 400, "airline": "American" }
]
---
( ( ( flights filter $.price < 500 ) orderBy $.price ) groupBy $.toAirport )

結果は、キー-値ペアのコレクションを含むオブジェクトになります。

出力:
{
  "CLE": [
    {
      "toAirport": "CLE",
      "price": 190,
      "airline": "American"
    }
  ],
  "SFO": [
    {
      "toAirport": "SFO",
      "price": 300,
      "airline": "United"
    },
    {
      "toAirport": "SFO",
      "price": 400,
      "airline": "American"
    }
  ],
  "MUA": [
    {
      "toAirport": "MUA",
      "price": 200,
      "airline": "American"
    }
  ]
}

関数コールの順序は重要です。たとえば、順序を変更した式 ​flights groupBy $.toAirport filter $.price < 500 orderBy $.price​ は、エラーを返します。これは、​groupBy​ はオブジェクトを返し、​filter​ は配列を想定しているためです。結果のエラーは ​Expecting Type: Array>T<, but got: {String: Array<{|toA…​ airline: String|}>}​ となります。