У меня есть шаблон непредвиденных событий, чтобы определить, возникает ли определенное условие, а затем предупредить меня, если это условие не изменится в течение установленного времени. Приведенный ниже запрос можно описать как «Если для пользователя отображается значение 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, которое он видит. Однако я бы хотел, чтобы этот таймер не запускался (или, по крайней мере, не выводился), если таймер уже запущен.
Я попытался решить эту проблему с помощью следующего запроса (просто добавив строку с выводом):
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
- способ решить эту проблему, но до сих пор не могу заставить его работать.