Confirmed, works as expected in 5.6.CR1
Davide

On 12/20/2013 04:22 PM, Mark Proctor wrote:
small correction to the unit test, which I paste in full below:

@Test
public void testModifyAfterInsertWithPropertyReactive() {
    String rule1 =
            "\n" +
            "package com.sample;\n" +
            "import " + MyClass.class.getCanonicalName() + ";\n" +
            "global java.util.List list;\n" +
            "rule r0\n" +
            "then insert( new MyClass() );\n" +
            "end\n" +
            "rule r1 salience 1\n" +
            "when " +
            "  MyClass(value == null)\n" +
            "then " +
            "  list.add( 1 );\n" +
            "end\n" +
            "\n" +
            "rule r2 salience 2\n" +
            "when " +
            "  m : MyClass(value == null)\n" +
            "then " +
            "  modify(m) { setData(\"test\") }\n" +
            "  list.add( 2 );\n" +
            "end\n" +
            "\n" +
            "rule r3 salience 3\n" +
            "when " +
            "  MyClass(value == null)\n" +
            "then " +
            "  list.add( 3 );\n" +
            "end";

    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add( ResourceFactory.newByteArrayResource(rule1.getBytes()), ResourceType.DRL );

    if ( kbuilder.hasErrors() ) {
        fail( kbuilder.getErrors().toString() );
    }

    KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );

    StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
    List list = new ArrayList();
    ksession.setGlobal("list", list);

    assertEquals(4, ksession.fireAllRules());

    assertEquals(3, list.size());

    assertEquals(3, list.get(0));
    assertEquals(2, list.get(1));
    assertEquals(1, list.get(2));
}


On 20 Dec 2013, at 15:14, Mark Proctor <mproctor@codehaus.org> wrote:

I turned your code into a unit test and added it to the 6.0 codebase. see the method “testModifyAfterInsertWithPropertyReactive” in the commit:

It works for PHREAK and RETE mode. Everything works for 6.0, we’ll try it against 5.6.CR1 soon

Mark

On 20 Dec 2013, at 09:14, Sonata <plz.write.to@gmail.com> wrote:

Davide Sottara wrote
The goal of @propertyReactive is exactly to prevent rules from refiring
on a modify, based on what properties are constrained or @watched.
This is irrelevant with respect to the order of the rules.
This may or may not be a bug, we'd need to see the rules.
Davide

Example attached

ReactiveTest.java
package com.sample;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.StatefulKnowledgeSession;
public class ReactiveTest {
public static final void main(String[] args) {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"),
ResourceType.DRL);
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
ksession.insert(new MyClass());
ksession.fireAllRules();
}
}

MyClass.java
package com.sample;
import org.drools.definition.type.PropertyReactive;
@PropertyReactive
public class MyClass {
private String value;
public String getValue() { return value; }
public void setValue(String value) { this.value = value; }
}

Sample.drl
package com.sample;
rule "1"
when MyClass(value == null)
then System.out.println("Rule 1 fired");
end

rule "2"
when m : MyClass(value == null)
then modify(m) { setData("test") }
end

rule "3"
when MyClass(value == null)
then System.out.println("Rule 3 fired");
end

So you can see from the example, rule "1", rule "2" and rule "3" are all
added to the stack ready to be fired.
Rules are then fired starting from the bottom, where rule "3" fired and then
rule "2" fired. But rule "1" is being removed from the stack after rule "2"
has fired, which is a mystery to me.

Try to remove modify(m) to just m.setData("test") in rule "2", all three
rules fired.

So I agree to your "prevent rules from refiring", but this case is not even
fired yet.



--
View this message in context: http://drools.46999.n3.nabble.com/Adding-PropertyReactive-causes-the-other-rules-removed-from-the-stack-tp4027374p4027382.html
Sent from the Drools: User forum mailing list archive at Nabble.com.
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users




_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users