[rules-users] Inconsistent output when @PropertyReactive is used

Davide Sottara dsotty at gmail.com
Wed Jan 15 19:51:43 EST 2014


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-PropertyReactive-is-used-tp4027709.html
> Sent from the Drools: User forum mailing list archive at Nabble.com.
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>



More information about the rules-users mailing list