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