2011-01-10 3 views
2

小さなプロジェクトでDroolsを使用し始めましたが、今では複雑なルールを書く必要があります。それを行う最善の方法。リストから合計のパーセンテージ未満の数値プロパティを持つ要素をフィルタリングするDrools

私は同じタイプのオブジェクトのリストにこのルールを適用しています(このクラスには、numberOfExecutionsというフィールドがあります)。リストの各要素について、番号実行回数以上合計数値実行回数の5%(リスト内のすべての要素のnumberOfExecutionsの合計)を選択する必要があります。

これまでのところドループでこれを実装するいい方法は考えられませんでしたが、誰かに提案がありますか?

EDIT1: 私は今のところ考えて、私はルールを適用し、Droolsのルールにこの値は、何らかの形で利用できるようにする前にnumberOfExecutionsの合計をあらかじめ計算するためだった可能性が最もよいです。

答えて

1

解決方法は、新しいオブジェクトクラスを変更または作成する能力によって異なります。ここで私はあなたのケースでやると思いますものです:

rule "Rule 1" 
when 
    $m : MyObject(counted == false) 
    $c : Calculator 
then 
    modify($m) { setCounted(true); } 
    $c.count($m); 
end 

rule "Rule 2" 
when 
    not MyObject(counted == false) 
    $m : MyObject(numberOfExecutions > ($c.totalExecutions * 0.05)) 
    $c : Calculator 
then 
    $m.markBiggerThan5(); 
end 

私は無数のオブジェクト(Rule 1)をカウントする新しいCalculatorクラスを導入しました。 ご覧のとおり、Rule 2(あなたが求めているもの)は、すべてのオブジェクトがカウントされてマークされ、合計がCalculatorに格納されている場合にのみ発生します。

+0

ルール2がトリガーされたときに、すべてのオブジェクトが既にルール1をトリガーしていることを保証する必要がありますか?(したがって、totalExecutionsはすべての実行の合計になります) それにもかかわらず、私は書く必要があるこのようないくつかのルールを持っています。それぞれについて2つのルールを書かなければならないのは混乱するでしょう:/ –

+0

1.はい、ルール#2の最初の行は、 。 2つのルールのすべてを1つのルールにすることも可能です(LHSで 'accumulate'を参照)。ただし、読み込みが遅く、スプレッドシートをExcelに変換できません。 – Osw

0

"Java" Rule Dialectを使用できます。 numberOfExecutionsのロジックを実行し、適切なフラグを設定する関数を作成します。 numberOfExecutions条件をチェックするために、オブジェクトのリストまたはオブジェクトを1つずつ渡すことができます。このメソッドは、通常のJavaメソッドとして動作します。以下は関数を呼び出すための小さなサンプルです。それは助けるかもしれない。

rule "numberOfExecutions " 
    dialect "java" 
    salience -1 

    when 

     $obj : yourObject()  
     eval(if not counted) 

    then   
     checkNumberOfExecution($obj); 

end 

function void checkNumberOfExecution(com.test.YourObject obj) { 

     //Your logic 
} 

単なるヒントです。あなたは好きなように使うことができます。

ありがとうございました。

+0

あなたの提案をありがとうが、このようなルールを書こうと私はむしろdroolsの使用をやめ、javaのすべてを書きます。とにかくありがとうございました。 –

関連する問題