[rules-users] Pattern order affects activation

DOLECEK Ales Ales.Dolecek at nextiraone.eu
Thu Feb 14 12:28:02 EST 2013


Hello,

  I have following rule:

rule "Remove unsued phones"
	when
		exists Customer()
		not Customer(phone == $value)
		$unused: Phone($value: value)
	then
		retract($unused);
end

There might be multiple Customer and Phone facts in the working memory and the purpose of the rule is to remove phones that do not belong to any of the customers. The rule should not be activated while there are no Customers in WM - hence the "exists Customer()". This is becaus there are other rules, taht might use the phones to lookup customers.

There Phone with value = "test" in working memory when Customer with phone = "test" is inserted. BTW: Both facts are immutable.

The behavior differs depending on order of the 3 patterns in the LHS of the rule.

1) If the "exists Customer()" is first activation is created
	- this is wrong since the "exists Customer()" shall be false

2) if I move the "exists Customer()" between the other patterns activation is created and immediatelly canceled
	- this is also wrong since, although in my case (where are no side effects) it works

3) Finally if the "exists Customer()" comes last the then activation is not created at all
	- this is correct

Is this bug or am I missing something important about rule language? Rewriting the LHS with expicit infix and does not help:

		(exists Customer()) and
		(not Customer(phone == $value)) and
		($unused: Phone($value: value))


Ales

FYI: I'm using 5.5.0.Final


More information about the rules-users mailing list