[rules-users] Another solution for: Detecting more than 3 occurrences within 1 hour

Wolfgang Laun wolfgang.laun at gmail.com
Fri Aug 6 05:15:38 EDT 2010


2010/8/5 Tina Vießmann <tviessmann at stud.hs-bremen.de>

>  Thank you for this approach, Wolfgang. That sounds great.  :)
> I just have some further question about your solution.
>
> #1
> I'm thinking about an approach without the need modifying things outside
> the drl file. Is something like that doable?
> Because I have to create the watcher class? (I don't expect it to be, but
> why not ask. ;))
>

The DRL language provides "declare" (see Section 4.7 in the Expert manual).
Metadata is described in the Fusion manual.



>
> #2
>
> (What and count are somewhat redundant, but this avoids clumsy patterns.)
>
> Am I right that what and count have to be defined as global variables and
> initialized using setGlobal() (from a part of the java application)?
>

No! See the Java snippet "class Watcher". (If you use declare, you'll have
to do the initializations after creation.)


>
> #3
>
> rule addEvent
> when
>  $watcher : Watcher( $eventA : what, $set : valueSet )
>  $eventB : Value( this after[0ms,1h] $eventA  &&
>   //                                   this != $eventA  &&      ### set
> includes Watcher.what
>
>  eval(valueExceededLimit($eventB.getAlarms()) && ! $set.contains( this ) ) )
>
> I'm sorry, could you explain to me the part of $eventB in sentences,
> please? I've got confused by the comments... :(
>

If there is
a Watcher watching $eventA and with a set of related events $set,
and
a Value less than 1hr later than $eventA and with more alarms than limit and
Watcher's $set does not contain this Value
then...

The line I commented out isn't necessary as I propose to add the very 1st
event tied to the Watcher to this Watcher's list.


>
> Thank you very much! :)
>

You're welcome.
-W


> Tina
>
>
>
> Basic idea: associate a Watcher with each event.
>
> class Watcher {
>    Value what;
>    int count = 1;
>    Set<Value> valueSet = new HashSet<Value>();
>    Watcher( Value first ){
>       valueSet.add( what = first );
>    }
>    //...
> }
>
> And now the rules:
>
> rule attachWatcher
> when
>   $event : Value( eval(parameterValueExceededLimit($eventA.getAlarms())) )
>   not( Watcher( what == $event ) )
> then
>   insert( new Watcher( $event ) );
> end
>
> rule addEvent
> when
>  $watcher : Watcher( $eventA : what, $set : valueSet )
>  $eventB : Value( this after[0ms,1h] $eventA  &&
>   //                                   this != $eventA  &&      ### set
> includes Watcher.what
>
>  eval(valueExceededLimit($eventB.getAlarms()) && ! $set.contains( this ) ) )
> then
>   modify( $watcher ){
>       setValueList( $watcher.getValueSet().add( $eventB ),
>       setCount( $watcher.getCount() + 1 )
>   }
> end
>
> rule testLimit
> when
>    $watcher : Watcher( count > Limit )
> then
>   // raise hell,
>   // probably: get rid of all in $watcher.set, and $watcher
> end
>
> (What and count are somewhat redundant, but this avoids clumsy patterns.)
>
> Watcher should be declared as Event, with @expires, so they'll disappear
> with the (primary) Event each one is watching.
>
> Cheers
> -W
>
>
> 2010/8/5 Tina Vießmann <tviessmann at stud.hs-bremen.de>
>
>> Hi,
>>
>> I'm working on thinking in Drools rules. Right now I'm trying to solve
>> this:
>>   The rule shall fire if *a special event occurs more than 3 times within
>> 1 hour*.
>>
>> My *first thought of a solution* was to count the count the detected
>> events using a counter. But the counter has to be a global variable, hasn't
>> it? And global variables are not to be used to frequently, aren't they?
>> And global variables must always be initialized from outside the rules
>> file, don't they?
>>
>> Because of these thoughts I've looked for a *different solution without
>> global variables*. I came up with:
>>
>> function boolean valueExceededLimit(Set<Alarms> alarmSet) {
>>    //....
>> }
>>
>> rule "more than 3 occurs within 1 hour"
>>
>>     when
>>         // event #1
>>         $eventA : Value(
>> eval(parameterValueExceededLimit($eventA.getAlarms())) )
>>         // event #2
>>         $eventB : Value( this after[0ms,1h] $eventA  &&
>>                                     this != $eventA  &&
>>
>>  eval(valueExceededLimit($eventB.getAlarms())) )
>>         // event #3
>>         $eventC : Value( this after[0ms,1h] $eventA  &&
>>                                     this != $eventA  &&
>>                                     this != $eventB  &&
>>
>>  eval(valueExceededLimit($eventC.getAlarms())) )
>>         // event #4  ->  4 > 3
>>         $eventD : Value( this after[0ms,1h] $eventA  &&
>>                                     this != $eventA  &&
>>                                     this != $eventB  &&
>>                                     this != $eventC  &&
>>
>>  eval(valueExceededLimit($eventD.getAlarms())) )
>>
>>     then
>>         // ... do something ...
>>
>> end
>>
>>
>> More than 3 is kind of a doable task. But I think of this solution as
>> heavy in case its needed to detect a larger number of events. I would be
>> thankful for other approaches to the problem.
>>
>>
>> Thanks :)
>> Tina
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>
> _______________________________________________
> rules-users mailing listrules-users at lists.jboss.orghttps://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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20100806/c920dfeb/attachment.html 


More information about the rules-users mailing list