Drools 6.0.1 Negative Patterns in Stream Mode not working

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Drools 6.0.1 Negative Patterns in Stream Mode not working

RichardAmbridge
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
Reply | Threaded
Open this post in threaded view
|

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

Mark Proctor
Can you try 6.1 beta2? And if there is still a bug, please open a jira:
http://mvnrepository.com/artifact/org.drools/drools-core/6.1.0.Beta2

Ideally please submit a self contained unit test, as a pull request. As explained here:
http://docs.jboss.org/drools/release/5.5.0.Final/droolsjbpm-introduction-docs/html/gettingstarted.html

Mark


On 7 May 2014, at 14:44, RichardAmbridge <[hidden email]> wrote:

> 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.
> _______________________________________________
> rules-users mailing list
> [hidden email]
> https://lists.jboss.org/mailman/listinfo/rules-users


_______________________________________________
rules-users mailing list
[hidden email]
https://lists.jboss.org/mailman/listinfo/rules-users
rjh
Reply | Threaded
Open this post in threaded view
|

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

rjh
In reply to this post by RichardAmbridge
You should set TimedRuleExectionOption to YES.

See here
http://docs.jboss.org/drools/release/6.0.1.Final/drools-docs/html_single/index.html#d0e592



--
View this message in context: http://drools.46999.n3.nabble.com/Drools-6-0-1-Negative-Patterns-in-Stream-Mode-not-working-tp4029463p4029474.html
Sent from the Drools: User forum mailing list archive at Nabble.com.
_______________________________________________
rules-users mailing list
[hidden email]
https://lists.jboss.org/mailman/listinfo/rules-users
Reply | Threaded
Open this post in threaded view
|

Re: Drools 6.0.1 Negative Patterns in Stream Mode not working

RichardAmbridge
In reply to this post by RichardAmbridge
Thank you for the reply.

Adding:
        KieSessionConfiguration ksconf = KieServices.Factory.get().newKieSessionConfiguration();
        ksconf.setOption(TimedRuleExectionOption.YES);
        KieSession ksession = kieBase.newKieSession(ksconf, null);

as per the docs solved the problem.