[rules-users] keeping running stats

2009-05-27 Thread Chris Richmond
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

2009-05-27 Thread Michal Bali
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

2009-05-27 Thread Chris Richmond
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

2009-05-27 Thread Chris Richmond
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

2009-05-27 Thread Chris Richmond
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

2009-05-27 Thread Edson Tirelli
   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