我正在编写一个处理类型A
和B
事件的Drools规则集;在许多规则中,我需要将A
的属性timestamp
与B
属性windowStart
子集的最大值进行比较,以限定该A
事件。如果B
的子集是空集,我假设没有 windowStart,因此需要值0
。任何timestamp
大于windowStart
的A
都有资格。
请考虑以下伪代码进行详细说明:
long findMaxWindowStartOrZero(int bID)
{
Set bSubset = getAllBWithID(bID);
if(bSubset is empty) return 0;
return max(bSubset, B::windowStart);
}
如果没有这样的查询,关于此比较的每个规则的 LHS 都需要重复,一次用于解释没有任何B
,一次用于在子集为非空时找到实际最大值。
使用上面的伪代码这样的查询使这项任务变得更加容易,并且不需要分支 LHS。有可能做到吗?这样做而不是分支上述规则的 LHS 有什么缺点或好处吗?
rule qualify_A
when
accumulate( B( id == "bID", $ws: windowStart ); $mws: max( $ws ) )
$a: A( timestamp > $mws )
then
...process $a...
end
我认为如果没有匹配的 B,这条规则就不会触发。若要解决此问题,请插入一个 B,并将窗口启动设置为 0。这个虚拟人也可以用来定义匹配 Bid
的值:
rule qualify_A
when
B( $id: id, windowStart == 0 ) // the dummy, defines id
accumulate( B( id == $id, $ws: windowStart ); $mws: max( $ws ) )
$a: A( timestamp > $mws )
then
...process $a...
end