流口水融合规则语言:计步器规则



我是Drools(6.3版)的新手,在想出特定规则时遇到了一些麻烦。我有一个名为步骤的类,只有一个简单的字段double steps;。每个步骤事件表示自上一个事件以来执行的步骤,并且我有一个工作规则,说当你不这样做时,你需要开始行动过去一小时内 50 步:

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 个步骤。问题是我该怎么做更改我的规则,使其仍然有效?

对于计步器,您需要另一个类,与事件类 Steps(步数)不同。更新计步器的规则很简单。

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

每小时至少应该有一个读数或另一个规则检测这种情况。

最新更新