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-stre...
Sent from the Drools: User forum mailing list archive at
Nabble.com.