[rules-users] Prevent re-evaluation of events in stream mode

sumantp sumantp at yahoo.com
Mon Dec 9 12:59:12 EST 2013


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.


More information about the rules-users mailing list