2017-08-05 92 views
0

我正在編寫一個Drools規則集處理事件,類型爲AB;並且在許多規則中,我需要將A的屬性timestampB的屬性windowStart的子集的最大值進行比較,以限定該A事件。如果B的子集是空集,我假定沒有windowStart,因此值0是需要的。任何A的與timestamp大於windowStart將符合資格。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 
相關問題