[jboss-jira] [JBoss JIRA] (DROOLS-5220) Make @watch annotation to also work with oopath

Mario Fusco (Jira) issues at jboss.org
Mon Apr 6 06:28:00 EDT 2020


Mario Fusco created DROOLS-5220:
-----------------------------------

             Summary: Make @watch annotation to also work with oopath 
                 Key: DROOLS-5220
                 URL: https://issues.redhat.com/browse/DROOLS-5220
             Project: Drools
          Issue Type: Bug
            Reporter: Mario Fusco
            Assignee: Mario Fusco


Property reactivity is currently working on oopath as demostrated by this test case:

{code}
    @Test
    public void testPropertyReactivityWithOOPath() {
        String str =
                "import " + Person.class.getCanonicalName() + ";" +
                "import " + AdultUnit.class.getCanonicalName() + "\n" +
                "rule Adult @Unit( AdultUnit.class ) when\n" +
                "    $p : /persons[name == \"Mario\"]\n" +
                "then\n" +
                "    modify($p) { setAge($p.getAge()+1) };\n" +
                "end\n";

        KieContainer kieContainer = getKieContainer( null, str );
        RuleUnitExecutor executor = RuleUnitExecutor.newRuleUnitExecutor( kieContainer );

        Person mario = new Person( "Mario", 45 );
        Person sofia = new Person( "Sofia", 8 );

        DataSource<Person> persons = DataSource.create( mario, sofia );

        AdultUnit unit = new AdultUnit(persons);
        assertEquals(1, executor.run( unit ) );
        assertEquals(46, mario.getAge() );
    }
{code}

Conversely what it is not working (it doesn't compile at all) is the use of the @watch annotation like in

{code}
    @Test
    public void testPropertyReactivityWithOOPathAndWatch() {
        String str =
                "import " + Person.class.getCanonicalName() + ";" +
                "import " + AdultUnit.class.getCanonicalName() + "\n" +
                "rule Adult @Unit( AdultUnit.class ) when\n" +
                "    $p : /persons[$age : age, name == \"Mario\"] @watch( !age )\n" +
                "then\n" +
                "    modify($p) { setAge($age+1) };\n" +
                "end\n";

        KieContainer kieContainer = getKieContainer( null, str );
        RuleUnitExecutor executor = RuleUnitExecutor.newRuleUnitExecutor( kieContainer );

        Person mario = new Person( "Mario", 45 );
        Person sofia = new Person( "Sofia", 8 );

        DataSource<Person> persons = DataSource.create( mario, sofia );

        AdultUnit unit = new AdultUnit(persons);
        assertEquals(1, executor.run( unit ) );
        assertEquals(46, mario.getAge() );
    }
{code}

Of course this can work only on a one-level oopath. It has to be decided what to do (trigger a compile time error?) when trying to use that annotation on a oopath made of 2 or more chunks.



--
This message was sent by Atlassian Jira
(v7.13.8#713008)


More information about the jboss-jira mailing list