Drools:使用' After'评估事件列表

时间:2016-10-11 22:28:55

标签: java list drools

我真的很流行,而且我正试图抓住一些不同的东西。现在我需要能够确定某些事件是否按特定顺序发生。问题是这个事件列表不断变化。现在我已经这样做了:

$a: Hit(id == A)
$b: Hit(id == B)
$c: Hit(id == C)
$d: Hit(id == D)
$e: Hit(id == E)
$f: Hit(id == F)

Hit($b after $a)
Hit($c after $b)
Hit($d after $c)
Hit($e after $d)
Hit($f after $e)

我想做更像这样的事情:

全球名单事件= [A,B,C,D,E,F]

对于此列表中的每个项目,会话中的每个事件都会以特定顺序发生。

F - >之后 - > E - >之后 - > D - >之后 - > C - >之后 - > B - >之后 - >甲

我/我可以使用累加器吗?

1 个答案:

答案 0 :(得分:0)

累积不太合适,因为你不能轻易地将一个项目引用到之前或之后的那个项目。

可能有几种方法可以解决这个问题 - 这是我的建议。定义一个班级Parade

class Parade {
    List<String> chain;
    String next; 
    Hit last;
    Parade( List<String> chain ){
        this.chain = chain;
        next = chain.get(0);
        // assert chain.size() > 1
    }
    //...
}

现在你至少需要三条规则:

rule "find first Hit"
when
    $p: Parade( last == null, $next: next, $chain: chain )
    $h: Hit( id == $next )
then
    $chain.remove(0);
    modify( $p ){
        setLast( $h ),
        setNext( $chain.get(0) )
    }
end
rule "find next Hit"
when
    $p: Parade( $last: last, $next: next, $chain: chain )
    $prev: Hit( this == $last )
    $h: Hit( this after $prev, id == $next )
then
    $chain.remove(0);
    String next = $chain.size() > 0 ? $chain.get(0) : null;
    modify( $p ){
        setLast( $h ),
        setNext( next )
    }
end

你需要第三条规则来检测完整的Parade:last不是null,但接下来是。您也可以使用Parade中的列表来收集Hits。

(注意:所有未经验证的。)