Actually (and arguably) I think that the behavior is consistent.
In the first case, you insert a MyClass instance: base is eligible
for activation, and so is rule 1. When rule 1 fires, it inserts a String
which continues the previous propagation through rule 2. At this
point, value is still != "test" and an activation for rule 2 is created.
Now the modify: since the only @PR pattern is MyClass( data == null )
in rule "base" and you are setting the property value, the (re)propagation
is blocked. This prevents the previous activation of rule 2 from being
overwritten and cancelled, so rule 2 fires.
In the second example, things are slightly different. Rule 1 activates
as in the previous case, firing. This time, you modify m first, but since
no String is in the WM, there is nothing to (re)propagate or cancel
for rule 2. However, there is indeed a MyClass instance in the WM.
When you insert the String, the modification has already been
propagated: this time the String simply joins with the existing MyClass
and continues its propagation. The next node is a "from" which
checks the current value: it is now "test", so the alpha constraint
blocks the propagation. Rule 1 does not fire as expected, but
it has little do do with @PR.
Davide
On 01/16/2014 12:33 AM, Sonata wrote:
Below is a test to demonstrate it, also add the @PropertyReactive
property to
MyClass()
package com.sample;
rule base
when m : MyClass(data == null)
then
end
rule "2" extends base
when
String()
MyClass(value != "test") from m
then
System.out.println("2 fired");
end
rule "1" extends base
salience 1
when
MyClass(value == null) from m
then
System.out.println("1 fired");
insert(new String());
modify(m) { setValue("test") }
end
The test above should output "1 fired" and "2 fired".
Although we have set the value to "test", rule "2" supposes to not
fire, but
it is in fact expected to fire due to the non-reactive property of CE
"from", and the result confirms this.
But if we reorder the code in rule "1" to
rule "1" extends base
salience 1
when
MyClass(value == null) from m
then
System.out.println("1 fired");
modify(m) { setValue("test") }
insert(new String());
end
Then you get only "1 fired", as if CE "from" is reactive again.
This only happens when you have the @PropertyReactive property added to
MyClass()
Version tested are 5.5.0.Final and 5.6.0.Final
Could the Drools team review this? Thank you.
--
View this message in context:
http://drools.46999.n3.nabble.com/Inconsistent-output-when-PropertyReacti...
Sent from the Drools: User forum mailing list archive at
Nabble.com.
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users