2016-03-15 60 views
0

我有多个使用每个发送计步器数据的传感器。我有,基于MACADDRESS规则文件,触发规则:Drools只为插入的事件规则火灾

declare Steps 
    @role(event) 
end 

declare User 
    @role(fact) 
end 

rule "MAC" 
when 
    User($mac: macAddress) from entry-point "entrySteps" 
then end 

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

我的用户刚刚场macAddress和步骤事件有以下字段:

double steps; 
Date timeStamp; 
String macAddress; 

现在,当我插入事件然后为每个 macAddress,如果具有该macAddress的用户在最近一小时内的步数小于50,则该规则将触发。因此,如果满足此条件,则该规则将触发每个macAddress。 但我希望规则只能触发插入的Step事件的macAddress。我如何调整我的规则?

回答

1

奇怪的是,当只有一个用户并且没有该用户的步骤时,也会触发,即该窗口是空的。输出包含最小和最大double值 - 不确定这是否是Drools中的错误。

作为一种变通方法,加上累积计数的考验,也许更大的0或1,更大

accumulate(Steps($s : steps , macAddress == $mac) 
     over window:time(1h) from entry-point "entrySteps"; 
    $fst: min($s), $lst: max($s), $cnt: count($s); 
    $cnt > 0, $lst - $fst < 50) 
+0

@EstebanAliverti也许你可以添加评论确认或否认一个错误?解释这一点的文档参考也很好。 – laune