У меня есть шаблон не встречающихся событий , чтобы определить, возникает ли определенное условие, а затем предупредить меня, если это условие не изменится в течение определенного времени. Приведенный ниже запрос может быть описан как «Если для пользователя появляется значение 1, предупредите меня, если в течение 5 секунд для этого пользователя нет нового значения»:
define stream inStream(name string, value int);
partition with (name of inStream)
begin
from every in=inStream[ value == 1 ]
-> not inStream[ not(value == 1) ] for 5 sec
select in.name, in.value
insert into outStream;
end;
Этот запрос работает точно так же, как и ожидалось: если я не получу значение, отличное от 1, в течение 5 секунд, запрос будет запущен. Проблема возникает при наличии дублирующихся событий со значением 1.
Если я отправляю событие {name: "bob", value: 1}
каждую секунду в течение 10 секунд, мне бы хотелось, чтобы запрос запускался дважды, один раз через 5 секунд и один раз через 10 секунд. Однако сейчас я вижу, что запрос запускается каждую секунду, начиная с 5 секунд. По сути, запрос (работающий как надо) запускает 5-секундный таймер для каждого события со значением 1, которое он видит. Однако я бы не хотел запускать этот таймер (или, по крайней мере, не выводить его), если таймер уже запущен.
Я попытался решить эту проблему с помощью следующего запроса (просто добавив строку «output»):
define stream inStream(name string, value int);
partition with (name of inStream)
begin
from every in=inStream[ value == 1 ]
-> not inStream[ not(value == 1) ] for 5 sec
select in.name, in.value
output first every 5 sec
insert into outStream;
end;
Я также пытался output last
и output all
.
Вышеприведенные запросы работали не так, как ожидалось: в случае all
и last
события вообще не выводились, в случае first
выводилось только одно событие, а не последующие после первые 5 секунд пройдены.
Есть ли способ добиться того, чего я хотел бы? У меня есть предчувствие, что использование временных окон или output
- это способ решить эту проблему, но до сих пор не удалось заставить его работать.