流口水:不匹配时查询的默认值



我正在编写一个处理类型AB事件的Drools规则集;在许多规则中,我需要将A的属性timestampB属性windowStart子集的最大值进行比较,以限定该A事件。如果B的子集是空集,我假设没有 windowStart,因此需要值0。任何timestamp大于windowStartA都有资格。

请考虑以下伪代码进行详细说明:

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

相关内容

  • 没有找到相关文章

最新更新