使用drools查找一小时内平均温度的百分比变化

时间:2014-01-03 06:49:25

标签: drools drools-fusion

我有一个用例,我有一股室温流。该流每分钟都读取温度。我想计算每小时的平均温度,如果这小时的平均温度超过最后一小时的平均温度5度,就会发出警报。

例如: 我的读数从下午1点到下午2点......我计算了这小时的平均温度。让我们说A. 我的读数是从下午2点到下午3点。我计算了这个小时的平均温度。让我们说B。 如果B-A >=5

,我需要发出警报

我无法为此提出DRL文件。谁可以帮我这个事。

1 个答案:

答案 0 :(得分:1)

这是应该以滑动的方式工作还是实际上每小时工作?我假设第一种情况,但对于第二种情况来说,它不应该太难以适应。该解决方案基于两个辅助对象,类是Average的一个子类OldAverage,另一个是子类NewAverage,需要预先插入。前两个规则是在前两个小时内建立的。

rule "during first hour"
when
    $avg: OldAverage( size < 60 )
    $r: Reading()
then
    modify( $avg ){ addReading( $r ) }  // add $r to List<Reading>
    retract ( $r );
end

rule "during second hour"
when
    $old: OldAverage( size == 60 )
    $new: NewAverage( size < 60 )
    $r: Reading()
then
    modify( $new ){ addReading( $r ) }
    retract ( $r );
end

从现在开始,必须将从NewAverage对象推出的Reading添加到OldAverage对象中。

rule "after two hours"
when
    $old: OldAverage( size == 60 )
    $new: NewAverage( size == 60 )
    $r: Reading()
then
    Reading r = $new.addReading( $r );  // addReading returns List.remove(0)
    modify( $old ){ addReading( r ) }
    update( $new );
    retract ( $r );
end

以下是检查规则:

rule "check for increase"
when
    $old: OldAverage( size == 60, $oldAvg: average )
    $new: NewAverage( size == 60, average > $oldAvg + 5 )
then
    System.out.println( "average temperature increased by more than 5 degrees" );
end