Try the following separation of the computation of the average from the detection of critical events.
The first rule with a salience > 0 simply computes the average of all Events and update a singular Fact (Average) containing a field with the running average value. A second rule matches on Average and the kind of Event you're interested and tests the duration, e.g. Average( $v: value ) Event( name == "MyService", duration > $v ) -W On 05/12/2013, ters <t...@ukr.net> wrote: > laune, > I've tried your proposed accumulate approach, the Result of > test1_FireAllRules() is: > -= 1 =- > $events avg duration = 2.0 > ----------FIRED---------- > -= 2 =- > $events avg duration = 2.0 > ----------FIRED---------- > -= 3 =- > $events avg duration = 7.0 > ----------FIRED---------- > ---test1 end--- > Ok, it fires for each new inserted event (between fireAllRules calls) and > calculates avg for all events witn name "MyService". > But, as I wrote in first post, I need to fire a rule if last inserting > event > duration > greater than value which depends on average duration of all events from the > wm. Lets take $avg/10(/10 - take for convenience to show issue). > So I need to add pattern along with accumulate: > / Number( $avg: doubleValue ) from accumulate( ServicePerformanceEvent( > $name: serviceName, $thisDuration: duration), > init( double sum = 0; double count = 0; ) > action( if("MyService".equals($name)){ > sum += $thisDuration; > count++;}) > result( count != 0 ? sum/count : 0 ) ); > > $event : ServicePerformanceEvent(serviceName == "MyService", duration > > */$avg/10/*);/ > Result of test1_FireAllRules(): > -= 1 =- > $event.duration = 2 > $events avg duration = 2.0 > ----------FIRED---------- > -= 2 =- > $event.duration = 2 > $events avg duration = 2.0 > ----------FIRED---------- > -= 3 =- > $event.duration = 12 > $events avg duration = 7.0 > ----------FIRED---------- > $event.duration = 2 > $events avg duration = 7.0 > ----------FIRED---------- > ---test1 end--- > > As can see, it fires on both for newly inserted event and for old already > matched events/facts. > Ok, if rule analyzes all previous events/facts I decide to check previous > rule with test: > / @Test > public void test12_FireAllRules() throws RuleGeneratorException { > System.out.println("-= 1 =-"); > ksession.insert(new ServicePerformanceEvent("MyService", 2)); > ksession.fireAllRules(); > > System.out.println("-= 2 =-"); > ksession.insert(new ServicePerformanceEvent("AnotherService", > 10)); > ksession.fireAllRules(); > > System.out.println("-= 3 =-"); > ksession.insert(new ServicePerformanceEvent("MyService", 12)); > ksession.fireAllRules(); > > */ System.out.println("-= 4 =-"); > ksession.fireAllRules(); // call firing without inserting event > after > last > fire/* > System.out.println("---test1 end---"); > }/ > Result of test12_FireAllRules(): > -= 1 =- > $event.duration = 2 > $events avg duration = 2.0 > ----------FIRED---------- > -= 2 =- > $event.duration = 2 > $events avg duration = 2.0 > ----------FIRED---------- > -= 3 =- > $event.duration = 12 > $events avg duration = 7.0 > ----------FIRED---------- > $event.duration = 2 > $events avg duration = 7.0 > ----------FIRED---------- > /-= 4 =- > ---test1 end---/ > > And what I see, in case -3- the rule analyzed both new and old facts... > but in case -4- the rule analyzed nothing! though, as in case -3-, there > were potentially matched old facts. > I completely don't understand such behavior... > Again, what I need for last test is: > -= 1 =- > $event.duration = 2 > $events avg duration = 2.0 > ----------FIRED---------- > -= 2 =- > -= 3 =- > /$event.duration = 12 > $events avg duration = 7.0/ > ----------FIRED---------- > -= 4 =- > ---test1 end--- > > > > -- > View this message in context: > http://drools.46999.n3.nabble.com/CEP-accumulate-unclear-behavior-tp4027069p4027107.html > Sent from the Drools: User forum mailing list archive at Nabble.com. > _______________________________________________ > 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