Siddhi延迟查询

Siddhi delayed query

我很难理解这个查询:

from heartbeats#window.time(1 hour) insert expired events into delayedStream;

from every e = heartbeats -> e2 = heartbeats[deviceId == e.deviceId]
  or expired = delayedStream[deviceId == e.deviceId]
within 1 hour 10 minutes 
select e.deviceId, e2.deviceId as id2, expired.deviceId as id3
insert into tmpStream;

这有效,但我不明白这部分:

from every e = heartbeats -> e2 = heartbeats[deviceId == e.deviceId] or expired = delayedStream[deviceId == e.deviceId]

查询的第二部分(或 expired = ...)检查具有给定 deviceId 的事件是否在 delayedStream 上。第一部分的目的是什么?它是如何结合在一起的,即此查询查找超过 1 小时未发送数据的设备?

如果您想检查传感器在过去 1 小时内是否未发送读数,我认为上述查询不会准确。我将 windows 调整为 1 分钟并发送了 2 个事件,

[2019-07-19 16:48:23,774] heartbeats : Event{timestamp=1563535103772, data=[1], isExpired=false}
[2019-07-19 16:48:24,696] tmpStream : Event{timestamp=1563535104694, data=[1, 1, null], isExpired=false}
[2019-07-19 16:48:24,697] heartbeats : Event{timestamp=1563535104694, data=[1], isExpired=false}
[2019-07-19 16:49:23,774] tmpStream : Event{timestamp=1563535163772, data=[1, null, 1], isExpired=false}

假设事件在 10 点和 10.15 点到达,tmpStream 的输出将在 10.15 点(第一部分)和 11 点(由于流延迟)。第二个匹配项不正确,因为它必须根据用例匹配 11.15。

但是,如果您想改进查询,您可以为您的用例使用 Siddhi 检测 non-occurance 模式功能,https://siddhi.io/en/v5.0/docs/query-guide/#detecting-non-occurring-events,它会更简单