DroolsでFulfillmentオブジェクトを生成しようとしているオブジェクトグラフがあります。具体的には、フルフィルメントオブジェクトは、満たされている、または満たされていないルールを表します。私のオブジェクトグラフは次のようになります。
Users ---> many Requirements --> Event
`--> many Records ----^
レコードが両方とも同じイベントを指している場合、レコードは要件を満たすことができます。これにより、DroolsでFulfillmentオブジェクトが生成されます。
フルフィルメントを生成するための削減ルールは次のとおりです。
rule "fulfils"
when
$u : User()
$rec : Record() from $u.records
$r : Requirement(event contains $rec.event) from $u.requirements
then
insertLogical( new Fulfillment($u, $rec, $r, true));
System.out.println("Inserting logical");
end
rule "unfulfils"
when
$u : User()
$rec : Record() from $u.records
$r : Requirement(event not contains $rec.event) from $u.requirements
then
insertLogical( new Fulfillment($u, $rec, $r, false));
System.out.println("Inserting logical");
end
query "fulfillment"
$fulfillment : Fulfillment()
end
ここで遭遇する問題は、ユーザーにレコードがない場合、要件にフルフィルメントが挿入されていないことです。これは、グラフを満たすために検索するRecord()がないためだと思います。
ゼロ以上の存在を必要とせずにレコードを使用する方法はありますか?
また、真と偽の両方のフルフィルメントを挿入するには、ここに2つのルールが必要ですか、それともこれを行うためのより良い方法がありますか?
編集
これらのルールで私が直面しているもう1つの問題はRequirement(event contains $rec.event)
、特定のイベントのコレクションを満たすレコードがあるかどうかを見つけるタスクを実行しないことです。多くのレコードの単一のイベントと単一の要件の複数のイベントの間に重複が存在するかどうかを確認するためのより良い方法はありますか?
別の編集
これが私が考えた別のアプローチです。要件とレコードのペアが見つからない場合にフルフィルメントを挿入する代わりに、一致する正のフルフィルメントがないすべての要件に対してロジックフルフィルメントを挿入しないのはなぜですか。
rule "unfulfils"
when
$u : User()
$r : Requirement() from $u.requirements
not(Fulfillment(user == $u, requirement == $r, fulfilled == true))
then
insertLogical( new Fulfillment($u, null, $r, false));
System.out.println("Inserting logical");
end
query "fulfillment"
$fulfillment : Fulfillment()
end
これにより、2つのコレクションの重複を比較する問題と、ユーザーにレコードがない場合が処理されます。(これに関するいくつかの検証をいただければ幸いです)。