Uploaded image for project: 'Drools'
  1. Drools
  2. DROOLS-627

Rule with two accumulate followed by object type selection fail to fire rule

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Major Major
    • 6.2.0.CR1
    • 6.1.0.Final, 6.2.0.Beta1
    • None
    • Hide

      A unit testcase is attached for reproducing the issue.

      Show
      A unit testcase is attached for reproducing the issue.
    • 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

              mfusco@redhat.com Mario Fusco
              Anantjot.Anand Anantjot Anand (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

                Created:
                Updated:
                Resolved: