-
Bug
-
Resolution: Unresolved
-
Major
-
None
-
None
-
None
-
None
-
NEW
-
NEW
Property reactivity is currently working on oopath as demostrated by this test case:
@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() );
}
Conversely what it is not working (it doesn't compile at all) is the use of the @watch annotation like in
@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() );
}
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.