基于时间算子的累积/收集

时间:2016-08-17 13:47:09

标签: java drools fusion accumulate

我正在尝试编写一个基于时间运算符收集/累积值的规则。

rule "Zone6 Overlap"
when
    $i1 : Instance ($e1 : event == " Vel : 20.99-23.98 km/h : " && $name1 : name) from entry-point "Stream"
    $i2 : Instance ($e2 : event && $name2 : name && $e2 == $e1 && $name2 != $name1 
    && this overlaps $i1) from entry-point "Stream"
then 
    System.out.println("** Overlap Event: Velocity Zone 6 ** \nPlayer1: " + $i1.getName() + "\nPlayer2: " 
    + $i2.getName() + "\nEvent: " + $i1.getEvent() + "\n" + "Start Time (P1): " 
    + $i1.getStart() + " - End Time: " + $i1.getEnd() + "\nStart Time (P2): " 
    + $i2.getStart() + " - End Time: " + $i2.getEnd() + "\n");
end

这是我的原始规则,它设法获得两个持续时间的重叠。

我想要创建的规则的想法是看足球比赛中球员的持续时间是否有任何集体重叠。我想看看场上9位球员中是否有任何一位球员在事件变量中指定为字符串的速度范围内一次性重叠。

我已经尝试了一些关于累积和收集的事情,但是当它们发生时如何收集这些事件并将它们返回到规则的右侧,以便可以将它们打印到标准输出。

请帮忙。

感谢。

1 个答案:

答案 0 :(得分:1)

应该可以创建符合您要求的规则,但我认为您需要了解Drools中重叠关键字的确切定义:

  

重叠评估器将当前事件在相关事件开始之前开始并且在相关事件开始之后但在相关事件结束之前完成时关联两个事件和匹配。换句话说,两个事件都有重叠的时期。

这意味着它不会匹配任何任意重叠,但仅当一个事件在另一个事件的开始之前开始并在该事件结束之前结束时。假设我们有以下3个事件:

A [11:19:00-11:19:30]
B [11:19:15-11:19:45]
C [11:19:20-11:19:40]

在这种情况下,A在B和C之前开始,并且在两者之前结束。这意味着A与B和C重叠。但是,B不与C重叠,因为它在C之前开始,但在C之后结束。对于每个可用运算符的完整定义,请参阅Drools fusion documentation

如果匹配您的用例,则以下规则将收集与给定事件重叠的所有事件:

rule "Overlap"
when
    $i1 : Instance ($e1 : event == "some event" ) 
    $instances : List( size > 0 ) from collect ( Instance ( event == $e1, this != $i1, 
        this overlappedby $i1 ) )
then
    System.out.println("** Overlap Event for: " + $i1.getName());
    for (int i = 0; i < $instances.size(); i++) {
        System.out.println("Overlaps: " +  ((Instance)$instances.get(i)).getName());
    }
end

如您所见,它使用 overlappedby 关键字,这是重叠的反转。