Wso2 使用两个时间窗口和两条流使用Siddhi CEP进行查询(续)

Wso2 使用两个时间窗口和两条流使用Siddhi CEP进行查询(续),wso2,complex-event-processing,wso2cep,siddhi,Wso2,Complex Event Processing,Wso2cep,Siddhi,我一直试图与Siddhi进行复杂的关联,这次我有两个输入流,web客户端咨询和发送给客户端访问的通知,我想生成一个警报,如果每个客户端的第一个流重复了不止一次,只要第二个流在两个窗口下没有发生,并且取决于此事件的状态 define stream consults (idClient string,dniClient string,codProduct string,codSubProduct string,chanel string,time string ) define stream co

我一直试图与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 CHINED或其他join left join,您可以通过一个模式来实现这一点。在本例中,我假设我们必须等待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;
这些是草稿查询,因此可能需要进行一些修改才能使其正常工作。filteredConsultsStream包含在最后一分钟内出现1次以上的咨询事件。 在上一次查询中,我们得到条件的or为: nonOccurringEvent=commercialActions[firstEvent.idClient==idClient] 或 triggerEvent=filteredConsultsStream[firstEvent.idClient==idClient]

因此,查询将由上述事件之一触发。但是,我们需要找出这种情况是否是由商业行为引发的。为此,我们使用having子句并检查id是否为null id is null意味着事件为null,即不发生。最后我们发出输出

您可以为类似的查询找到更好的描述,该查询是新的4.0.0版本btw,并且有一些小的语法更改