Hi,
I have two issues with float/double constants. In both cases dialect is set
to MVEL
Issue 1
If I use a comparison operator with the Double value it doesn't seem to work
correctly w/o brackets in the right part of the expression:
Example:
I have a condition like:
NumberVariable( owner == $a, name == "PTI", value > 0.5)
In the class NumberVariable the method getValue() is declared as follows:
public Number getValue();
In the working memory I have an instance with name == "PTI" and value ==
0.9633716684527102 ( actual type of the value is Double).
And the rule consequence is not executed.
If I change it and add brackets around the constant everything works
correctly:
NumberVariable( owner == $a, name == "PTI", value > (0.5) )
There is similar example in drools documentation (w/o brackets):
Cheese( type == "stilton", price < 10, age == "mature" )
I assume that in this example the property has a primitive type and in my
case autoboxing is involved, but why brackets are necessary in my case?
Issue 2
I have a rule:
rule "Determine min PRI for for PROD2" ruleflow-group
"budget_calculated_variables_appl"
when
$a: RetailApplication( )
StringVariable(name=="prodid", value matches CONST.PROD2)
then
insert(new NumberVariable("minPTI", 0.6, $a));
end
Initially I had only one constructor for NumberVariable:
public NumberVariable(String pName, Number pValue, Object pOwner)
But MVEL couldn't find this constructor when "then" part was executed
(runtime exception).
The problem was solved when I added another constructor:
public NumberVariable(String pName, float pValue, Object pOwner)
Java compiler accepts identical code when only first constructor is there:
NumberVariable nv = new NumberVariable("minPTI", 0.6, null);
Drools version: 4.04, Java version: 1.6
Thanks,
Andrey.