Drools:不匹配时查询的默认值

时间:2017-08-05 04:51:27

标签: drools drools-fusion drools-kie-server

我正在编写Drools规则集处理AB类型的事件;在许多规则中,我需要将A的属性timestampB的属性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?

1 个答案:

答案 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