[rules-users] using BigDecimal in rules

Scott Burrows scottjburrows at gmail.com
Thu Nov 6 12:43:06 EST 2008


Here is the exact link (thanks Edson):

http://anonsvn.jboss.org/repos/labs/labs/jbossrules/branches/4.0.x/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java

Scott


On Thu, Nov 6, 2008 at 10:46 AM, Edson Tirelli <tirelli at post.com> wrote:

>
>    It sounds like a bug. Can you get Drools source code and look at the
> unit test for this to make sure your scenario works there? The file is:
>
> drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java
>
>    Method is:
>
> testBigDecimal()
>
>    Very easy to add your use case in there.
>
>    Let us know what you find.
>
>    Edson
>
> 2008/11/6 Marina <ppine7 at yahoo.com>
>
>> Hi,
>>
>> I'm getting unexpected results when when using BigDecimal objects for
>> matching in rules.
>> I'm generating DRL in my code, using freemaker.
>>
>> I have a RuleEngineNumericFact object which has two attributes:
>> String propertyName
>> BigDecimal propertyValue
>>
>> Below is an example of a rule where I try to match a RuleEngineNumericFact
>> object based on the two attributes:
>>
>> rule "aaa"
>>     agenda-group "r1"
>>     dialect "java"
>>     when
>>         (RuleEngineNumericFact( propertyName == "somename" , propertyValue
>> == 10.8 ))
>>     then
>>         String ruleId = drools.getRule().getName();
>>         firedRuleIDs.add(ruleId);
>> end
>>
>>
>> Then I create a new RuleEngineNumericFact object and set its propertyValue
>> as following:
>>
>> String stringValue = "10.8";
>> BigDecimal propertyValue = new BigDecimal(stringValue, new
>> MathContext(10));
>>
>> (I also tried to use default precision settings by creating the BigDecimal
>> value as:
>> BigDecimal propertyValue = new BigDecimal(stringValue);
>> )
>>
>> When I insert this fact into the rule engine - the rule does not get
>> fired, so the fact does not match.
>>
>> One note: if the values are integeres (like, propertyValue == 100) - the
>> rule gets fired. So, it is only the floating point numbers that do not
>> match.
>>
>> I generate the DRL in my Java code, using freemaker, and I specify the
>> value that will be used in the rule for matching by calling toString()
>> method on a BigDecimal object that I get from my business code. The
>> toString() representation ends up to be the "10.8" value (for example).
>> According to the BigDecimal documentation, marshalling from/to the same
>> string representation shoudl still produce BigDecimal objects that will
>> return TRUE from the equals() method when compared.
>>
>>
>> any ideas why this is not working here?
>> How does Drools compare values of objects like BigDecimal?
>>
>> thanks,
>> Marina
>>
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>
>
> --
>  Edson Tirelli
>  JBoss Drools Core Development
>  JBoss, a division of Red Hat @ www.jboss.com
>
> _______________________________________________
> 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/20081106/fa852a51/attachment.html 


More information about the rules-users mailing list