[rules-users] keeping running stats
Hello, I have modified the stockTicker fusion example to keep some running stats, you can see from the rule snippet below that it injects a stats object based on the symbol then matches them as updates come in later. You can see for now I am just updating the running counts and outputting the readings count on each stock tick and this works fine. What I would like to do however is only have the running averages,stats object reflect stock ticks that are still in memory..essentiall only stock tick items that have not expired. As it is now the count just keeps growing and growing, I want the count to only reflect the stock ticks within the expiration time in the past for stock ticks, but I cannot figure out how to make this happen?Could anyone give me a pointer on how to do this? How to make the stats object only reflect those stock ticks that have not expired? I do not know the strategy for this. Thanks, Chris # tells the engine that a StockTick instance will assume the # role (semantics) of events and that the default retention # policy will be 2 minutes declare StockTick @role( event ) @expires( 1m ) end # One can even declare helper facts to make rules easier and # simpler to write and maintain declare Statistics symbol : String @key() average : double readings : int total : double end rule Setup statistics when $c : Company( $s : symbol ) not( Statistics( symbol == $s ) ) then Statistics s = new Statistics(); s.symbol = $s; s.readings = s.readings + 1; insert( s ); end # a simple rule to show that it is possible to join # events from an entry-point (stream) with facts # present in the working memory rule Update stock stats agenda-group evaluation lock-on-active when $cp : Company( $sb : symbol ) $st : StockTick( symbol == $sb, $pr : price ) from entry-point StockTick stream $stats : Statistics( symbol == $sb ) then modify( $stats ) { readings = readings + 1}; System.err.println($stats.symbol + readings: + $stats.readings); // This shows an update on working memory facts with data from joined events //modify( $cp ) { currentPrice = $pr } // Although events are considered immutable, a common pattern is to use a class // to represent an event and enrich that event instance with data derived from other facts/events. // Bellow we enrich the event instance with the percentual change in the price, // based on the previous price //modify( $st ) { delta = $cp.delta } //modify( $st ) { readings = 5 } //System.out.println($st.delta) end ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
Re: [rules-users] keeping running stats
Hi Chris, You can use 'accumulate' with sliding time window. Have a look here http://downloads.jboss.com/drools/docs/5.0.1.26597.FINAL/drools-fusion/html/ch02.html#d0e1169 rule Sound the alarm in case temperature rises above threshold when TemperatureThreshold( $max : max ) Number( doubleValue $max ) from accumulate( SensorReading( $temp : temperature ) over window:time( 10m ), average( $temp ) ) then // sound the alarm end The engine will automatically discard any SensorReading older than 10 minutes and keep the calculated average consistent. Is that what you're looking for? Michal 2009/5/27 Chris Richmond crichm...@referentia.com Hello, I have modified the stockTicker fusion example to keep some running stats, you can see from the rule snippet below that it injects a stats object based on the symbol then matches them as updates come in later. You can see for now I am just updating the running counts and outputting the readings count on each stock tick and this works fine. What I would like to do however is only have the running averages,stats object reflect stock ticks that are still in memory….essentiall only stock tick items that have not expired. As it is now the count just keeps growing and growing, I want the count to only reflect the stock ticks within the expiration time in the past for stock ticks, but I cannot figure out how to make this happen?Could anyone give me a pointer on how to do this? How to make the stats object only reflect those stock ticks that have not expired? I do not know the strategy for this. Thanks, Chris # tells the engine that a StockTick instance will assume the # role (semantics) of events and that the default retention # policy will be 2 minutes *declare* StockTick @role( event ) @expires( 1m ) *end* # One can even declare helper facts to make rules easier and # simpler to write and maintain *declare* Statistics symbol : String @key() average : *double* readings : *int* total : *double* *end* *rule* Setup statistics *when* $c : Company( $s : symbol ) *not*( Statistics( symbol == $s ) ) *then* Statistics s = *new* Statistics(); s.symbol = $s; s.readings = s.readings + 1; *insert*( s ); *end* # a simple rule to show that it is possible to join # events from an entry-point (stream) with facts # present in the working memory *rule* Update stock stats *agenda-group* evaluation *lock-on-active* *when* $cp : Company( $sb : symbol ) $st : StockTick( symbol == $sb, $pr : price ) *from* entry-point StockTick stream $stats : Statistics( symbol == $sb ) *then* *modify*( $stats ) { readings = readings + 1}; System.err.println($stats.symbol + readings: + $stats.readings); // This shows an update on working memory facts with data from joined events //modify( $cp ) { currentPrice = $pr } // Although events are considered immutable, a common pattern is to use a class // to represent an event and enrich that event instance with data derived from other facts/events. // Bellow we enrich the event instance with the percentual change in the price, // based on the previous price //modify( $st ) { delta = $cp.delta } //modify( $st ) { readings = 5 } //System.out.println($st.delta) *end* ___ 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
RE: [rules-users] keeping running stats
Yes.tha's what I'm looking for and as a matter of fact I tried to implement that rule into the stocktick example thusly.I want to see the average over the last 5m..but this rule NEVER fires and I don't know why rule identify when the average is over a value when Number( doubleValue 1.0 ) from accumulate( StockTick( $pr : price, symbol == IBM ) over window:time( 5m ), average( $pr ) ) then System.out.println(average over 105); end _ From: rules-users-boun...@lists.jboss.org [mailto:rules-users-boun...@lists.jboss.org] On Behalf Of Michal Bali Sent: Wednesday, May 27, 2009 11:09 AM To: Rules Users List Subject: Re: [rules-users] keeping running stats Hi Chris, You can use 'accumulate' with sliding time window. Have a look here http://downloads.jboss.com/drools/docs/5.0.1.26597.FINAL/drools-fusion/html/ ch02.html#d0e1169 rule Sound the alarm in case temperature rises above threshold when TemperatureThreshold( $max : max ) Number( doubleValue $max ) from accumulate( SensorReading( $temp : temperature ) over window:time( 10m ), average( $temp ) ) then // sound the alarm end The engine will automatically discard any SensorReading older than 10 minutes and keep the calculated average consistent. Is that what you're looking for? Michal 2009/5/27 Chris Richmond crichm...@referentia.com Hello, I have modified the stockTicker fusion example to keep some running stats, you can see from the rule snippet below that it injects a stats object based on the symbol then matches them as updates come in later. You can see for now I am just updating the running counts and outputting the readings count on each stock tick and this works fine. What I would like to do however is only have the running averages,stats object reflect stock ticks that are still in memory..essentiall only stock tick items that have not expired. As it is now the count just keeps growing and growing, I want the count to only reflect the stock ticks within the expiration time in the past for stock ticks, but I cannot figure out how to make this happen?Could anyone give me a pointer on how to do this? How to make the stats object only reflect those stock ticks that have not expired? I do not know the strategy for this. Thanks, Chris # tells the engine that a StockTick instance will assume the # role (semantics) of events and that the default retention # policy will be 2 minutes declare StockTick @role( event ) @expires( 1m ) end # One can even declare helper facts to make rules easier and # simpler to write and maintain declare Statistics symbol : String @key() average : double readings : int total : double end rule Setup statistics when $c : Company( $s : symbol ) not( Statistics( symbol == $s ) ) then Statistics s = new Statistics(); s.symbol = $s; s.readings = s.readings + 1; insert( s ); end # a simple rule to show that it is possible to join # events from an entry-point (stream) with facts # present in the working memory rule Update stock stats agenda-group evaluation lock-on-active when $cp : Company( $sb : symbol ) $st : StockTick( symbol == $sb, $pr : price ) from entry-point StockTick stream $stats : Statistics( symbol == $sb ) then modify( $stats ) { readings = readings + 1}; System.err.println($stats.symbol + readings: + $stats.readings); // This shows an update on working memory facts with data from joined events //modify( $cp ) { currentPrice = $pr } // Although events are considered immutable, a common pattern is to use a class // to represent an event and enrich that event instance with data derived from other facts/events. // Bellow we enrich the event instance with the percentual change in the price, // based on the previous price //modify( $st ) { delta = $cp.delta } //modify( $st ) { readings = 5 } //System.out.println($st.delta) end ___ 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
RE: [rules-users] keeping running stats
Notice I set the average to something very low that I know would be exceeded. _ From: rules-users-boun...@lists.jboss.org [mailto:rules-users-boun...@lists.jboss.org] On Behalf Of Michal Bali Sent: Wednesday, May 27, 2009 11:09 AM To: Rules Users List Subject: Re: [rules-users] keeping running stats Hi Chris, You can use 'accumulate' with sliding time window. Have a look here http://downloads.jboss.com/drools/docs/5.0.1.26597.FINAL/drools-fusion/html/ ch02.html#d0e1169 rule Sound the alarm in case temperature rises above threshold when TemperatureThreshold( $max : max ) Number( doubleValue $max ) from accumulate( SensorReading( $temp : temperature ) over window:time( 10m ), average( $temp ) ) then // sound the alarm end The engine will automatically discard any SensorReading older than 10 minutes and keep the calculated average consistent. Is that what you're looking for? Michal 2009/5/27 Chris Richmond crichm...@referentia.com Hello, I have modified the stockTicker fusion example to keep some running stats, you can see from the rule snippet below that it injects a stats object based on the symbol then matches them as updates come in later. You can see for now I am just updating the running counts and outputting the readings count on each stock tick and this works fine. What I would like to do however is only have the running averages,stats object reflect stock ticks that are still in memory..essentiall only stock tick items that have not expired. As it is now the count just keeps growing and growing, I want the count to only reflect the stock ticks within the expiration time in the past for stock ticks, but I cannot figure out how to make this happen?Could anyone give me a pointer on how to do this? How to make the stats object only reflect those stock ticks that have not expired? I do not know the strategy for this. Thanks, Chris # tells the engine that a StockTick instance will assume the # role (semantics) of events and that the default retention # policy will be 2 minutes declare StockTick @role( event ) @expires( 1m ) end # One can even declare helper facts to make rules easier and # simpler to write and maintain declare Statistics symbol : String @key() average : double readings : int total : double end rule Setup statistics when $c : Company( $s : symbol ) not( Statistics( symbol == $s ) ) then Statistics s = new Statistics(); s.symbol = $s; s.readings = s.readings + 1; insert( s ); end # a simple rule to show that it is possible to join # events from an entry-point (stream) with facts # present in the working memory rule Update stock stats agenda-group evaluation lock-on-active when $cp : Company( $sb : symbol ) $st : StockTick( symbol == $sb, $pr : price ) from entry-point StockTick stream $stats : Statistics( symbol == $sb ) then modify( $stats ) { readings = readings + 1}; System.err.println($stats.symbol + readings: + $stats.readings); // This shows an update on working memory facts with data from joined events //modify( $cp ) { currentPrice = $pr } // Although events are considered immutable, a common pattern is to use a class // to represent an event and enrich that event instance with data derived from other facts/events. // Bellow we enrich the event instance with the percentual change in the price, // based on the previous price //modify( $st ) { delta = $cp.delta } //modify( $st ) { readings = 5 } //System.out.println($st.delta) end ___ 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
RE: [rules-users] keeping running stats
I think the problem is that the stockticks aren't being processed unless I use the: From entry-point StockTick stream But I can't combine from accumulate with that from statement successfully in that sample I sent. I think that is the problem . The sample I sent, none of those ever get processed since it is not looking at the proper entry point. _ From: rules-users-boun...@lists.jboss.org [mailto:rules-users-boun...@lists.jboss.org] On Behalf Of Michal Bali Sent: Wednesday, May 27, 2009 11:09 AM To: Rules Users List Subject: Re: [rules-users] keeping running stats Hi Chris, You can use 'accumulate' with sliding time window. Have a look here http://downloads.jboss.com/drools/docs/5.0.1.26597.FINAL/drools-fusion/html/ ch02.html#d0e1169 rule Sound the alarm in case temperature rises above threshold when TemperatureThreshold( $max : max ) Number( doubleValue $max ) from accumulate( SensorReading( $temp : temperature ) over window:time( 10m ), average( $temp ) ) then // sound the alarm end The engine will automatically discard any SensorReading older than 10 minutes and keep the calculated average consistent. Is that what you're looking for? Michal 2009/5/27 Chris Richmond crichm...@referentia.com Hello, I have modified the stockTicker fusion example to keep some running stats, you can see from the rule snippet below that it injects a stats object based on the symbol then matches them as updates come in later. You can see for now I am just updating the running counts and outputting the readings count on each stock tick and this works fine. What I would like to do however is only have the running averages,stats object reflect stock ticks that are still in memory..essentiall only stock tick items that have not expired. As it is now the count just keeps growing and growing, I want the count to only reflect the stock ticks within the expiration time in the past for stock ticks, but I cannot figure out how to make this happen?Could anyone give me a pointer on how to do this? How to make the stats object only reflect those stock ticks that have not expired? I do not know the strategy for this. Thanks, Chris # tells the engine that a StockTick instance will assume the # role (semantics) of events and that the default retention # policy will be 2 minutes declare StockTick @role( event ) @expires( 1m ) end # One can even declare helper facts to make rules easier and # simpler to write and maintain declare Statistics symbol : String @key() average : double readings : int total : double end rule Setup statistics when $c : Company( $s : symbol ) not( Statistics( symbol == $s ) ) then Statistics s = new Statistics(); s.symbol = $s; s.readings = s.readings + 1; insert( s ); end # a simple rule to show that it is possible to join # events from an entry-point (stream) with facts # present in the working memory rule Update stock stats agenda-group evaluation lock-on-active when $cp : Company( $sb : symbol ) $st : StockTick( symbol == $sb, $pr : price ) from entry-point StockTick stream $stats : Statistics( symbol == $sb ) then modify( $stats ) { readings = readings + 1}; System.err.println($stats.symbol + readings: + $stats.readings); // This shows an update on working memory facts with data from joined events //modify( $cp ) { currentPrice = $pr } // Although events are considered immutable, a common pattern is to use a class // to represent an event and enrich that event instance with data derived from other facts/events. // Bellow we enrich the event instance with the percentual change in the price, // based on the previous price //modify( $st ) { delta = $cp.delta } //modify( $st ) { readings = 5 } //System.out.println($st.delta) end ___ 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
Re: [rules-users] keeping running stats
Definitively. That for sure will cause a problem, because each entry point is like a partition in the data set space. To make this work, just use the from entry-point: Number( doubleValue 1.0 ) *from* *accumulate*( StockTick( $pr : price, symbol == IBM ) over window:time( 5m ) from entry-point StockTick stream, average( $pr ) ) []s Edson 2009/5/27 Chris Richmond crichm...@referentia.com I think the problem is that the stockticks aren’t being processed unless I use the: From entry-point “StockTick stream” But I can’t combine “from accumulate” with that from statement successfully in that sample I sent. I think that is the problem . The sample I sent, none of those ever get processed since it is not looking at the proper entry point… -- *From:* rules-users-boun...@lists.jboss.org [mailto: rules-users-boun...@lists.jboss.org] *On Behalf Of *Michal Bali *Sent:* Wednesday, May 27, 2009 11:09 AM *To:* Rules Users List *Subject:* Re: [rules-users] keeping running stats Hi Chris, You can use 'accumulate' with sliding time window. Have a look here http://downloads.jboss.com/drools/docs/5.0.1.26597.FINAL/drools-fusion/html/ch02.html#d0e1169 rule Sound the alarm in case temperature rises above threshold when TemperatureThreshold( $max : max ) Number( doubleValue $max ) from accumulate( SensorReading( $temp : temperature ) over window:time( 10m ), average( $temp ) ) then // sound the alarm end The engine will automatically discard any SensorReading older than 10 minutes and keep the calculated average consistent. Is that what you're looking for? Michal 2009/5/27 Chris Richmond crichm...@referentia.com Hello, I have modified the stockTicker fusion example to keep some running stats, you can see from the rule snippet below that it injects a stats object based on the symbol then matches them as updates come in later. You can see for now I am just updating the running counts and outputting the readings count on each stock tick and this works fine. What I would like to do however is only have the running averages,stats object reflect stock ticks that are still in memory….essentiall only stock tick items that have not expired. As it is now the count just keeps growing and growing, I want the count to only reflect the stock ticks within the expiration time in the past for stock ticks, but I cannot figure out how to make this happen?Could anyone give me a pointer on how to do this? How to make the stats object only reflect those stock ticks that have not expired? I do not know the strategy for this. Thanks, Chris # tells the engine that a StockTick instance will assume the # role (semantics) of events and that the default retention # policy will be 2 minutes *declare* StockTick @role( event ) @expires( 1m ) *end* # One can even declare helper facts to make rules easier and # simpler to write and maintain *declare* Statistics symbol : String @key() average : *double* readings : *int* total : *double* *end* *rule* Setup statistics *when* $c : Company( $s : symbol ) *not*( Statistics( symbol == $s ) ) *then* Statistics s = *new* Statistics(); s.symbol = $s; s.readings = s.readings + 1; *insert*( s ); *end* # a simple rule to show that it is possible to join # events from an entry-point (stream) with facts # present in the working memory *rule* Update stock stats *agenda-group* evaluation *lock-on-active* *when* $cp : Company( $sb : symbol ) $st : StockTick( symbol == $sb, $pr : price ) *from* entry-point StockTick stream $stats : Statistics( symbol == $sb ) *then* *modify*( $stats ) { readings = readings + 1}; System.err.println($stats.symbol + readings: + $stats.readings); // This shows an update on working memory facts with data from joined events //modify( $cp ) { currentPrice = $pr } // Although events are considered immutable, a common pattern is to use a class // to represent an event and enrich that event instance with data derived from other facts/events. // Bellow we enrich the event instance with the percentual change in the price, // based on the previous price //modify( $st ) { delta = $cp.delta } //modify( $st ) { readings = 5 } //System.out.println($st.delta) *end* ___ 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 -- Edson Tirelli JBoss Drools Core Development JBoss, a division of Red Hat @ www.jboss.com