アサーション は、ビジネス ルール エンジンの作業メモリにオブジェクト インスタンスを追加するプロセスです。 エンジンは、match-conflict resolution-action フェーズを使用して、インスタンスの種類に対して書き込まれた条件とアクションに従って各インスタンスを処理します。
次のトピックでは、さまざまなファクトの種類に Assert 関数を 使用した結果として発生する動作について説明します。
.NET オブジェクト
各オブジェクトは、個別のインスタンスとして作業メモリにアサートされます。 つまり、インスタンスは、オブジェクトの型 (IF Object.Property = 1 など) を参照する各述語によって分析されます。 また、ルールの条件の結果に応じて、型を参照するルール アクションでも使用できます。
下記の例を検討してください。
ルール 1
IF A.Value = 1
THEN A.Status = "good"
ルール 2
IF B.Value = 1
THEN A.Status = "good"
ルール 1 では、値が 1 の A のインスタンスのみが Status プロパティを更新します。 ただし、ルール 2 では、条件が true に評価されると、A のすべてのインスタンスの状態が更新されます。 実際、B のインスタンスが複数存在する場合、A インスタンスは、B インスタンスの条件が true に評価されるたびに更新されます。
ルール内から .NET オブジェクトをアサートするには、組み込みの Assert 関数をルール アクションとして追加します。 ルール エンジンには CreateObject 関数がありますが、ビジネス ルールコンポーザーでは別の関数として表示されないことに注意してください。 その呼び出しは、作成するオブジェクトのコンストラクター メソッドを Facts Explorer の .NET クラス ビューから操作ウィンドウにドラッグすることによって構築されます。 次に、ビジネス ルールコンポーザーは、コンストラクター メソッドをルール定義の CreateObject 呼び出しに変換します。
型付きXmlドキュメント
TypedXmlDocument がアサートされると、ビジネス ルール エンジンは、ルールで定義されているセレクターに基づいて子 TypedXmlDocument インスタンスを作成します。
セレクターとフィールドはどちらも XPath 式です。 セレクターは XML ドキュメントのノードを分離する方法と考え、フィールドはセレクター内の特定の項目を識別する方法と考えることができます。 1 つのセレクター内のすべてのフィールドは、エンジンによってオブジェクトとしてグループ化されます。 ファクト エクスプローラーの [ XML スキーマ ] タブでノードを選択すると、ビジネス ルールコンポーザーはすべてのノードの XPath Selector プロパティと、子ノードを含まないノードの XPath Field プロパティを自動的に入力します。 または、必要に応じて、[XPath セレクター] と [XPath フィールド] に独自の XPath 式を入力できます。
セレクターが XML ドキュメントの複数の部分と一致する場合、この型の複数のオブジェクトは、ルール エンジンの作業メモリにアサートされるか、または取り消されます。 次の XML があるとします。
<root>
<order customer="Joe">
<item name="router" quantity="10" cost="550" />
<item name="switch" quantity="3" cost="300" />
</order>
<order customer="Jane">
<item name="switch" quantity="1" cost="300" />
<item name="cable" quantity="23" cost="9.99" />
</order>
</root>
セレクター /root/order (または //order) を使用すると、2 つのオブジェクトが作業メモリに追加されます。
1)
<order customer="Joe">
<item name="router" quantity="10" cost="550" />
<item name="switch" quantity="3" cost="300" />
</order>
2)
<order customer="Jane">
<item name="switch" quantity="1" cost="300" />
<item name="cable" quantity="23" cost="9.99" />
</order>
各セレクター内では、個々のフィールドは XPath によって参照されます。
セレクター /root/order/item (または (//order/item または //item) を使用すると、ルール エンジンの作業メモリに 4 つのオブジェクト (Joe の 2 つの項目と Jane の 2 つの項目) が追加されます。
<root>
<order customer="Joe">
</order>
<order customer="Jane">
</order>
</root>
各オブジェクトは、@name、 @quantity、 @costの 3 つのフィールドにアクセスできます。 オブジェクトは元の文書への参照であるため、親フィールドを参照できます (例: "../@customer")。
同じドキュメント内でも、複数のセレクターを使用することができます。 これにより、ドキュメントのさまざまな部分を表示できます (たとえば、あるセクションが注文で、別のセクションに配送先住所が含まれている場合など)。 ただし、作成されるオブジェクトは、作成した XPath 文字列によって定義されていることに注意してください。 別の XPath 式を使用すると、同じノードに解決される場合でも、一意の TypedXmlDocument になります。
ルール エンジンでは、基本的な .NET スカラー型と、参照型のオブジェクトがネイティブでサポートされています。 XML ドキュメントは基本的にテキストですが、ルールの作成時に指定された型に基づいて、フィールド値は任意の型にすることができます。 また、フィールドは XPath 式であるため、ノードセットを返す場合があります。この場合、セット内の最初の項目が値として使用されます。
ルール エンジンでは、バックグラウンドで XmlConvert 関数を使用して、テキスト フィールド値をサポートされている任意の型に変換できます。 これを指定するには、ビジネス ルール作成ツールで種類を設定します。 変換できない場合は、例外がスローされます。 ブール型と double 型は、それぞれの型、文字列、またはオブジェクトとしてのみ取得できます。
型付きデータテーブル
TypedDataTable がアサートされると、DataTable に含まれるすべての DataRow が自動的に TypedDataRows としてエンジンにアサートされます。 テーブルまたはテーブルの列をルール引数として使用すると、式は TypedDataTable ではなく個々の TypedDataRows に対して評価されます。
たとえば、"Customers" テーブルに対して次の規則が作成されたとします。
IF Northwind.Customers.CustomerID = 001
THEN Northwind.Customers.ContactTitle = "Purchasing Manager"
注
データベース テーブルに対してルールを作成するには、データベース バインドの種類として データ テーブル/行 を使用する必要があります。
(TypedDataTable として) 3 つの DataRow を持つ次の DataTable をエンジンにアサートするとします。
顧客ID | 連絡先の肩書き |
---|---|
001 | サプライ・クラーク |
002 | サプライ・クラーク |
003 | サプライ・クラーク |
エンジンは、001、002、003 の 3 つの TypedDataRows を挿入します。
各 TypedDataRow は、ルールに対して個別に評価されます。 最初 の TypedDataRow はルールの条件を満たし、2 番目の 2 つ目は失敗します。 結果は次のようになります。
顧客ID | 連絡先の肩書き |
---|---|
001 | 購入マネージャー |
002 | サプライ・クラーク |
003 | サプライ・クラーク |
注
TypedDataRows は、エンジンに直接アサートすることもできます。 これらは、前に説明したのと同じ方法で処理されます。
DataSetName.DataTableName は一意の識別子と見なされます。 したがって、2 つ目 の TypedDataTable が同じ DataSet 名と DataTable 名でアサートされている場合は、最初の TypedDataTable よりも優先されます。 最初の TypedDataTable に関連付けられているすべての TypedDataRow が取り消され、2番目の TypedDataTable が宣言されます。
DataConnection
TypedDataTable と同様に、ビジネス ルールコンポーザーでテーブルまたは列をルール引数としてドラッグすると、DataConnection 自体とは対照的に、返された TypedDataRowに対して作成されたルールが生成されます。
次の規則が作成され、DataConnection に Northwind.Customers への SqlConnection を含むことをアサートするとします。
IF Northwind.Customers.CustomerID = 001
THEN Northwind.Customers.ContactTitle = "Purchasing Manager"
エンジンは、 TypedDataTable セクションで使用されるルールを評価すると、次のようなクエリを動的に作成します。
SELECT *
FROM Northwind.Customers
WHERE CustomerID = 1
この条件を満たすのはデータベース内の 1 つの行のみであるため、さらに処理するために 1 つの TypedDataRow のみが作成され、エンジンにアサートされます。
アサートされたエンティティとインスタンスの種類の概要
次の表は、さまざまな型のアサート動作をまとめたものです。各アサート エンティティのエンジンで作成されたインスタンスの数と、それらを識別するために各インスタンスに適用される型を示します。
エンティティ | アサートされたインスタンスの数 | インスタンスの種類 |
---|---|---|
.NET オブジェクト | 1 (オブジェクト自体) | 完全修飾 .NET クラス |
型付きXmlドキュメント | 1-N TypedXmlDocument: セレクターバインディングとドキュメントコンテンツに基づいて作成される | ドキュメントタイプ.セレクタ |
型付きデータテーブル | 1-N TypedDataRow(型付きデータ行) DataTable 内の DataRow ごとに 1 つ |
DataSetName.DataTableName |
TypedDataRow | 1 (TypedDataRow が主張された) | DataSetName.DataTableName |
DataConnection | 1 ~ N (DataConnection のクエリによって返される TypedDataRow ごとに 1 つ) | DataSetName.DataTableName |