如何在 EPL ESPER 上的特定条件为真之前保持清晰度

How to keep distinctness until specific condition is true on EPL ESPER

我有两种事件类型(A 和 B)。我想编写一个模式来检测在 A 事件之后出现的具有相同 ID 的每个 B 事件:every A -> B (A.id = B.id)。但是,它应该是不同的 ID。换句话说,该模式应忽略第一个事件之后具有相同 ID 的所有 A 事件,直到上述表达式为真,这意味着 B 事件具有相同的ID来了。

例如,假设这是一个事件流:

1. A (id: 1); 2. A(id: 2); 3. A (id: 3); 4. A(id: 1); 5. A (id: 2); 6. B (id: 1); 7. B (id: 2); 8. A (id: 1); 9. B(id: 3); 10. A (id: 1); 11. B (id: 1)

该模式应忽略事件 4,因为它与事件 1 具有相同的 ID。当事件 No6 到来时,模式应该匹配 1. A (id: 1) -> 6. B (id: 1)。然后,该模式应该允许新的 A 事件和 id=1。所以不应忽略事件 No8,但应忽略事件 No10。当事件 No11 到来时,模式应该再次匹配 8. A(id: 1) -> 11. B(id: 1)

此外,事件 2 应与事件 7 匹配,事件 3 应与事件 9 匹配。

我曾尝试使用 EVERY-DISTINCT(A.id) A -> B (A.id=B.id),但它会忽略第一个事件之后具有相同 ID 的所有 A 事件。然后我尝试了 EVERY (A -> B (A.id = B.id)),但它也没有用,因为它忽略了所有 A 事件,而不管 id 直到 B 事件与相同的 ID 来了。

您可以在 PATTERN 语句中包含 every A -> B (A.id = B.id) 语句,并在 PATTERN 关键字之后添加 @SuppressOverlappingMatches

完整的语句是这样的:

SELECT b.id FROM PATTERN @SuppressOverlappingMatches [every a=A -> b=B (a.id = b.id)] 

参考:http://www.espertech.com/esper/release-5.5.0/esper-reference/html/event_patterns.html#patterns-howto-suppress