That¡¯s because $a1 can equal $a2 which can equal $a3.
The following should ensure that the events are distinct and processed in the right order (there didn¡¯t seem to be anything stopping $a2 from being matched
totally out of sequence.
$a1: EventA( $index : index )
$a2: EventA( index == $index, this after $a1 )
$a3: EventA( index == $index, this after $a2 )
not PatternConsumer( name == 'AAA', events contain $a1 || contais $a2 || contains $a3)
not EventB( this after[0ms] $a1 && before[0ms] $a3, index == $index )
From: rules-users-bounces@lists.jboss.org [mailto:rules-users-bounces@lists.jboss.org]
On Behalf Of ???
Sent: 26 October 2010 09:08
To: Rules Users List
Subject: Re: [rules-users] How to write a rule like this
Hello,
Hello,
I just tried this rule, but it doesn't seem to work as expected.
What I have now is every time I have an EventA received then a pattern is reported matched no matter whether any of the other constrains is met.
Any ideas?
Best Regards,
Kevin Zhao
2010/10/26 Michael Anstis <michael.anstis@gmail.com>
You could try this too; if you don't want lots of new attributes for your model:-
rule "three A"
when
$a1: EventA( $index : index )
$a2: EventA( index == $index )
$a3: EventA( index == $index )
not PatternConsumer( name == 'AAA', events contain $a1 || contais $a2 || contains $a3)
not EventB( this after[0ms] $a1 && before[0ms] $a3, index == $index )
then
// ... match
PatternConsumer pc = new PatternConsumer("AAA", $a1, $a2, $a3 );
insert(pc);
end
2010/10/25 Wolfgang Laun <wolfgang.laun@gmail.com>
Giving those other rules a higher salience is one way, but I think
it is better to add a boolean field "usedForAAA" to class EventA.
rule "three A"
when
$a1: EventA( $index : index, usedForAAA == false )
$a2: EventA( index == $index, usedForAAA == false )
$a3: EventA( index == $index, usedForAAA == false )
not EventB( this after[0ms] $a1 && before[0ms] $a3, index == $index )
then
// ... match
modify( $a1 ){ setUsedForAAA( true ) }
modify( $a2 ){ setUsedForAAA( true ) }
modify( $a3 ){ setUsedForAAA( true ) }
end
-W
2010/10/25 ÕÔ٩٩ <kevin223@gmail.com>
Thanks Wolfgang,
It now starts to make sense to me. However, is it possible that I don't retract those matched eventA? All those events might be used to evaluate against other rules.
Thanks again,
Kevin Zhao
2010/10/25 Wolfgang Laun <wolfgang.laun@gmail.com>
I assume you are using Fusion, using a session clock so that temporal operators are available.
rule "three A"
when
$a1: EventA( $index : index )
$a2: EventA( index == $index )
$a3: EventA( index == $index )
not EventB( this after[0ms] $a1 && before[0ms] $a3, index == $index )
then
// ... match
retract( $a1 );
retract( $a2 );
retract( $a3 );
end
-W
2010/10/25 ÕÔ٩٩ <kevin223@gmail.com>
Hello,
I'm still quite new to the drools stuffs just getting the examples running. I'm sorry if my question is too basic.
I have a system that will continuously to receive events sent from some other system. Basically I have two types of events, eventA and eventB.
Both eventA and eventB have two properties, index and timestamp.
What I want is to capture a pattern to meet the following conditions
1. every 3 consecutive eventsA without any eventB in between having a same index value ordering by their timestamp.
2. all events in a matched pattern will have the same value of property index.
3. if a pattern is matched, any of the events in this pattern should not be used again for a new matching.
there are some examples below, the number after a colon stands for the value of its index number and assume those events are already ordered by their timestamp.
eventB:2
eventA:1
eventA:1
eventA:1
eventB:3
--------- one successful match, we have three eventA with same index value 1 in a row
eventB:2
eventA:1
eventA:1
eventB:1
eventA:1
--------- no match because there's an eventB in between
eventB:2
eventA:1
eventA:1
eventB:2
eventA:1
--------- one successful match because the in-between eventB has a different index value
eventA:1
eventA:1
eventA:1
eventA:1
eventA:1
--------- only one match, because once matched, the events can not be used for a second match again.
I just don't know how to write a rule like this. Is there anyone who can shed some lights on?
Best Regards,
Kevin
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users