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 <ters(a)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-tp40270...
Sent from the Drools: User forum mailing list archive at
Nabble.com.
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users