Question

Am a newbie to Drools and trying out the sliding window concept.

My problem is to detect if atleast a sucessful transaction occured in 2 sales events. I am always getting the output as "A sale has happened over 2 events" even if such an event happened or not.

-------------drl----------

declare Sale
@role( event )
end

rule "Identify more than a single valid sale event"

//The variable saleHappened would be set to Y if a successful transaction

when sale: Sale ( saleHappened == "Y")  over window:length(2)  from entry-point MyEntryPoint

then

System.out.println("A sale has happened over 2 events" );

end

-------------code----------

public class DroolsTest {

    public static final void main(String[] args) {
        try {

            // load up the knowledge base 
            KnowledgeBase kbase = readKnowledgeBase(); 

            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); 

            WorkingMemoryEntryPoint entryPoint = ksession.getWorkingMemoryEntryPoint("MyEntryPoint");


            Sale sale = new Sale();

            sale.setSaleHappened("N");
            entryPoint.insert(sale);


            Sale sale2 = new Sale();

            sale2.setSaleHappened("N");
            entryPoint.insert(sale2);


            ksession.fireAllRules();

            ksession.dispose(); 

        } catch (Throwable t) {
            t.printStackTrace();
        }
    }


    private static KnowledgeBase readKnowledgeBase() throws Exception {

        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 
        kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL); 
        KnowledgeBuilderErrors errors = kbuilder.getErrors(); 
        if (errors.size() > 0) { 
                for (KnowledgeBuilderError error: errors) { 
                        System.err.println(error); 
                } 
                throw new IllegalArgumentException("Could not parse knowledge."); 
        } 

        final KnowledgeBaseConfiguration kbConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); 
        kbConfig.setOption(EventProcessingOption.STREAM); 
        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbConfig); 
        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); 
        return kbase; 
    }

    public static class Sale {

        public Sale () {

        }

        public String getSaleHappened() {
            return saleHappened;
        }

        public void setSaleHappened(String saleHappened) {
            this.saleHappened = saleHappened;
        }

        private String saleHappened;




    }

}
Was it helpful?

Solution

This is related to Bug 787118 - Length sliding window keeps all events . The concept of sliding window event firing and how events do not fall off the window is explained in the bugzilla entry.

Can be fixed as follows:

--------------drl--------------------

declare Sale
@role( event )
end

declare window Ticks
    Sale()
        over window:length( 5 )
        from entry-point MyEntryPoint
end


rule "More than 2 sale suceess in 5 events"
when     Number($cnt : intValue,intValue > 2) 
from    accumulate( Sale ( saleHappened == "Y" ) from window Ticks,  count(1) )
then
    System.out.println("A sale has happened over " + $cnt +" events" );
end
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top