问题描述
我想将由相同输入触发的所有查询分组,并在单个事件中输出所有触发的查询。如果event1
同时触发query1
和query2
,我想为两者都触发一个事件,例如{... [query1,query2]}
。我已经有一种在输出中获取触发查询的机制,但是事实证明,聚合输出更加困难。
我最初尝试了以下方法:
define stream inStream(eventId string,value int);
from inStream[ value > 10 ]
select eventId,value,"value over 10" as message
insert into #sessionWindow1;
from inStream[ value > 20 ]
select eventId,"value over 20" as message
insert into #sessionWindow1;
...
from #sessionWindow1#window.session(100 milliseconds,eventId)
select eventId,message
group by eventId
insert into outStream;
由同一事件触发的所有查询最终都在最终流的同一窗口中(通过添加计数聚合函数进行验证)。尽管它们仍然不能在一个事件中全部输出。我创建了自己的自定义聚合函数,该函数将所有消息添加到数组中。然后,我根据时间间隔输出最后一条消息。
最终流被重写如下:
from #sessionWindow1#window.session(100 milliseconds,custom:agg(message) as message
group by eventId
output last every 100 millisecond
insert into outStream;
这按预期工作。如果我发送值25,则输出为{...["value over 10","value over 20"]}
。问题是这很脆弱,因为如果我有足够多的规则来处理所有这些规则所需的时间比会话窗口要长(在这种情况下为100毫秒),则会生成多个输出。
是否存在另一种汇总所有输出的方法?我看到QueryCallback
接受Event[]
,但似乎从来没有一个以上的事件被调用。
这是使用Siddhi 5.1.X
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)