2017-11-09 3 views
0

2つ以上のメモリにBMSContractオブジェクトのコレクションがある場合、BMSContract.statusフィールドを使用して特定のパターンに一致させる必要があります。私のルールは、そのようなコレクション内で、正確に1つだけ、BMSContractのステータスがACTIVEの場合に成功に解決されるはずです。オブジェクトとステータスコードの他の組み合わせは、失敗に解決されるはずです。繰り返しますが、このルールは2つ以上のオブジェクトのコレクションのみであり、それらの数は2つ、5つ、10つ、15つまたはそれ以上である可能性があります。単一のBMSContractレコードを管理するルールは、わずかに異なります。これらのルールは、ちょうどこのような複数のレコードのシナリオに固有のものです:Drools 5で同じ種類の複数のオブジェクトにどのように一致させることができますか?

Case1 - Success 
BMSContract(status=ACTIVE) 
BMSContract(status=PENDING) 
Reason: only one Active in the collection 

Case2 - Success 
BMSContract(status=ACTIVE) 
BMSContract(status=PENDING) 
BMSContract(status=HOLD) 
Reason: only one Active in the coll 

Case3 - Success 
BMSContract(status=ACTIVE) 
BMSContract(status=PENDING) 
BMSContract(status=HOLD) 
BMSContract(status=CANCEL) 
Reason: only one Active in the coll 

Case4 - Failure 
BMSContract(status=ACTIVE) 
BMSContract(status=ACTIVE) 
Reason: too many Active records in coll 

Case5 - Failure 
BMSContract(status=ACTIVE) 
BMSContract(status=ACTIVE) 
BMSContract(status=ACTIVE) 
Reason: too many Active records in coll 

Case6 - Failure 
BMSContract(status=ACTIVE) 
BMSContract(status=ACTIVE) 
BMSContract(status=ACTIVE) 
BMSContract(status=ACTIVE) 
BMSContract(status=ACTIVE) 
Reason: too many Active records in coll 

Case7 - Failure 
BMSContract(status=PENDING) 
BMSContract(status=HOLD) 
BMSContract(status=OTHER) 
Reason: No Active records in coll 

答えて

0

あなたがBMSContract事実の数を持っていることを考えると、次のルールは十分だろう。

rule OK 
when 
    $ac: BMSContract(status == "ACTIVE") 
    not BMSContract(this != $ac, status == "ACTIVE") 
then 
    // there is exactly one ACTIVE 
end 

rule not_OK_1 
when 
    not BMSContract(status == "ACTIVE") 
then 
    // there is no ACTIVE 
end 

rule not_OK_2 
when 
    $ac: BMSContract(status == "ACTIVE") 
    exists BMSContract(this != $ac, status == "ACTIVE") 
then 
    // there is more than one ACTIVE 
end 

バリアント可能であり、5月あなたがトラブルを起こした事実を確認する必要がある場合に必要なこと:

rule not_OK_2a 
when 
    $ac1: BMSContract(status == "ACTIVE") 
    $ac2: BMSContract(this != $ac, status == "ACTIVE") 
then 
    // log and retract $ac2 
end 
+0

Q1:この構文を理解していない:ないBMSContract(!この= $ AC、ステータス== "ACTIVE")Q2:私はBMSContraを主張すべきctオブジェクトを個別のオブジェクトとして、またはコレクションとして作業メモリに追加する – JamesD

+0

CE '否定'は、否定された存在量限定子∄の構文です。 - すべての 'BMSContract'オブジェクトを個々の事実として挿入しないと、' List 'を持つコンテナを用意し、各パターンのリストを展開するために' from'を使う必要があるので、問題は複雑です。理由があるのでなければ、私はこれをすることをお勧めしません。 – laune

+0

私はまだこれを意味しません:this!= $ ac。これは何ですか= $ ACは意味しますか?このインスタンスが$ ac変数にバインドされたインスタンスと同じではないことを意味しますか? – JamesD

関連する問題