Эспер: добавление события в окно накопления времени при условии наличия одного условия для атрибута

Недавно я работал с Esper, и есть функция, которую я пропустил в документации, но она может существовать.

Я хотел бы сохранить некоторые события, пока никто не появится в течение 15 секунд, и когда это произойдет, отпустите их все.

Один запрос делает именно это, это:

select rstream * from MyEvent.win:time_accum(15 sec)

Я могу добавить условие в MyEvent, например

select rstream * from MyEvent where status = 'ALARM_END'.win:time_accum(15 sec)

И это прекрасно работает.

Теперь я хотел бы добавить условие для атрибута eventType, говорящее, что:

если новое событие запускается с типом события xxxx, но в окне уже есть событие с типом события xxxx, то не добавляйте это новое всплывающее событие в окно (и, следовательно, не останавливайте секундомер от 0 до 15 с).

Есть ли способ сделать это ?

Большое спасибо !

РЕДАКТИРОВАТЬ :

Более глубоко изучив мои потребности и документацию ESPER, я думаю, что мои потребности более удовлетворены

select * from MyEvent.win:time_length_batch(15 sec, 2)

Я не думаю, что мне нужен rstream, так как я просто хочу накопить 1 или 2 элемента и получить их сразу в массиве (для новых событий это нормально).

Однако можно ли добавить условие для первого (и только первого) MyEvent, поступающего в окно? Статус = 'ALARM_END'.


person Tchak    schedule 11.10.2017    source источник


Ответы (1)


У вас может быть именованное окно, и проверьте его перед вставкой.

// define named window
create window MyEventWindow#time_accum(15) as MyEvent;

// insert events that don't have 'xxx'
insert into MyEventWindow select * from MyEvent(eventType != 'xxx');

// insert events that have 'xxx' only if not already there
insert into MyEventWindow select * from MyEvent(eventType = 'xxx') 
  where not exists(select * from MyEventWindow where eventType='xxx');

// usual select
select rstream * from MyEventWindow;
person user650839    schedule 11.10.2017
comment
Здравствуйте, спасибо за ваш ответ. Я думаю, что, возможно, я не ясно выразился в своем вопросе. 'xxxx' не должен быть фиксированной переменной. - person Tchak; 12.10.2017
comment
Предположим, что в текущем окне есть 3 события с типами событий «eT1», «eT2» и «eT3». Затем, если запускается новое событие, оно добавляется в окно, только если его тип события отличается от «eT1», «eT2» и «eT3». С Уважением. - person Tchak; 12.10.2017
comment
Примечание. Я могу использовать неоптимальное решение, написав третью строку для каждого события «xxxx» в моем списке событий. - person Tchak; 12.10.2017
comment
Просто удалите второй EPL и вместо этого используйте следующее..... вставьте в MyEventWindow выберите * из MyEvent как прибывающего, где его нет (выберите * из MyEventWindow как выигрышного, где прибывающий.eventType=win.eventType); - person user650839; 12.10.2017
comment
Возможно, вы можете просто использовать MyEvent#time_accum(15 sec)#firstunique(eventType) - person user650839; 12.10.2017
comment
Привет, ты видел мою правку? Если вы знаете ответ, я могу закрыть эту тему. Спасибо ! - person Tchak; 16.10.2017