Hi,

I've written a simple rule to illustrate the issue I'm running into.
Transaction events representing amounts deposited into a bank account are
inserted sequentially. The goal is to detect a transaction that is higher
than the average from a rolling window. What I'm expecting is that only the
most recent insertion is compared with the average from the window. However,
I'm observing that all previous events in the window are re-evaluated each
time a new event is inserted. So events that previously were below the
average (at that point in time) may now be above the average since
subsequent events brought the average down. I don't want those transactions
to be re-evaluated.

Here's my rule:
        declare Transaction
                @role(event)
        end
        
        rule "Higher than average amount"
        when
                $transaction : Transaction($account : getAccount(), $amount : 
getAmount())
                Number($avg : doubleValue, $amount > $avg) from
accumulate(Transaction(getAccount() == $account, $amt : getAmount()) over
window:length(100), average($amt))
        then
                System.out.println("\t***ALERT***: Higher than average 
transaction amount
(Average = " + $avg + "): " + $transaction.toString());
        end


Here's a snippet from my Java class:
        public static final void main(String[] args) {
                try {
                        // Load the knowledge base
                        KieServices ks = KieServices.Factory.get();
                        KieContainer kContainer = ks.getKieClasspathContainer();
                        KieSession kSession = 
kContainer.newKieSession("ksession-rules");

                        // Insert events
                        List<Transaction> list = getEvents();
                        for (Transaction event : list) {
                                printEvent(event);
                                kSession.insert(event);
                                kSession.fireAllRules();
                        }
                } catch (Throwable t) {
                        t.printStackTrace();
                }
        }

        private static List<Transaction> getEvents() {
                List<Transaction> list = new Vector<Transaction>();

                list.add(new Transaction(1, 600));
                list.add(new Transaction(1, 600));
                list.add(new Transaction(1, 800)); // This should trigger an 
alert
                list.add(new Transaction(1, 100)); // This should NOT 
re-evaluate previous
transactions

                return list;
        }

This is my kmodule.xml:
        <?xml version="1.0" encoding="UTF-8"?>
        <kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule";>
        <kbase name="rules" eventProcessingMode="stream" packages="rules">
                <ksession name="ksession-rules"/>
        </kbase>
        </kmodule>

I'm using 6.0.0.Final.

Any help is appreciated!



--
View this message in context: 
http://drools.46999.n3.nabble.com/Prevent-re-evaluation-of-events-in-stream-mode-tp4027171.html
Sent from the Drools: User forum mailing list archive at Nabble.com.
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to