[rules-users] Identify Rule on Attributes
Scott Reed
sreed at avacoda.com
Thu Mar 19 10:03:38 EDT 2009
Nikil,
What I said about the missing map entries still holds true but listen
to Wolfgang. Since you are concerned with efficiency, using eval() and a
map is a very inefficient approach.
Scott
Wolfgang Laun [3/19/2009 9:09 AM] wrote:
> It appears that you want to reason about travel bookings or some such
> thing.
>
> You are thinking of the various attributes as individual (abstract)
> things that
> have a designation (such as "Adult Fare") and a value, with the intent to
> handle this with a set of facts, each of which has these two fields. While
> this "property list" view of data may have its merits, it complicates
> the writing
> of rules in system like Drools.
>
> Moreover, keeping this data in a map is fine from the Java point of
> view, but it
> leads to complications while processing it in DRL rules. (To say nothing
> about the poor performance due to eval all over the place.) I'm not sure
> about the relation between your Java class RuleAttributes and the
> HashMap instance hmAttriList, but even if the latter were an instance
> of the former (so it is a subclass of HashMap), it is questionable what
> the $a.Values["..."] returns - most likely not an Integer, and this is
> confirmed by the compiler's error message.
>
> Try to view a Booking as a Java Bean with attributes
> int numberOfAdults
> int numberOfChildren
> int childFare
> int adultFare
> boolean rejected
> and any other attribute of a booking you might want to put there.
>
> Create an instance of this bean and add it to Working Memory.
>
> A rule could now be written as
>
> rule "adt_chld_fare"
> no-loop true
> when
> $b: Booking( $af : adultFare, childFare > ($af - 1500) )
> then
> modify( $b ){ setRejected( true ); }
> end
>
> There are many possible variations on this. Here is just one idea:
>
> You might not want to have the rejection being stored in the Booking bean,
> so you could, perhaps assert an instance of another suitably composed Bean
> class Rejection
> Booking booking
> String reason
>
> Much of the design depends on what and how you need to get the results
> of rule firing back to the application, so I won't continue.
>
> -W
> On Thu, Mar 19, 2009 at 7:52 AM, Nikhil_dev <k.nikhil at verchaska.com
> <mailto:k.nikhil at verchaska.com>> wrote:
>
>
> i have combined all the rules into a single RuleBase,
> below is the content of drl file,
>
> package com.vtech.ruleengine.module.rulemanagermodule
> import com.vtech.ruleengine.module.rulemanagermodule.RuleAttributes;
> import java.util.Map;
>
> rule "adt_chld_fare"
> dialect "mvel"
> when
> $a : RuleAttributes()
> eval ($a.Values["Adult Fare"]> ($a.Values["Child Fare"]+
> 1500 ) )
> then
> ($a.Values["AcceptRejectFilter"]='Reject')
> end
>
>
> rule "DEMO_RULE"
> dialect "mvel"
> when
> $a : RuleAttributes()
> eval ($a.Values["Adult Fare"]> 8000 )
> then
> ($a.Values["Nett Payable"]= ($a.Values["Adult Fare"]* 0.80 ) )
> end
>
>
> rule "Compare_date_1"
> dialect "mvel"
> when
> $a : RuleAttributes()
> eval ('12-Jan-2009'>='15-Jan-2008')
> then
> ($a.Values["Adult Fare"]= 5000 )
> end
>
>
> rule "Rule_20090106_1"
> dialect "mvel"
> when
> $a : RuleAttributes()
> eval ( ($a.Values["No Of Adults"]< 10 ) && ($a.Values["No Of
> Adults"]> 5 ) )
> then
> ($a.Values["Adult Fare"]= ($a.Values["Adult Fare"]+ -50 ) )
> end
>
>
> rule "Rule_20090107_Markup"
> dialect "mvel"
> when
> $a : RuleAttributes()
> eval ($a.Values["markupPerc"]>= 0 )
> then
> ($a.Values["markupAmount"]=
> ($a.Values["buyingAmount"]*$a.Values["markupPerc"]) )
> end
>
>
> rule "Sample_Rule"
> dialect "mvel"
> when
> $a : RuleAttributes()
> eval ($a.Values["Sector"]< 0 )
> then
> ($a.Values["Via"]= ($a.Values["Via1"]+ 1250 ) )
> end
>
> i am passing following hashmap containing,
> hmAttriList.put("Adult Fare", 8000);
> hmAttriList.put("Child Fare", 80);
> hmAttriList.put("Gross Fare", 0);
> hmAttriList.put("Published Fare", 0);
>
> while executing it i am getting following error message
> SEVERE [global]
> org.mvel.CompileException: could not perform numeric operation on
> non-numeric types: left-type=null; right-type=java.lang.Integer
> at
> org.mvel.math.IEEEFloatingPointMath.doOperationNonNumeric(IEEEFloatingPointMath.java:149)
> at
> org.mvel.math.IEEEFloatingPointMath._doOperations(IEEEFloatingPointMath.java:102)
> at
> org.mvel.math.IEEEFloatingPointMath.doOperation(IEEEFloatingPointMath.java:43)
> at org.mvel.util.ParseTools.doOperations(ParseTools.java:810)
> at
> org.mvel.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:21)
> at
> org.mvel.ExecutableAccessor.getValue(ExecutableAccessor.java:45)
> at
> org.mvel.ast.Substatement.getReducedValueAccelerated(Substatement.java:24)
> .............
> ..............
> ==>[ActivationCreated(0): rule=adt_chld_fare;
> tuple=[fid:1:1:com.vtech.ruleengine.module.rulemanagermodule.RuleAttributes at 14a0fe1]
> ]
> Error Message : org.mvel.CompileException: could not perform numeric
> operation on non-numeric types: left-type=null;
> right-type=java.lang.Integer
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> 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/20090319/13ce5ec6/attachment.html
More information about the rules-users
mailing list