2017-08-05 15 views
0

ABのイベントを処理するDroolsルールセットを作成しています。多くのルールでは、Aの属性timestampと、そのイベントを修飾するためにBの属性windowStartのサブセットの最大値を比較する必要があります。 Bのそのサブセットが空のセットである場合、私はwindowStartが存在しないと仮定しているので、値0が望ましい。 AのうちtimestampwindowStartより大きいものはすべて対象となります。Drools:一致しない場合のクエリのデフォルト値

が推敲のために以下の擬似コード考えてみましょう。このような問合せなし

long findMaxWindowStartOrZero(int bID) 
{ 
    Set bSubset = getAllBWithID(bID); 
    if(bSubset is empty) return 0; 
    return max(bSubset, B::windowStart); 
} 

を、この比較に関わるすべてのルールのLHSは、かつてどのBの不在を説明するために、重複する必要があり、一度実際の最大値を見つけるために、サブセットが空でない場合

上記の疑似コードのようなクエリを使用すると、この作業が大幅に簡単になり、LHSを分岐する必要がなくなります。それは可能ですか?言及されたルールのLHSを分岐する代わりに、そのための欠点や利点がありますか?

答えて

0
rule qualify_A 
when 
    accumulate(B(id == "bID", $ws: windowStart); $mws: max($ws)) 
    $a: A(timestamp > $mws) 
then 
    ...process $a... 
end 

このルールは、一致するBsがない場合は発生しません。これを回避するには、windowStartを0に設定してBを挿入します。このダミーは、一致するBの値を定義するためにも使用できます。id

rule qualify_A 
when 
    B($id: id, windowStart == 0) // the dummy, defines id 
    accumulate(B(id == $id, $ws: windowStart); $mws: max($ws)) 
    $a: A(timestamp > $mws) 
then 
    ...process $a... 
end 
関連する問題