2016-08-29 41 views
0

有沒有一種簡單的方法來否定「every」語句?我正試圖實施一個控制工具來檢查傳入的採購訂單和請購單。對於每個採購訂單(PO),必須先創建一個請購單(REQ)。以下代碼檢測匹配(正數)的PO/REQ對,但我需要所有沒有相應REQ(負數)的PO。否定「每一個」的陳述? WSO2 CEP/Siddhi

from every a1 = PO -> b1 = REQ[a1.ITEM_ID == b1.ITEM_ID and a1.QUANTITY == b1.QUANTITY and a1.CREATED_BY == b1.CREATED_BY] within 1 day select 'No REQ created before' as ALERT_MESSAGE insert into ALERT; 

回答

0

您可以參考sample on detecting non-occurrences with patterns。 但是,既然您想檢查POQ事件之前是否有REQ事件發生,您可能需要使用內存中事件表來滿足您的要求。使用內存表中的參考以下示例實現相同;

@Import('REQStream:1.0.0') 
define stream REQ (ITEM_ID int, QUANTITY int, CREATED_BY string); 

@Import('POStream:1.0.0') 
define stream PO (ITEM_ID int, QUANTITY int, CREATED_BY string); 

@Export('ALERTStream:1.0.0') 
define stream ALERT (ITEM_ID int, ALERT string); 

define table REQ_TABLE (ITEM_ID int, QUANTITY int, CREATED_BY string); 

define trigger DAILY_TRIGGER at every 1 day; 

from REQ 
insert into REQ_TABLE; 

-- check whether request exists before the purchase 
from PO[not((REQ_TABLE.ITEM_ID == ITEM_ID and REQ_TABLE.QUANTITY == QUANTITY and REQ_TABLE.CREATED_BY == CREATED_BY) in REQ_TABLE)] 
select ITEM_ID, 'No REQ created before' as ALERT 
insert into ALERT; 

-- purge reauests table daily 
from DAILY_TRIGGER join REQ_TABLE 
select REQ_TABLE.ITEM_ID, REQ_TABLE.QUANTITY, REQ_TABLE.CREATED_BY 
insert into PURGE_STREAM; 

-- if there's no matching purchase order came up for previous day 
from PURGE_STREAM 
select ITEM_ID, 'No purchase order came up for a day' as ALERT 
insert into ALERT; 

from PO 
insert into DEL_STREAM; 

from PURGE_STREAM 
insert into DEL_STREAM; 

-- delete corresponding request from table 
from DEL_STREAM 
delete REQ_TABLE 
    on REQ_TABLE.ITEM_ID == ITEM_ID and REQ_TABLE.QUANTITY == QUANTITY and REQ_TABLE.CREATED_BY == CREATED_BY; 
+0

非常感謝!我沒有重用你的代碼,但後面的想法幫助我解決了這個問題! – Wenzel