イテレータを使用した複数のオブジェクトへのルールの適用
イテレータを使用して、コンフィギュレータ・モデルの複数のオブジェクトにルールを適用します。
- ノード内の参加者間の関係を表します。
- これらのオプションに同じ属性がある場合、オプション機能の異なるオプションにルールを適用します。
- これらの子に同じ属性がある場合、オプション区分の異なる子にルールを適用します。
- ノードの属性を使用して、ルールに参加者を指定します。 これは、モデルの構造またはモデルの属性を頻繁に変更する場合に、一貫性のあるルール・セットを適用するのに役立ちます。
- 参加者の組合せ間の関係を表します。
イテレータ文でローカル変数を使用して、1つ以上の制約を反復できます。
これらのキーワードを使用します。
- FOR ALL IN
- WHERE
複数のイテレータを使用
ADD TO文を使用する例を考えてみます。 機能xのUDA2属性の値が機能yのUDA2属性と等しい場合、Oracle Configuratorでは、xの数値を使用して、xおよびyのすべてのオプションについてyの値を設定します。
ADD &var1 TO &var2
FOR ALL &var1 IN {OptionsOf(x)}, &var2 IN {OptionsOf(y)}
WHERE &var1.userAttrs["UDA2"] = &var2.userAttrs["UDA2"];
別の例については、「オプションの互換性を確認」を参照してください。
For All、InおよびWhereキーワードの使用
イテレータ文では、FOR ALL、INおよびWHEREキーワードを使用できます。
キーワード | 説明 |
---|---|
FOR ALL IN |
イテレータ文の2つの句を開始するには、次のキーワードを使用します:
|
WHERE |
このキーワードを使用して、WHEREと一致しない反復を削除する必要がある場合に、イテレータ文の句を開始します:
|
次に、1つのオプションdについて、結果が3つの値a、bおよびcを提供する例を示します。
ADD &var TO d
FOR ALL &var IN {a, b, c};
次に別の例を示します:
ADD &var.userAttrs["AG_name.NumAttr"]+ 10 TO d
FOR ALL &var IN {OptionsOf(a)}
WHERE &var.userAttrs["AG_name.UDA3"] < 5;
ノート
a
オプション・クラスのUDA3属性に5未満の値が含まれている場合、結果には、オプション・クラスa
に子があるのと同じ数の値が数値機能d
に提供されます。- 結果には、WHERE句で指定した条件に子が存在する値のみが含まれます。
- この例では、コレクションを囲む中カッコ({})のセットを使用します。 コレクションは
OptionsOf(a)
です。
どちらの例でも、コンフィギュレータは、各文を明示的に繰り返すことなく、1つの文を1つ以上の制約またはコントリビューションに拡張します。 値を累計する文の左側でイテレータ変数を使用することもできます。
COLLECT演算子の使用
COLLECT演算子はイテレータ文で使用できます。
- Min(...)、Max(...)、Sum(...)、AnyTrue(...)などの値を集計するファンクションを使用して、値の集合をオペランドとして受け入れます。
- COLLECTを使用して、コンフィギュレータが集計機能に送信するコレクションの値の範囲を指定します。 多くの場合、FOR ALLを使用してこの目的を達成することもできます。
- COLLECTを複合式およびWHERE句とともに使用して、コレクションが値の範囲のソースとして使用する要素をフィルタで除外できます。
- COLLECTはコレクションを返す演算子であるため、コレクション・リテラル内で使用できます。 コンフィギュレータは、コレクション・リテラルをフラット化して、各コレクションを連結できるようにします。
- COLLECTではイテレータを1つのみ使用できます。
- COLLECTを使用して動的変数をIN句またはWHERE句に配置することはできません。これらの句で動的変数を使用することは、不明なコレクションであり、ルールをテストするときに問題が発生する可能性があるためです。
COLLECT演算子と、単一の値を持つFOR ALLイテレータを使用する例を次に示します。 この値には、a
オプション機能の子のコレクションの最大値が含まれます。
ADD Max({COLLECT &var FOR ALL &var IN {OptionsOf(a)}}) TO d;
次に、同じ結果を持つ別の例を示します。
ADD Max &var TO d
FOR ALL &var IN {OptionsOf(a)} ;
集計する値を制限する必要がある場合は、COLLECTを使用する必要があります。 例の検討:
CONSTRAIN &varA IMPLIES model.optionClass.item
FOR ALL &varA IN {Option11, Option32, OptionsOf(optionFeature1)}
WHERE &varA.userAttrs["UDA1"] = 5;
FOR ALL句およびWHERE句を反復するたびに、UDA1属性を含まない{Option11, Option32, OptionsOf(Feature1)}
コレクションのすべての要素でエラーが発生します。 COLLECT演算子を使用すると、エラーを回避できます。 たとえば:
CONSTRAIN &varA IMPLIES model.optionClass.item
FOR ALL &varA IN {Option11, Option32, {COLLECT &varB
FOR ALL &varB IN OptionsOf(optionFeature2)
WHERE &varB.userAttrs["UDA1"] = 5}};
DISTINCTを使用したCOLLECT演算子
COLLECT演算子をDISTINCTキーワードとともに使用して、属性から個別値を収集する例を次に示します。
AnyTrue({COLLECT &opt1
FOR ALL &opt1 IN {'optionClass3'.Options()}
WHERE &opt1.userAttrs["Physical.Shape"] = &shape})
EXCLUDES
AnyTrue({COLLECT &opt2
FOR ALL &opt2 IN {'optionClass3'.Options()}
WHERE &opt2.userAttrs["Physical.Shape"] <> &shape})
FOR ALL &shape IN
{COLLECT DISTINCT &node.userAttrs["Physical.Shape"]
FOR ALL &node IN 'optionClass3'.Options()}
この例では、ユーザーは、optionClass3オプション・クラスからShape属性に異なる値を持つオプションを選択できません。optionClass3は、Minimum Quantity属性にゼロの値を持ち、Maximum Quantity属性に制限はありません。