-
Bug
-
Resolution: Done
-
Major
-
6.1.0.Final, 6.2.0.Beta1
-
None
-
-
Medium
A rule with two accumulate function followed by Type(true) select fails to fire the rule.
please note removing the second aggregation makes the Rule R1 fire.
import java.lang.*;
import java.util.*;
import com.test.unittest.TestTwoAccumulateEval.TypeA;
import com.test.unittest.TestTwoAccumulateEval.TypeB;
import com.test.unittest.TestTwoAccumulateEval.TypeC;
import com.test.unittest.TestTwoAccumulateEval.TypeD;
import com.test.unittest.TestTwoAccumulateEval.TypeDD;
rule R0
dialect "java"
when
$a : TypeA( )
$b : TypeB( parentId == $a.id)
$c : TypeC( parentId == $b.id )
$d : TypeD( parentId == $c.id, firings not contains "Rule R0 Fired" )
then
System.out.println("Rule R0 Fired");
$d.setValue(1.0);
$d.getFirings().add("Rule R0 Fired");
update($d);
end
rule R1
dialect "java"
when
$a : TypeA( )
$b : TypeB( parentId == $a.id)
$c : TypeC( parentId == $b.id, firings not contains "Rule R1 Fired" )
$d : TypeD( parentId == $c.id)
// Aggregate function [sum] creates a separate context
$sumOfAll_1 : Double(doubleValue != Double.MAX_VALUE) from accumulate (
$a_C1 : TypeA( )
and
$b_C1 : TypeB( parentId == $a_C1.id)
and
$c_C1 : TypeC( parentId == $b_C1.id )
and
$d_C1 : TypeD( parentId == $c_C1.id , $value_C1 : value , value != 0 )
;sum($value_C1))
// end of sum aggregation
// Aggregate function [sum] creates a separate context
$sumOfAll_2 : Double(doubleValue != Double.MAX_VALUE) from accumulate (
$a_C2 : TypeA( )
and
$b_C2 : TypeB( parentId == $a_C2.id)
and
$c_C2 : TypeC( parentId == $b_C2.id )
and
$dd_C2 : TypeDD( parentId == $c_C2.id , $value_C2 : value , value != 0 )
;sum($value_C2))
// end of sum aggregation
//eval(($sumOfAll_1 + $sumOfAll_2) > 0)
//eval returns true however TypeA(true) evaluates to false...removing second aggregate
//makes TypeA works
TypeA(eval(($sumOfAll_1 + $sumOfAll_2) > 0))
then
System.out.println("Rule R1 Fired");
$c.getFirings().add("Rule R1 Fired");
update($c);
end