1

我一直在尝试与 Siddhi 建立复杂的关联,在这种情况下,我有两个输入流,Web 客户端咨询和发送给客户访问的通知,如果每个客户端的第一个流重复不止一次,我想生成警报第二个流未发生在两个窗口下,取决于此事件的状态。

define stream consults (idClient string,dniClient string,codProduct string,codSubProduct string,chanel string,time string )

define stream comercialActions(idClient string, idAccionComercial string,codProduct string,codSubProduct string,chanel string,time string,status string)

from consults[codProduct=='Fondos']#window.time(50 seconds) select idClient,codProduct, codSubProduct, chanel, time, count(idClient) as visitCount group by idClient insert into consultsAvg for current-events

from consultsAvg[visitCount==1] select idClient, '' as idAccionComercial,codProduct, codSubProduct ,chanel, time, 'temp' as status insert into comercialActions for all-events

from comercialActions[status=='temp' or status == 'Lanzada' ]#window.time(5 seconds) select idClient as idClient, codProduct, codSubProduct, chanel, status, count(idClient) as num_status group by idClient insert into acciones_generadas for all-events

from comercialActions[status=='temp' or status=='Aceptada' or status =='Rechazada'or status=='Caduca']#window.time(3 seconds) select idClient as idClient, codProduct, codSubProduct, chanel, status,  count(idClient) as num_status group by idClient insert into acciones_realizadas for all-events

from consultsAvg[visitCount>=2]#window.time(50 seconds) as c join acciones_realizadas[num_status>=1]#window.time(5 seconds) as ag on c.idClient == ag.idClient and c.codProduct==ag.codProduct select c.idClient,c.codProduct,c.codSubProduct,c.chanel, c.time, count(c.idClient) as conteo insert into posible_ac for all-events

from posible_ac#window.time(5 seconds) as pac  join acciones_generadas[num_status>=1]#window.time(1 seconds) as ar on pac.idClient == ar.idClient select pac.idClient,pac.codProduct,pac.codSubProduct,pac.chanel,pac.time,conteo, count(ar.idClient) as conteo2  insert into enviar_Ac

from enviar_Ac[conteo==1 and conteo2==1] select idClient, codProduct,codSubProduct, chanel, time insert into generar_accion_comercial

我尝试做的是使用中间流来计算大于或等于 2 时的网站点击次数,我看看它是否已经通过各种加入为该客户做出了商业行为......我想我已经变得很复杂,不知道有没有更简单的解决方案???,考虑到它没有功能 Siddhi NOT Happened 也没有其他连接(左连接)

4

1 回答 1

1

您可以使用模式来完成此操作。在这种情况下,我假设我们必须等待 1 分钟才能等待来自第二个流的事件,如果没有,并且来自第一个流的事件超过 1 个,我们将发出一个输出。

from consults#window.time(1 minute)
select idClient, count(idClient) as idCount, <select more attributes here>
insert into expiredConsultsStream for expired-events;

from expiredConsultsStream[idCount > 1]
select *
insert into filteredConsultsStream;

from firstEvent = consults -> 
nonOccurringEvent = commercialActions[firstEvent.idClient == idClient] 
or
triggerEvent = filteredConsultsStream[firstEvent.idClient == idClient]
select firstEvent.idClient as id, triggerEvent.idCount as idCount, nonOccurringEvent.idClient as nid
having( not (nid instanceof string))
insert into alertStream;

这些是草稿查询,因此可能需要进行一些修改才能使其正常工作。filterConsultsStream 包含在最后一分钟内出现超过 1 次的咨询事件。在最后一个查询中,我们得到的条件为:nonOccurringEvent = CommercialActions[firstEvent.idClient == idClient] 或 triggerEvent = filteredConsultsStream[firstEvent.idClient == idClient]

因此查询将由上述事件之一触发。但是,接下来我们需要判断条件是否是由 CommercialActions 触发的。为此,我们使用 'have' 子句并检查 id 是否为 null(id 为 null 意味着事件为 null,即不发生)。最后我们发出输出。

您可以在此处找到一些类似查询的更好描述(顺便说一句,这是新的 4.0.0 版本,并且有一些小的语法更改)

于 2015-07-13T12:00:28.493 回答