[rules-users] fireUntilHalt and timing of rule activations

Wolfgang Laun wolfgang.laun at gmail.com
Mon Oct 4 01:51:08 EDT 2010


2010/10/4 Greg Barton <greg_barton at yahoo.com>

> If you don't have some way of associating the data with a particular Latch
> it's easy to get overlap when processing datasets.  In general you need some
> way to group the data together.  You can avoid a back reference to the Latch
> by having a Set of some sort in the Latch to which you add all data in the
> batch.


Which burdens all inserts and retracts to be accompanied by correpsonding
updates of the Set/Map.


>  If you use a Set backed by an IdentityHashMap the overhead is pretty
> small, and rules look like this:
>
> rule "CountAs"
>        dialect "java"
>        salience -1
>        when
>                l : Latch()
>                 a : A( this memberOf l.dataSet )
>         then
>                retract(a);
>                l.incACount();
>                 System.out.println("Found an A in " + l);
> end
>
> See attached project.
>
> THough I like the cleverness of using the "data in matched objects alters
> rule properties" trick, you could have just as easily had a "Latch(value ==
> true)" conditional, and that would be more clear,


It was meant to emphasize the role of Latch.value as an enabler for the rule
in contrast to a regular constraint being part of the application logic.
YMMV ;-)



> IMO.  I'm curious to see of the enabled trick would perform better, though.
>

Whichever way, there is a considerable burden associated with writing the
rules and, possibly, inserts and retracts. I wonder what the benefits of
having the session run all the time are as opposed to simply let it fire
until it stops; then do the inserts and then fireUntilHalt again? If there
is, I'd opt for the addition of an atomic insertAll(Object... objects) and
then none of this hocus-pocus would be necessary.

-W


>
> GreG
>
> --- On Sun, 10/3/10, Wolfgang Laun <wolfgang.laun at gmail.com> wrote:
>
> From: Wolfgang Laun <wolfgang.laun at gmail.com>
> Subject: Re: [rules-users] fireUntilHalt and timing of rule activations
> To: "Rules Users List" <rules-users at lists.jboss.org>
> Date: Sunday, October 3, 2010, 4:23 AM
>
> There is another way of associating a Latch object with rules, without
> having to store a reference to a Latch in objects:
>
> rule "CountAs"
> enabled ( $v )
> when
>      Latch( $v : value )
>      X( ... )
>
> then ... end
>
> At the beginning, insert Latch( false ), which blocks all rules with this
> construction, or modify the Latch object to false before inserting more
> facts. Then, insert the facts, and, at the end, modify Latch to true.
>
>
>     Latch latch = new Latch( true );
>     FactHandle fh = kSession.insert( latch );
>     kSession.fireAllRules();
>     latch.setValue( false );
>     kSession.update( fh, latch );
>
> Of course, you can use multiple Latch objects, adding a name field with a
> specific value, so that a latch applies to a subset of rules only:
>
>
> rule "CountAs"
>
> enabled ( $v )
>
> when
>
>      Latch( name == "CountAs", $v : value )
>      ...
>
> But be aware that changes to Latch objects will retrigger rules that have
> fired previously; so with this approach you'll have to make sure to retract
> facts when they have been processed.
>
>
> -W
>
>
> 2010/10/3 Greg Barton <greg_barton at yahoo.com>
>
> Nope, you're not missing anything.  What you need is a control object of
> some sort thst's inserted after all of the "real" data is inserted. (See
> attached project for an example.) Rules will look like this, if the control
> object is called BatchLatch and data objects A:
>
>
>
>
> rule "CountAs"
>
>         dialect "java"
>
>         salience -1
>
>         when
>
>                 l : Latch()
>
>                 a : A( latch == l )
>
>         then
>
>                 retract(a);
>
>                 l.incACount();
>
>                 System.out.println("Found an A in " + bl);
>
> end
>
>
>
> Note that the A object being processed is tied back to the latch.  This is
> so multiple latches can be processed simultaneously and their processing
> won't be intermingled.  This is necessary because there's no guarantee that
> two Latch objects aren't in working memory at once. (Though you could create
> a rule that enforces this.)
>
>
>
>
> GreG
>
>
>
> --- On Sat, 10/2/10, Norman C <rent_my_time at yahoo.com> wrote:
>
>
>
> > From: Norman C <rent_my_time at yahoo.com>
>
> > Subject: [rules-users] fireUntilHalt and timing of rule activations
>
> > To: rules-users at lists.jboss.org
>
> > Date: Saturday, October 2, 2010, 10:22 AM
>
> > Hi All,
>
> >
>
> > In my app, I have a separate thread calling fireUntilHalt()
>
> > continuously.  I
>
> > have quite a few rules, and I am using salience extensively
>
> > to control the order
>
> >
>
> > in which rules are executed.  What I have seen (by adding
>
> > an event listener) is
>
> > that as a new fact is inserted, various rules are
>
> > activated.  Often, the
>
> > fireUntilHalt will start executing fireNextItem in
>
> > DefaultAgenda before all of
>
> > the activations are complete.  So if the rule with the
>
> > highest salience
>
> > value hasn't been activated at this point, then the first
>
> > rule to be fired isn't
>
> >
>
> > the correct one.
>
> >
>
> > This can be worked around by waiting for insert to return
>
> > and then calling
>
> > fireAllRules().  But it seems like the session should
>
> > block fireUntilHalt from
>
> > trying to execute activated rules until all activations are
>
> > complete.  Or am I
>
> > missing something here?
>
> >
>
> > thanks,
>
> > Norman
>
> >
>
> >
>
> >
>
> >
>
> >
>
> > _______________________________________________
>
> > rules-users mailing list
>
> > rules-users at lists.jboss.org
>
> > https://lists.jboss.org/mailman/listinfo/rules-users
>
> >
>
>
>
>
>
>
> _______________________________________________
>
> rules-users mailing list
>
> rules-users at lists.jboss.org
>
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
>
>
>
> -----Inline Attachment Follows-----
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20101004/0680607f/attachment.html 


More information about the rules-users mailing list