最新的n个事件,匹配某种模式

时间:2015-07-06 09:38:38

标签: drools

Drools中是否有内置功能,选择最新的n个事件,匹配某个模式?我已经阅读了文档中的滑动长度窗口,而股票刻度示例似乎正是我想要的: “例如,如果用户想要仅考虑最后10个RHT股票定时器,无论它们的年龄多大,模式将如下所示:”

StockTick( company == "RHT" ) over window:length( 10 )

在测试示例时,在我看来它的评估更像是

StockTick( company == "RHT" ) from StockTick() over window:length( 10 )

选择最新的10个StockTick事件,然后按公司==“RTH”过滤它们,产生0到10个RHT-Ticks,尽管该流包含超过10个RTH事件。

解决方法类似于:

$tick : StockTick( company == "RHT" )
accumulate(
    $other : StockTick(this after $tick, company == "RHT" );
    $cnt : count(other);
    $cnt < 10)

性能和可读性差。

1 个答案:

答案 0 :(得分:0)

您很可能会看到一个初始阶段,其中窗口中的事件计数并且根据约束尚未达到window:length中指定的长度。例如,

rule "Your First Rule"
when
accumulate( $st : Applicant($age: age > 5) over window:length(10)
                  from entry-point X,
            $avg: average ( $age ), $cnt: count( $st ))
then
System.out.println("~~~~~avg~~~~~");
System.out.println($avg + ", count=" + $cnt);
System.out.println("~~~~~avg~~~~~");
end

甚至在有10个匹配的申请人之前显示输出,但稍后,$cnt永远不会低于10,即使$age的范围从0到9,也会定期。

如果您认为自己找到了支持索赔的示例,请提供完整的复制代码,并确保注明Drools版本。

你的解决方法确实非常糟糕,因为它为每个StockTick累积。但是通过使用维护window:length(n)事件列表的辅助事实,可以非常有效地实现n。这甚至可能比window:length更有利。