Search code examples
wso2siddhiwso2-cep

Negation for "every" statement? WSO2 CEP / Siddhi


Is there a simple way to negate the "every" statement? I am trying to implement a control tool that checks incoming purchase orders and requisitions. For each purchase order (PO) a requisition (REQ) has to be created before. The following code detects PO/REQ-pairs that match (positives) but I need all POs that do not have a corresponding REQ (negatives).

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;

Solution

  • You can refer to sample on detecting non-occurrences with patterns. However, since you want to check whether REQ event came before PO event you might need to use in-memory event tables to cater your requirement. Refer to the following sample on achieving the same using in-memory tables;

    @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;