機械翻訳について

イテレータを使用した複数のオブジェクトへのルールの適用

イテレータを使用して、コンフィギュレータ・モデルの複数のオブジェクトにルールを適用します。

  • ノード内の参加者間の関係を表します。
  • これらのオプションに同じ属性がある場合、オプション機能の異なるオプションにルールを適用します。
  • これらの子に同じ属性がある場合、オプション区分の異なる子にルールを適用します。
  • ノードの属性を使用して、ルールに参加者を指定します。 これは、モデルの構造またはモデルの属性を頻繁に変更する場合に、一貫性のあるルール・セットを適用するのに役立ちます。
  • 参加者の組合せ間の関係を表します。

イテレータ文でローカル変数を使用して、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つの句を開始するには、次のキーワードを使用します:

  • INキーワードを使用して、反復に使用するソースを指定します。
  • IN句には、リテラル・コレクションまたはモデル・ノードのコレクション(OptionsOfなど)のみを含めることができます。
  • モデルのすべてのインスタンスで同じ反復が使用されます。
WHERE

このキーワードを使用して、WHEREと一致しない反復を削除する必要がある場合に、イテレータ文の句を開始します:

  • WHERE句の条件式はstaticである必要があります。
  • WHERE句およびIN句でCOLLECT操作を使用する場合、オペランドは静的である必要があります。
  • コンフィギュレータは、コードの最上部から始まる各互換文を評価し、次に下に移動します。 最初のルール、次に2番目のルールなどが評価されます。 式のAND演算子またはOR演算子に従って優先順位を付けたり、優先順位を付けたりしません。

次に、1つのオプションdについて、結果が3つの値abおよび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属性に制限はありません。