[jboss-jira] [JBoss JIRA] (DROOLS-591) "not" and "accumulate" ordering LHS yield different counting

Matteo Mortari (JIRA) issues at jboss.org
Wed Sep 3 11:26:01 EDT 2014


Matteo Mortari created DROOLS-591:
-------------------------------------

             Summary: "not" and "accumulate" ordering LHS yield different counting
                 Key: DROOLS-591
                 URL: https://issues.jboss.org/browse/DROOLS-591
             Project: Drools
          Issue Type: Bug
      Security Level: Public (Everyone can see)
    Affects Versions: 6.1.0.Final
            Reporter: Matteo Mortari
            Assignee: Mark Proctor


Ref. original post in Drools-Usage
https://groups.google.com/d/msg/drools-usage/ETkH7gn3YwY/Fc46KqqkN9QJ

h5. excerpt of original post

I'm experiencing a very weird behavior of using "not" and "accumulate", their ordering in LHS yield different counting results. I can provide privately a reproducer because this happens only when several rules are deployed - the other rules do NOT interact over the same objects in memory, except from queries.

The example knowledge base below, the goal is to detect spikes in temperature (integers) over the last 5m, and raise/clear an Alert accordingly. The unit test prove that when either of the rules "Trending Alert" or "Trending Clear" fires, the content of $myList if compared to the $myList coming from the third rule, is the SAME, because indeed just collecting over the same over window:time(5m)

However, here is the odd behavior, when I also deploy the full kb:
* If I leave "Trending Alert" this way, the content of $myList when the rule fire, actually extend beyond the 5m sliding window, in fact keeping track of 20m, 30m old samples, therefore yielding wrong results
* If I reorder "Trending Alert" LHS to have the not Alert ( condition == "TEMPERATURE_TRENDING") to appear before the accumulate, the content of $myList when the rule fire is correct.
* If I leave "Trending Alert" this way, and I remove other .drl files, the content of $myList when the rule fire is correct.

Thanks

{code}
rule "Trending Alert"
no-loop
when
	accumulate(	$cc     	: AirSurveyTemp ($temp : TheTemp ) over window:time(5m) ;
				$myList : collectList($cc),
				$number 	: count($cc),
				$min    	: min($temp),
				$max    	: max($temp) ;
				$max-$min 	> 10  )
	$oWhere : Measurement( id == "Inhabited area", val == "False" )				 
	not Alert ( condition == "TEMPERATURE_TRENDING")
then
	Alert a = new Alert();
	a.setCondition("TEMPERATURE_TRENDING");
	System.out.println("++ Temperature Trending - " + a.getCondition() + " - Number of Object: " + $number + " - Min Value = " + $min + " - Max Value: " + $max );
	insert(a);
	alert.clear();
	alert.addAll($myList);
end
 
rule "Trending Clear"
no-loop
when
	$a : Alert(condition == "TEMPERATURE_TRENDING")
	accumulate(	 $cc 		: AirSurveyTemp ($temp : TheTemp ) over window:time(5m) ;
				 $myList : collectList($cc),
				 $number 	: count($cc),
				 $min		: min($temp),
				 $max 		: max($temp) ;
				 $max-$min  < 11  )
then
	System.out.println("-- Clear Alert "+ $a.getCondition() + "Number of Object: " + " - Number of Object: " + $number + " - Min Value = " + $min + " - Max Value: " + $max );	
	retract($a);
	clear.clear();
	clear.addAll($myList);
end

rule "Trending Sampling window 5m"
salience 1
no-loop
when
	accumulate(	$cc     	: AirSurveyTemp ($temp : TheTemp ) over window:time(5m) ;
				$myList : collectList($cc),
				$number 	: count($cc),
				$min    	: min($temp),
				$max    	: max($temp) 
				)
then
	sampling.clear();
	sampling.addAll($myList);
end
{code}



--
This message was sent by Atlassian JIRA
(v6.3.1#6329)


More information about the jboss-jira mailing list