コレクション変数をサポートする式

式の評価のために渡した入力変数は、反復でもそうでなくても構いません。反復変数の場合は、式は変数ごとに一回だけ評価されます。式の結果はコレクションとして返されます。反復レベルの異なる複数の入力変数が混在していても構いません。例えば、文字列のリストと、文字列のリストのリストとを混在させることもできます。コレクション階層の深さの違いに対処するため、Expression Manager はこれらのコレクション変数をフラット化して二次元配列に展開します。この二次元配列のそれぞれの行が、式を評価するために必要な入力パラメーターを表します。式は行ごとに評価され、入力変数の階層に従って結果が格納されます。

式の評価に使用されるすべてのコレクション変数は、単一の階層に属します。ルート要素から最も深いコレクション変数へのパスを調べると、すべてのコレクション変数がこのパスに該当しています。反復性のない変数の場合、そのような制限はありません。入力変数のいずれかのインスタンスが null であった場合、そのインスタンスに対する結果は null に設定されます。他のインスタンスに対する式の評価は通常どおりに行われます。レベルとインデックスに関係なく、すべての変数には、同じ数の要素が格納されます。特定のレベルの要素が変数に存在しない場合、そのレベルでは変数の比較は実行されません。

次のスキーマは、顧客(customer)と口座(account)を表します。

bank 
    *customer 
        age 
        *account 
            baseInterestRate 
            actualInterestRate

この例では、bank、customer および account は複合要素です。customer と account は反復性の要素です。age は int 型で、baseInterestRate と actualInterestRate は float 型です。銀行は多数の顧客を抱え、それぞれの顧客が複数の口座(account)を保有することができます。各口座には、基準金利と実質金利があります。実質金利は計算される要素であり、基準金利と顧客の年齢に依存します。acualInterestRate が、baseInterestRate + (age >= 60 ? 0.5:0.0) という式で決められているとします。実行時、Expression Manager には、age と baseInterestRate に関して次の値が渡されます。

age: [20, 61] 
baseInterestRate: [[7, 8][7.5, 8, 8.5]]

これらの変数をフラット化した後で、次の二次元配列が作成されます。

20 7 
20 8 
61 7.5 
61 8 
61 8.5

age 要素は、baseInterestRates の要素数に従って複数回反復されます。それぞれの行について式が評価されます。式の評価後、その結果が、入力変数 baseInterestRate と同じ階層に格納されます。式は常に最も深いレベルを基準とし、その階層よりも深いレベルの変数が使用されることはありません。そのため、反復レベル数の最も多い変数が尊重されます。API からは、[[7, 8][8, 8.5, 9]] が結果として返されます。