[rules-users] Drools 6.0.1 Negative Patterns in Stream Mode not working

RichardAmbridge richard.ambridge at gmail.com
Wed May 7 09:44:11 EDT 2014


I am using drools 6.0.1 and I have the following test.

public class DroolsTest {

    public DroolsTest() {
    }
    
    @Test
    public void work() throws InterruptedException, IOException,
ClassNotFoundException {

        StringBuilder sb = new StringBuilder();
        sb.append("package drools\n");
        sb.append("import drools.MyObject;\n\n");

        sb.append("declare MyObject\n"
                + " @role ( event )\n"
                + "end\n\n");

        sb.append("rule \"Template2\"\n"
                + "\n"
                + "salience 0\n"
                + "dialect \"mvel\"\n"
                + "when\n"
                + "  $s : MyObject(val==0)\n"
                + "  not( MyObject(val==1, this after [0s,5s] $s ) )\n"
                + "\n"
                + "then\n"
                + "  System.out.println(\"Template 2 fired\")\n"
                + "   $s.name=\"2\";\n"
                + "\n"
                + "end\n");

        KieServices kieServices = KieServices.Factory.get();

        KieFileSystem kfs = kieServices.newKieFileSystem();
        kfs.write("src/main/resources/rules.drl", sb.toString());

        KieBuilder kieBuilder = kieServices.newKieBuilder(kfs);
        kieBuilder.buildAll();
        Results results = kieBuilder.getResults();
        assertFalse(results.hasMessages(Message.Level.ERROR));
        if (results.hasMessages(Message.Level.WARNING)) {
            System.out.println("Warnings logged");
        }
        KieContainer kieContainer =
kieServices.newKieContainer(kieBuilder.getKieModule().getReleaseId());

        KieBaseConfiguration kieBaseConfiguration =
kieServices.newKieBaseConfiguration();
        kieBaseConfiguration.setOption(EventProcessingOption.STREAM);
        KieBase kieBase = kieContainer.newKieBase(kieBaseConfiguration);
        KieSession ksession = kieBase.newKieSession();

        MyObject one = new MyObject();
        one.val = 0;

        FactHandle fh1 = ksession.insert(one);
        System.out.println("Insert one");
        ksession.fireAllRules();
        for (int i = 0; i < 13; i++) {
            System.out.println("Sleep:" + i);
            Thread.sleep(1000);
            //After 5 seconds, rule should fire
        }
        assertEquals("2", one.name);

        System.out.println("End");
        ksession.halt();
        ksession.dispose();
    }

    public class MyObject implements Serializable {

        String name;
        int val;
        boolean fired;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getVal() {
            return val;
        }

        public void setVal(int val) {
            this.val = val;
        }

        public boolean isFired() {
            return fired;
        }

        public void setFired(boolean fired) {
            this.fired = fired;
        }

    }
}


The rule is using 
 + "  $s : MyObject(val==0)\n"
 + "  not( MyObject(val==1, this after [0s,5s] $s ) )\n"

So, if a MyObject with val==0 is inserted, then after 5 seconds no MyObject
with val==1 is found the rule will fire.
This works in Drools 5.5.0

In 6.0.1 the rule doesn't fire.

Please help. I want to use drools 6 but cannot with this problem.

Thanks




--
View this message in context: http://drools.46999.n3.nabble.com/Drools-6-0-1-Negative-Patterns-in-Stream-Mode-not-working-tp4029463.html
Sent from the Drools: User forum mailing list archive at Nabble.com.


More information about the rules-users mailing list