Hi Again,

 

After some digging I still have a couple of question regarding CEP events and windows in a testing environment.

 

Rules:

 

declare ParameterUpdateEvent

      @role(event)

end

 

rule "Set Parameter Value"

      when

            ParameterUpdateEvent($name : name, $newParamValue : value)

                  from entry-point "ParamUpdateStream"

            $param : Parameter(name == $name)

      then

            $param.setValue($newParamValue);

            System.out.println("New value = " + $param.getValue());

end

 

rule "Print Average"

      when

            ParameterUpdateEvent($paramName : name, $newParamValue : value)

                  from entry-point "ParamUpdateStream"

            $param : Parameter(name == $paramName)

            $averageUpdateValue : Number(doubleValue >= 1) from accumulate(

                  ParameterUpdateEvent(name == $paramName, $value : value)

                  over window:length( 5 )

                  from entry-point "ParamUpdateStream", average($value))

                 

            #Number($averageUpdateValue : doubleValue)

      then

            #System.out.println("Here");

            System.out.println("Average update value for " + $paramName +

                  " = " + $averageUpdateValue);

end

 

·         Declare the ParameterUpdateEvent

·         Rule to update the parameter in working memory with the value in the event: “Set Parameter Value”

·         Rule to print an average over 5 updates.

 

As you can see I define the window as a length of 5 so I would expect to have 5 updates events at any given time, and I do when I don’t use a pseudo clock in my test.

 

Test with no pseudo clock:

·         Add 56 – Average output is 56.0

·         Add 89 – Average output is 72.5

·         Add 3 – Average output is 49.33

·         Add 50 – Average output is 49.5

·         Add 90 – Average output is 57.6

 

As I am still learning about Drools and CEP within Drools the next step I took was to associate a pseudo clock with the session:

 

KnowledgeSessionConfiguration config =

                  KnowledgeBaseFactory.newKnowledgeSessionConfiguration();

            config.setOption(ClockTypeOption.get("pseudo"));

           

            mSession = mKnowledgeBase.newStatefulKnowledgeSession(config, null);

mClock = (SessionPseudoClock)mSession.getSessionClock();

 

And then increment the time before each event insert:

mClock.advanceTime(1, TimeUnit.SECONDS);

 

I am not sure why that has an effect because my window is still defined as length based so time should not be a factory at all. What I am seeing is:

·         Add 56 – Average output is 56.0

·         Add 89 – Average output is 89.0

·         Add 3 – Average output is 3.0

·         Add 50 – Average output is 50.0

·         Add 90 – Average output is 90.0

 

From the above, and the logging output which states the previous event is retracted when the next event is inserted, this does not seem to be using the sliding window. Why does adding the advanceTime call cause this to happen. At the end of the day these rules do need to be time based and I do need to test them using JUnit.

 

Thanks

 

 Glenn

 

 

From: rules-users-bounces@lists.jboss.org [mailto:rules-users-bounces@lists.jboss.org] On Behalf Of Glenn Macgregor
Sent: 16 February 2010 10:32
To: Rules Users List
Subject: Re: [rules-users] CEP Question

 

Please ignore my last message, sent by mistake!

 

Sorry for the confusion.

 

 Glenn

 

From: rules-users-bounces@lists.jboss.org [mailto:rules-users-bounces@lists.jboss.org] On Behalf Of Edson Tirelli
Sent: 15 February 2010 20:08
To: Rules Users List
Subject: Re: [rules-users] CEP Question

 


   Hi Glen,

   The averages are indeed recalculated on event expiration. Example:

You have values for the following events:

e1: 20
e2: 30
e3: 40

    So the average is 30. Whenever e1 is expired in your window, the average is recalculated to 35 (assuming no new event arrived).

    What are you seeing there?

    Edson

2010/2/15 Glenn Macgregor <gmacgregor@pocketkings.ie>

Hi All,

 

I am still working through a CEP use case which is going fairly well. I have a few rules and it seems they are working as I expect. Is there a way to get called back when events go out of a time window? My current use case is alerting, I have a stream of events (param updates) coming in and I create a ParamUpdateEvent for each. I have a rule which averages the values in the ParamUpdateEvent and tests against a threshold, that is working fine. The problem is when I don’t receive any events for a period of time over the window size I really want to the rule which calculates the average to fire when anything is moved out of the window as well as when an update arrives, is this possible?

 

Thanks

 

 Glenn


_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users




--
 Edson Tirelli
 JBoss Drools Core Development
 JBoss by Red Hat @ www.jboss.com