[rules-users] using BigDecimal in rules

Edson Tirelli tirelli at post.com
Thu Nov 6 10:46:46 EST 2008


   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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20081106/f7c41086/attachment.html 


More information about the rules-users mailing list