0

我正在编写一个 Drools 规则集处理类型为Aand的事件B;并且在许多规则中,我需要将A' 属性与'属性timestamp子集的最大值进行比较以限定该事件。如果该子集是一个空集,我假设没有 windowStart,因此需要该值。任何具有大于的 a都将符合条件。BwindowStartAB0AtimestampwindowStart

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

long findMaxWindowStartOrZero(int bID)
{
    Set bSubset = getAllBWithID(bID);
    if(bSubset is empty) return 0;
    return max(bSubset, B::windowStart);
}

如果没有这样的查询,则需要复制与此比较有关的每个规则的 LHS,一次是为了说明不存在任何规则B,一次是为了在子集非空时找到实际的最大值。

像上面的伪代码这样的查询使这项任务变得更加容易,并且不需要分支 LHS。有可能这样做吗?这样做而不是分支提到规则的 LHS 有什么缺点或好处吗?

4

1 回答 1

0
rule qualify_A
when
    accumulate( B( id == "bID", $ws: windowStart ); $mws: max( $ws ) )
    $a: A( timestamp > $mws )
then
    ...process $a...
end

我认为如果没有匹配的 B,这条规则不会触发。要解决此问题,请插入一个 B 并将 windowStart 设置为 0。此虚拟对象还可用于定义匹配 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
于 2017-08-05T06:19:34.073 回答