Drools Fusion规则语言:计步器规则

Drools Fusion rule language: pedometer rule

我是 Drools(6.3 版)的新手,我在想出特定规则时遇到了一些麻烦。我有一个名为 Steps 的 class,只有一个简单的字段 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 步。问题是我怎样才能 更改我的规则以使其仍然有效?

对于计步器,您需要另一个 class,不同于 Steps,您的活动 class。更新计步器的规则很简单。

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

编辑 如果 Steps 已经包含累加值,它会稍微复杂一些,因为您需要计算 window 中第一个和最后一个计步器读数之间的差异.

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

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