Оператор Esper для проверки, следует ли за A B без каких-либо других As между ними

У меня есть два события: A и B. Каждый раз, когда происходит A, после этого должно произойти B без каких-либо промежуточных событий. У кого-нибудь есть идея, как это реализовать? Я думал о чем-то вроде

pattern[every A -> A until B]

Но это утверждение верно, даже если за А следует В без какого-либо другого А между ними. Но это должно быть верно только в случае AAB или AAAAB и так далее.

Спасибо за помощь.


person n.muc.ruh    schedule 12.12.2020    source источник


Ответы (2)


Одним из возможных решений является шаблон

A -> (A and not B)

При этом запрос верен только тогда, когда правило нарушается. Но если он выполняется, я не получаю никакого намека. Есть ли лучшее решение?

person n.muc.ruh    schedule 12.12.2020

Сопоставление с распознаванием совпадений имеет семантику, за которой сразу следует семантика. Вы можете сделать что-то вроде этого:

create schema A();
create schema B();
select * from pattern[every a=A or every b=B]
  match_recognize (
    measures p1 as a, p2 as b
    pattern (p1 p2)
    define
    p1 as typeof(p1.a) = 'A',
    p2 as typeof(p2.b) = 'B'
)

Или вы можете использовать подход с вставкой в.

insert into CombinedStream select id, 'a' as type from A;
insert into CombinedStream select id, 'b' as type from B;
select * from CombinedStream
      match_recognize (
        measures a as a, b as b
        pattern (a b)
        define
        a as a.type = 'A',
        b as b.type = 'B'
    )

И когда вы хотите использовать язык шаблонов EPL, это также может сработать. Шаблоны EPL всегда добавляют и удаляют из индексов фильтров, и это может быть менее эффективным в зависимости от того, сколько входящих событий сопоставляются и не сопоставляются/отбрасываются (т. е. анализ каждого события по сравнению с потребностью в стоге сена).

every A -> (B and not A)  // read: every A followed by B and not A
person user650839    schedule 15.12.2020