[rules-users] Trouble getting Dynamic Salience working - add in rules-templates
Greg Barton
greg_barton at yahoo.com
Wed Sep 2 15:50:37 EDT 2009
Yeah, the docs rightly state that you shouldn't depend too heavily on a given rule firing order:
https://hudson.jboss.org/hudson/job/drools/lastSuccessfulBuild/artifact/trunk/target/docs/drools-expert/html_single/index.html#d0e1572
Scroll down to "3.3.4.1. Conflict Resolution"
They also say that the default strategies are salience and LIFO, so the example I gave might just work by accident. :) I'll have to peek at the source tonight to be sure.
--- On Wed, 9/2/09, Bill Tarr <javatestcase at yahoo.com> wrote:
> From: Bill Tarr <javatestcase at yahoo.com>
> Subject: [rules-users] Trouble getting Dynamic Salience working - add in rules-templates
> To: rules-users at lists.jboss.org
> Date: Wednesday, September 2, 2009, 2:26 AM
> Thank you for the response Greg.
> For starters, I did NOT know about specificity... very
> helpful to know, and I feel certain I will be using it in
> the future. I don't feel any of the documentation I've
> read on Drools really got this subject across for me, I not
> sure the the Drools developer book really covers it at
> all.
>
> Back to my actual implementation. We are
> using rules-templates, which have a "unique behavior" I've
> been calling a feature, but some might consider a bug...
> or have found a way to work around. Templates do
> not render rule lines which contains NULL parameters.
> This hasn't bit my too badly to this point, but MAY pose an
> interesting issue for specificity (now that I know about
> it!)
>
> My real world example is a good bit more
> complicated. My LH includes:
>
> PARAMETERS
> --------------------------
> Product - NOT NULL
> Start Date
> End State
> Price Group - NOT NULL
> State Group
>
> Some of the info is coming from a single instance of an
> object I'm calling "transporter" I use to gather info from
> other rules. It will have a list of state groups and price
> groups. So psuedocode for my template LH will look
> something like:
>
> template.pricegroups.contains( "@{PRICE_GROUP}" )
> template.stategroups.contains( "@{STATE_GROUP}" )
> policy (
> startDate >
> @{START_DATE}
> endDate < @{END_DATE}
> product = "@{PRODUCT}"
> )
>
> The problem I run into here, is that in any given rule,
> only a subset of these will appear. So one rule may
> produce:
>
> // this rules parameters have a NULL STATE_GROUP
> template.pricegroups.contains( "pg1" )
>
> policy (
> startDate > 2009-01-01
> endDate < 2010-01-10}
> product = "prod1"
> )
>
> and another might produce
>
> // this rule has a STATE_GROUP, but no START_DATE and
> END_DATE
> template.pricegroups.contains( "pg1" )
> template.stategroups.contains( "NY" )
> policy (
>
>
> product = "prod2"
> )
>
> In this example, I actually want the SECOND rule to win the
> conflict. It is "more specific" for our business rule, a
> policy for NY should match, but the the first rule should
> not. In reality, the first rule has more facts, so which
> one will actually fire first by rules of specificity?
>
> My activation-group and salience hack was one workaround
> for this condition. I set the second rule with a higher
> salience, and add them both to the same activation-group.
>
> I will try different combinations of rule-templates and
> specificity when I am in the office tomorrow (midnight here
> in San Diego.) If you have any further feedback on this, I
> do appreciate your taking the time to show a Drools newbie
> some very useful stuff.
>
> Thanks!
>
> Bill
>
>
>
> Message: 2
> Date: Tue, 1 Sep 2009 19:29:40 -0700 (PDT)
> From: Greg Barton <greg_barton at yahoo.com>
> Subject: Re: [rules-users] Trouble getting Dynamic Salience
> working
> To: Rules Users List <rules-users at lists.jboss.org>
> Message-ID: <52492.42683.qm at web81501.mail.mud.yahoo.com>
> Content-Type: text/plain; charset="iso-8859-1"
>
> I hope you're not going through all of that trouble just to
> get the functionality from that concrete example. You get
> that for free with Drools' default conflict resolution,
> which includes "specificity." Specificity means that rules
> with the more specific conditions, and all else equal, are
> fired first. So between these two rules, only the
> CheeseSausagePepperoniPepper one fires:
>
> rule "CheeseOnly"
> when
> p : Pizza( )
> t1: Topping( pizza == p, name == "cheese" )
> then
> System.out.println( "Eating cheese pizza" );
>
> retract( t1 );
> retract( p );
> end
>
> rule "CheeseSausagePepperoniPepper"
> when
> p : Pizza( )
> t1: Topping( pizza == p, name == "cheese" )
> t2: Topping( pizza == p, name == "sausage" )
> t3: Topping( pizza == p, name == "pepperoni"
> )
> t4: Topping( pizza == p, name == "pepper" )
> then
> System.out.println( "Eating cheese sausage
> pepperoni pepper pizza" );
> retract( t4 );
> retract( t3 );
> retract( t2 );
> retract( t1 );
> retract( p );
> end
>
> See the attached project.
>
> --- On Tue, 9/1/09, Bill Tarr <javatestcase at yahoo.com>
> wrote:
>
> > From: Bill Tarr <javatestcase at yahoo.com>
> > Subject: [rules-users] Trouble getting Dynamic
> Salience working
> > To: rules-users at lists.jboss.org
> > Date: Tuesday, September 1, 2009, 7:28 PM
> > We have a winner!? Many thanks
> > Michal, hope I can return the favor one day.
> >
> > salience ( return getSalience4() )
> >
> > for the record, my function looks something like
> (after
> > tempate evaluation):
> >
> > <pre>
> > function int getSalience4(){
> > ??? int salience = 0;
> > ??? if("VALUE"=="VALUE") salience += 1000;
> >
> > ??? return salience;
> > }
> > </pre>
> >
> > I think the combination activation-group and dynamic
> > salience for rule-template projects are pretty useful.
>
> >
> > Just for anyone interested,?the tempate code looks
> > something like this:
> >
> > <pre>
> > rule "Some Rule_@{row.rowNumber}"
> >
> > ??? activation-group "@{PARAM1}-@{PARAM2}"
> > ??? salience ( return getSalience@{row.rowNumber}() )
> > </pre>
> >
> > where PARAM1 and PARAM2 make up a kind of key. I only
> want
> > to execute one rule that matches that key, no matter
> how
> > many options there are.
> >
> > Rules that have additional parameters get higher
> salience
> > than rules with less parameters, so here is my
> function.
> >
> > <pre>
> > function int getSalience@{row.rowNumber}(){
> > ??? int salience = 0;
> > ??? if("@{PARAM3}"=="@{PARAM3}") salience += 1000;
> > ??? if("@{PARAM4}"=="@{PARAM4}") salience += 1000;
> > ??? return salience;
> > }
> > </pre>
> >
> > A concrete example could be pizza.? So there are?3
> types
> > of pizza, all are grouped in the same
> activation-group.
> >
> > cheese, pepperoni
> > cheese, pepperoni, sausage
> > cheese, pepperoni, meatball, pepper
> >
> > Any cheese and pepperoni pizza should could match all
> these
> > rules, but more toppings is always better for me.
> >
> > So cheese, pepperoni, onion, pepper getts a salience
> of
> > 2000, and is the only rule evaluated.
> >
> >
> >
> > On Tue Sep 1 18:39:13 EDT 2009, Michal Bali michalbali
> at
> > gmail.com? wrote:
> >
> > does this work?
> > salience ( return getSalience() )
> >
> > or this:
> >
> > salience ( getSalience();)
> >
> >
> > On Tue, Sep 1, 2009 at 6:50 PM, Bill Tarr
> <javatestcase
> > at yahoo.com> wrote:
> >
> > > Possibily just a simple MVEL error, but I've
> been
> > struggling for a while
> > > and thought I'd see if anyone could help.
> > >
> > > I just want to run a logic test to determine
> salience
> > for some rules I am
> > > generating with rules-templates.??Even after
> making
> > the logical test "true"
> > > I can't get any of variation to compile.
> > >
> > > (true ? "1000" : "0")
> > > **produces**
> > > Unable to build expression for 'salience' : not
> a
> > statement, or badly
> > > formed structure
> > >
> > > ( true ? 1000 : 0)
> > > **produces**
> > > Unable to build expression for 'salience' :
> invalid
> > number literal: 1000
> > >
> > > salience ( getSalience() )
> > > ...
> > > function int getSalience(){return 0;}
> > > **produces**
> > > Unable to build expression for 'salience' :
> > org.mvel2.util.MethodStub
> > > cannot be cast to java.lang.Class'(
> > getSalienceNONCDW() )'
> > >
> > > Seems like I am missing something simple, but
> I've
> > tried many variations on
> > > the above, and have been unable to find any
> working
> > examples of using a
> > > logical test in salience, so if anyone has any
> > direction it would be greatly
> > > appreciated.
> > >
> > > Thanks!
> > >
> > > Bill
> >
> >
> > ? ? ?
> >
> > _______________________________________________
> > 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
>
More information about the rules-users
mailing list