2016-02-29 111 views
0

我是Drools(版本6.3)的新手,我有一些麻煩提出了一個特定的規則。我有一個名爲Steps的課程,只有一個簡單的字段double steps;。每一步事件代表採取自上次事件和 我有說,你需要得到移動時,你不這樣做在最後一小時 50步驟的工作規則的步驟:Drools融合規則語言:計步器規則

declare Steps 
    @role(event) 
end 

rule "STEPS RULE" 
when 
    $totalSteps : Number(doubleValue < 50) from accumulate(
     Steps(stepsCount : steps) over window:time(1h) from entry-point  
    "entrySteps", sum(stepsCount)) 

then 
    System.out.println("STEPS RULE: get moving!"); 
end 

現在改爲每事件是自上一次事件以來採取的步驟,我希望它們代表累積步驟。所以如果一個事件有50個步驟,你需要20個步驟,那麼我希望下一個事件有70個步驟。問題是我如何更改我的規則,以便它仍然有效?

+0

您需要澄清一下您的條款。如果'步驟'是一個傳入事件,它的數據是固定的 - 所以如果它包含50個步驟,就是這樣。你可以從一個序列中的兩個事件中派生出一些東西,這樣一個步驟中的50個和下一個中的20個會產生70個和,但這似乎不是你的問題。 – laune

回答

1

對於計步器,您需要另一個班級,與步驟不同,您的活動班級。更新你的計步器的規則很簡單。

rule "create pedometer" 
when 
    Steps($s: steps) 
    not Pedometer() 
then 
    insert(new Pedometer($s)); 
end 

rule "update pedometer" 
no-loop 
when 
    Steps($s: steps) 
    $p: Pedometer($r: readout) 
then 
    modify($p){ 
     setReadout($r + $s) 
    } 
end 

編輯如果步驟已經包含累積值,這是一個有點複雜,因爲你需要計算第一和窗口的最後一個計步器讀數之間的差異。

rule "ACC STEPS RULE" 
when 
    accumulate(Steps($s : steps) 
       over window:time(1h) from entry-point "entrySteps"; 
     $fst: min($s), $lst: max($s); 
     $lst - $fst < 50) 
then 
    System.out.println("STEPS RULE: get moving!"); 
end 

每小時或其他規則應至少有一個讀數檢測此情況。

+0

我想我們誤解了對方。我想要和以前一樣的規則。我擁有的新事件只是累積步驟。我只是將課程中的課程「步驟」的解釋更改爲步驟。所以現在我的事件1有50步,事件2有70步。這意味着自上次事件(事件1)以來已經採取了20個步驟。我想要相同的規則,所以如果你在一個小時內做了少於50步,規則就會觸發。 示例:事件1:20步 - > 30分鐘過去 - >事件2:40步 - > 35分鐘過去 - >事件3:45步 - >規則觸發。 – Tim

+1

現在通常更好地描述實際情況,而不是先詳細說明另一個情況,然後放大現實。 - 我已經更新了我的答案。 – laune