Как сохранить отчетливость до тех пор, пока на EPL ESPER не будет выполнено определенное условие
У меня есть два типа событий (A и B). Я хотел бы написать шаблон, который обнаруживает каждое событие B, которое идет после события A с тем же идентификатором: every A -> B (A.id = B.id)
, Тем не менее, это должны быть разные идентификаторы. Другими словами, шаблон должен игнорировать все события A с одним и тем же идентификатором после первого до тех пор, пока вышеприведенное выражение не станет истинным, то есть наступит событие B с тем же идентификатором.
Например, предположим, что это поток событий:
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. Когда наступает событие №6, шаблон должен соответствовать 1. A (id: 1) -> 6. B (id: 1)
, Затем шаблон должен разрешить новое событие A с id=1. Поэтому событие №8 не следует игнорировать, а событие №10 следует игнорировать. Когда наступает событие №11, шаблон должен снова соответствовать 8. A(id: 1) -> 11. B(id: 1)
,
Кроме того, событие №2 должно совпадать с событием №7, а событие №3 должно совпадать с событием №9.
Я пытался использовать EVERY-DISTINCT(A.id) A -> B (A.id=B.id)
, но он игнорирует все события A с одинаковым идентификатором после первого. Потом я попробовал EVERY (A -> B (A.id = B.id))
, но он также не работал, так как игнорирует все события A независимо от идентификатора, пока не произойдет событие B с тем же идентификатором.
1 ответ
Вы можете иметь every A -> B (A.id = B.id)
заявление в PATTERN
заявление и добавить дополнительно добавить @SuppressOverlappingMatches
сразу после PATTERN
ключевое слово.
Полное утверждение будет примерно таким:
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