Yes that is correct, the rules will be revaluated when you modify any of the
objects - that is desired behaviour. If in your case you don't want the
second rule to fire, then there needs to be explicit conditions as to why it
should not fire (such as the calculation does not need to be done again).

>From what I can see - will you have more then one order in working memory at
one time? (hence the need to join the item to the order?).

One other option is to not have seperate item objects in working memory,
just order objects, and extract the item as needed in the rules. This may or
may not benefit you, but some people do it that way.

In your case, I am guessing, but perhaps you only want the second rule to
fire if the calculation is really needed, so the question is how to you
express that a calculation is needed? One way is to add a condition that
checks for a calculation result in the object in the second rule. Then in
any other rules that require re calculation, they simply clear the
calculation result, which means the second rule will kick in when
appropraite.


Michael.

On 2/10/06, Ho, Alan <[EMAIL PROTECTED]> wrote:
>
> Thanks for your helping me out.  In my real application, there is a 1 to *
> relationship between orders and items.
>
> My App looks like :
>
>                 Item truckShippedItem = new Item();
>                 Order order = new Order();
>
>                 order.getItems().add(truckShippedItem);
>                 truckShippedItem.setParentOrder(order);
>
>                 Rate bc = new Rate("additive_charge",10);
>                 truckShippedItem.getRates().put("additive_charge", bc);
>
>                 try {
>                         workingMemory.assertObject( truckShippedItem );
>                         workingMemory.assertObject( order );
>                         workingMemory.fireAllRules( );
>                 } catch (FactException fe)
>                 {
>                         System.out.println("FactErrorOccured" +
> fe.getMessage());
>                 } catch (Exception e)
>                 {
>                         System.out.println(e.getMessage());
>                 }
>
> My 2 rules looks like:
>
>     <rule name="Order Level" salience="1" >
>
>         <parameter identifier="order">
>             <class>com.amazon.shipping.ruleengine.Order</class>
>         </parameter>
>
>        <java:condition>
> ((Rate)order.getOrderLevelRates().get("additive_charge")).getRateCost() &lt;
> order.getMaxAdditiveCharge().getRateCost() </java:condition>
>
>         <java:consequence>
>                 System.out.println("Modifying additive Charge for order");
>                 order.getOrderLevelRates().put("additive_charge",
> order.getMaxadditiveCharge());
>                 drools.modifyObject(order);
>         </java:consequence>
>     </rule>
>
>     <rule name="additive Charge Allocation" >
>
>         <parameter identifier="order">
>             <class>com.amazon.shipping.ruleengine.Order</class>
>         </parameter>
>
>         <parameter identifier="item">
>             <class>com.amazon.shipping.ruleengine.Item</class>
>         </parameter>
>
>           <java:condition>item.parentOrder == order</java:condition>
>
>         <java:condition>item.containsCharge
> ("additive_charge")</java:condition>
>         <java:condition>order.containsCharge
> ("additive_charge")</java:condition>
>         
> <java:condition>((Rate)order.getOrderLevelRates().get("additive_charge")).getRateCost()
> != 0 </java:condition>
>
>         <java:consequence>
>                 System.out.println("Calculating additive Charge
> Allocation");
>         </java:consequence>
>     </rule>
>
> public class Order {
>
>         List<Item> items = new LinkedList();
>         Map<String,Shipment> shipments = new HashMap();
>         Map<String,Rate> orderLevelRates = new HashMap(); }
>
> public class Item {
>
>         Map<String,Rate> itemLevelRates = new HashMap<String,Rate>();
>         Map<String,CatalogProperty> catalogProperties = new
> HashMap<String,CatalogProperty>();
>
>         Order parentOrder;
>         String name;
> }
>
>
> The second rule is my biggest problem. It fires whenever any Object or and
> item is modified
>
> Thanks,
> Alan Ho
>
> -----Original Message-----
> From: Michael Neale [mailto:[EMAIL PROTECTED]
> Sent: Wednesday, February 08, 2006 4:20 PM
> To: user@drools.codehaus.org
> Subject: Re: [drools-user] How do I control firing of rules ?
>
> how are you calling the rule engine - can you show a snippet of code?
>
> On 2/9/06, Ho, Alan <[EMAIL PROTECTED]> wrote:
> >
> > I don't quite get your drift.
> >
> > If I modify N orders, each order with 1 item, I have to activate my
> > rule N*N times. That's really costly.
> >
> > Regards,
> > Alan
> >
> >
> > -----Original Message-----
> > From: Michael Neale [mailto:[EMAIL PROTECTED]
> > Sent: Wednesday, February 08, 2006 3:39 PM
> > To: user@drools.codehaus.org
> > Subject: Re: [drools-user] How do I control firing of rules ?
> >
> > so you are asserting into working memories orders, and items as
> "exploded"
> > apart from each other? (if you get my drift).
> >
> >
> > Michael.
> >
> > On 2/9/06, Ho, Alan <[EMAIL PROTECTED]> wrote:
> > >
> > > Hi,
> > >
> > > I'm fairly new to drools, and was curious if there is a way to
> > > reduce the firing of rules.
> > >
> > > Whenever a fact is modified, drools fires all rules who's parameter
> > > ( is the same class type of the fact.
> > >
> > > e. g.
> > >
> > >     <rule name="Order Level" salience="1" >
> > >         <parameter identifier="order">
> > >             <class>com.blah.shipping.ruleengine.Order</class>
> > >         </parameter >
> > >         <parameter identifier="item">
> > >             <class>com.blah.shipping.ruleengine.Item</class>
> > >         </parameter >
> > >      :
> > >      :
> > >      :
> > >     </rule>
> > >
> > > Whenever we modify any fact of type object Item or type Order, this
> > > above rule will fire.
> > >
> > >
> > > Can we somehow specify a parameter based a sub-field of an object.
> > > Something like
> > >
> > >     <rule name="Order Level" salience="1" >
> > >         <parameter identifier="order">
> > >             <class>com.blah.shipping.ruleengine.Order</class>
> > >         </parameter >
> > >         <parameter identifier="Item">
> > >             <instance>order.orderItem</instance>
> > >         </parameter >
> > >      :
> > >      :
> > >      :
> > >     </rule>
> > >
> > > Where order.orderItem is of type Item. In this scenario, the rule
> > > will only fire when an order fact or order.orderItem is modifed.
> > >
> > > Right now, to emulate the behaviour I am looking for, I am doing a
> > > check in a rule condition:
> > >
> > >
> > >     <rule name="Order Level" salience="1" >
> > >         <parameter identifier="order">
> > >             <class>com.blah.shipping.ruleengine.Order</class>
> > >         </parameter >
> > >         <parameter identifier="item">
> > >             <class>com.blah.shipping.ruleengine.Item</class>
> > >         </parameter >
> > >
> > >         <java:condition>order.orderItem == item</java:condition>
> > >
> > >      :
> > >      :
> > >      :
> > >     </rule>
> > >
> > > Thanks,
> > > Alan Ho
> > >
> > >
> >
>

Reply via email to