[rules-users] How to retract events that don't match any rules (without @expires())

Wolfgang Laun wolfgang.laun at gmail.com
Thu Jul 19 02:39:45 EDT 2012


On 19/07/2012, Ladd <ladd at codemettle.com> wrote:
>
> That's a good question.  Smaller memory footprint by retracting.  But we
> lose the immediate activation of future rules.  Maybe I'll make it an
> option
> and let somebody else decide.  ;)
>

Here's a plausible idea, which might be useful - I still don't
understand the scenario well enough to be confident ;-)

You can retract rules and still keep them in the game. Let's say X()
is the type for the ones you'd consider to retract, and Y() are the
ones that would expect to match with X(), no matter how old.

rule "make X dormant
when
    $b: Bed()
    $x: X( ... decisions ... )  // or simply not Y() // or both combined
then
   retract( $x );
   $server.putToBed( $x );
   $b.modify{ incCount() }
end

rule "awaken all X"
when
    $b: Bed( count > 0 )
    exists Y()
then
    $server.getFromBed( $b );
end

If you have many classes like X() or Y(), simply add a marker
interface to these classes.

There's an infinite number of strategies for "putting to bed". LFU
comes to my mind, in addition to age.

Of course, eventually the Bed will fill up; this just postpones the
issue to decide when really to dispatch them to the bit bucket.

-W


More information about the rules-users mailing list