[rules-users] How to write a rule like this

Wolfgang Laun wolfgang.laun at gmail.com
Tue Oct 26 12:08:40 EDT 2010


2010/10/26 赵侃侃 <kevin223 at gmail.com>:
> It's getting closer now but still has one problem that it reports for a
> pattern match where there's an EventB with same index value in between.
> The Testing events feed pattern that I use can be described as below:
> EventA:0   EventB:1   EventA:0   EventB:1   EventA:1   EventB:0   EventA:0
> here it reports for a pattern match where it shouldn't  EventB:1

This works for me, i.e., no match is reported, using the rule

rule "three A"
when
  $a1: EventA( $index : index )
  $a2: EventA( index == $index, this != $a1 && after[0s] $a1 )
  $a3: EventA( index == $index, this != $a1 && != $a2 && after[0s] $a2 )
##  not PatternConsumer( id == "AAA", events contains $a1 || contains
$a2 || contains $a3 )

  not EventB( this after[0ms] $a1 && before[0ms] $a3, index == $index )
then
  System.out.println( "AAA match " + $index );
  PatternConsumer pc = new PatternConsumer("AAA", $a1, $a2, $a3 );
  insert( pc );
end



> Best Regards,
> Kevin Zhao
>
> 在 2010年10月26日 下午4:33,Wolfgang Laun <wolfgang.laun at gmail.com>写道:
>>
>> If there may be two EventA with the same timestamp, additional
>> constraints may be necessary, and
>> after may have to be used with a start time of 0ms:
>>
>>  $a1: EventA( $index : index )
>>  $a2: EventA( this != $a1 && after[0ms] $a1, index == $index )
>>  $a3: EventA( this != $a1 && != $a2 && after[0ms] $a2, index == $index )
>>
>> -W
>>
>>
>> 2010/10/26 赵侃侃 <kevin223 at gmail.com>:
>> > 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 at 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 at 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 at 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 at 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 at 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 at lists.jboss.org
>> >>>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>> >>>>>>
>> >>>>>
>> >>>>>
>> >>>>> _______________________________________________
>> >>>>> rules-users mailing list
>> >>>>> rules-users at lists.jboss.org
>> >>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>> >>>>>
>> >>>>
>> >>>>
>> >>>> _______________________________________________
>> >>>> rules-users mailing list
>> >>>> rules-users at lists.jboss.org
>> >>>> https://lists.jboss.org/mailman/listinfo/rules-users
>> >>>>
>> >>>
>> >>>
>> >>> _______________________________________________
>> >>> rules-users mailing list
>> >>> rules-users at lists.jboss.org
>> >>> https://lists.jboss.org/mailman/listinfo/rules-users
>> >>>
>> >>
>> >>
>> >> _______________________________________________
>> >> rules-users mailing list
>> >> rules-users at lists.jboss.org
>> >> https://lists.jboss.org/mailman/listinfo/rules-users
>> >>
>> >
>> >
>> > _______________________________________________
>> > rules-users mailing list
>> > rules-users at lists.jboss.org
>> > https://lists.jboss.org/mailman/listinfo/rules-users
>> >
>> >
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>




More information about the rules-users mailing list