2016-08-17 61 views
0

我想写收集/积累基于时间操作值的规则。积累/收集基于时间操作

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名球员在场上以一系列速度行进,这些速度在事件变量中被指定为一个字符串,这些字符串都是一次重叠的。

我已经试过就积累和收集,但与如何发生的时候收集这些事件,并将它们返回到规则的右侧,使他们能够打印到标准输出挣扎了几件事情。

请帮忙。

谢谢。

回答

0

应该可以创建规则,以符合您的要求,但我认为你需要知道的的确切定义的重叠关键字在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关键字,这是逆重叠

+0

啊我明白了。是的,这是有道理的。基本上,时间操作符(重叠)是错误的方式(应重叠)。 而我只是简单地需要使用收集功能,而不是积累。 Drools文档(包括由packt编写的书籍)似乎推动了积累功能。因此,为什么我对是否使用它感到困惑。无论如何,感谢您的帮助。 – Stu

+0

不客气。如果你不介意,你能否将我的答案标记为已接受? –

+0

完成。只是想知道你是否可以为我回答一个简短的问题: 我声明了一个全局变量,它是一个列表并用特定对象填充它。在满足条件后,您是否知道如何在RHS上的全局数组中调用这些对象的方法?谢谢。 – Stu