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

Я должен внедрить правило, согласно которому, если происходит А, то Б должно произойти дальше без каких-либо промежуточных событий. Обычно я мог сделать это, просто используя скороговорку:

A->(B and not ...)

Но я должен реализовать это очень динамично. Это означает, что я не знаю всех возможных событий заранее. Кто-нибудь знает, как я могу это реализовать? Думаю, мне нужно что-то вроде:

A->(B and not any other event)

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


person n.muc.ruh    schedule 12.12.2020    source источник
comment
Очень похоже на stackoverflow.com/questions/65267473/   -  person user650839    schedule 15.12.2020


Ответы (2)


См. этот другой билет Утверждение Esper для проверки, следует ли за A B без каких-либо других As между ними Это объясняет распознавание соответствия.

Вот несколько путей, по которым вы можете пойти в отношении многих типов событий.

Схема создания с наследованием плюс функция типа

create schema Parent();
create schema A() inherits Parent;
create schema B() inherits Parent;
// now you can treat all events as Parent events
select * from pattern[p=Parent(typeof(p)='A') -> ...] // or match-recognize

Вариант потока

create variant schema AnyEventStream as *; // this stream can hold any type of event
insert into AnyEventStream select * from A;
insert into AnyEventStream select * from B;
select * from pattern[p=AnyEventStream(typeof(p)='A') -> ...]  // or match-recognize

Нормализовать с помощью вставки в

insert into CombinedStream select 'a' as type from A;
insert into CombinedStream select 'b' as type from B;
// now match on CombinedStream
select * from pattern[p=CombinedStream(type='A') -> ...]  // or match-recognize

Сделайте каждое событие столбцом

create schema CombinedStream(col java.lang.Object);
insert into CombinedStream select a as col from A as a;
insert into CombinedStream select b as col from B as b;
select * from pattern[p=CombinedStream(typeof(col)='...') -> ...]  // or match-recognize

Вероятно, вы можете комбинировать некоторые из этих подходов. Вы также можете использовать интерфейсы Java и абстрактные классы вместо наследования, поскольку система типов распознает суперклассы/интерфейсы.

person user650839    schedule 15.12.2020
comment
Большое спасибо за ваш ответ. Я попробовал ваши предложения и сделал каждое событие столбцом швов, чтобы работать очень хорошо для меня. Моя единственная проблема в том, что мне нужно получить доступ к свойствам каждого события, чтобы проверить некоторые условия. Например: ```` выберите * из CombinedStream.win:length(1), где typeof(col)='MachineFailureEvent' и id=1; ```` До проверки id все работает нормально, но компилятор говорит мне, что свойство id недействительно в этом потоке.. у вас есть идея? Таню тебя :) - person n.muc.ruh; 17.12.2020

Большое спасибо за ваш ответ. Я попробовал ваши предложения и сделал каждое событие столбцом швов, чтобы работать очень хорошо для меня. Моя единственная проблема в том, что мне нужно получить доступ к свойствам каждого события, чтобы проверить некоторые условия. Например:

select * from CombinedStream.win:length(1) where typeof(col)='MachineFailureEvent' and id=1;

До проверки id все работает нормально, но компилятор говорит мне, что id свойства недействителен в этом потоке.. у вас есть идея? Таню тебя :)

person n.muc.ruh    schedule 17.12.2020