This is an automated email from the ASF dual-hosted git repository.
tkobayas pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git
The following commit(s) were added to refs/heads/main by this push:
new 526ed1fd16 [incubator-kie-drools-5957] executable model fails to
handle property reactive with null-safe-dereferencing (#5963)
526ed1fd16 is described below
commit 526ed1fd1649d50afad3bce520a31addfc322992
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Tue May 21 17:50:11 2024 +0900
[incubator-kie-drools-5957] executable model fails to handle property
reactive with null-safe-dereferencing (#5963)
---
.../generator/expressiontyper/ExpressionTyper.java | 13 ++++---
.../codegen/execmodel/PropertyReactivityTest.java | 40 ++++++++++++++++++++++
.../execmodel/generator/ExpressionTyperTest.java | 7 ++++
3 files changed, 56 insertions(+), 4 deletions(-)
diff --git
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/expressiontyper/ExpressionTyper.java
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/expressiontyper/ExpressionTyper.java
index 6cdc43d6d6..e693759450 100644
---
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/expressiontyper/ExpressionTyper.java
+++
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/expressiontyper/ExpressionTyper.java
@@ -1181,14 +1181,19 @@ public class ExpressionTyper {
TypedExpressionCursor teCursor;
if (childNodes.size() > 1 && !isInLineCast) {
SimpleName fieldName = null;
- if (childNodes.get(1) instanceof NameExpr) {
- fieldName = (( NameExpr ) childNodes.get(1 )).getName();
- } else if (childNodes.get(1) instanceof SimpleName) {
- fieldName = ( SimpleName ) childNodes.get(1 );
+ Node secondNode = childNodes.get(1);
+ if (secondNode instanceof NameExpr nameExpr) {
+ fieldName = nameExpr.getName();
+ } else if (secondNode instanceof SimpleName simpleName) {
+ fieldName = simpleName;
}
if (fieldName != null) {
context.addReactOnProperties( getFieldName(drlxExpr, fieldName
) );
}
+
+ if (secondNode instanceof MethodCallExpr methodCallExpr) {
+ addReactOnProperty(methodCallExpr.getNameAsString(),
methodCallExpr.getArguments());
+ }
}
teCursor = new TypedExpressionCursor(new NameExpr(THIS_PLACEHOLDER),
originalTypeCursor);
return teCursor;
diff --git
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/PropertyReactivityTest.java
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/PropertyReactivityTest.java
index 45569cdf54..66b9b8549c 100644
---
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/PropertyReactivityTest.java
+++
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/PropertyReactivityTest.java
@@ -607,6 +607,46 @@ public class PropertyReactivityTest extends BaseModelTest {
assertThat(me.getLikes()).isEqualTo("street1city1");
}
+ @Test
+ public void thisWithGetter() {
+ String str =
+ "import " + Person.class.getCanonicalName() + ";" +
+ "rule R \n" +
+ "when\n" +
+ " $p: Person(this.getAddress() != null)\n" +
+ "then\n" +
+ " modify($p) { setLikes(\"Cheese\") };\n" +
+ "end";
+
+ KieSession ksession = getKieSession( str );
+
+ Person me = new Person( "Mario", 40 );
+ me.setAddress(new Address("street1", 2, "city1"));
+ ksession.insert( me );
+
+ assertThat(ksession.fireAllRules(10)).as("should not
loop").isEqualTo(1);
+ }
+
+ @Test
+ public void nullSafeDereferencing() {
+ String str =
+ "import " + Person.class.getCanonicalName() + ";" +
+ "rule R \n" +
+ "when\n" +
+ " $p: Person(address!.street == \"street1\")\n" +
+ "then\n" +
+ " modify($p) { setLikes(\"Cheese\") };\n" +
+ "end";
+
+ KieSession ksession = getKieSession( str );
+
+ Person me = new Person( "Mario", 40 );
+ me.setAddress(new Address("street1", 2, "city1"));
+ ksession.insert( me );
+
+ assertThat(ksession.fireAllRules(10)).as("should not
loop").isEqualTo(1);
+ }
+
@Test
public void testNestedPropInRHS() throws Exception {
// Property Reactivity for "owner"
diff --git
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/generator/ExpressionTyperTest.java
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/generator/ExpressionTyperTest.java
index 0332dedb9c..619214eeec 100644
---
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/generator/ExpressionTyperTest.java
+++
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/generator/ExpressionTyperTest.java
@@ -274,6 +274,13 @@ public class ExpressionTyperTest {
assertThat(typedExpression.getExpression().toString()).isEqualTo(expected);
}
+ @Test
+ public void thisWithGetterReactivity() {
+ Expression expression = DrlxParseUtil.parseExpression("_this.getAge()
> 20").getExpr();
+ TypedExpressionResult result = new ExpressionTyper(ruleContext,
Person.class, null, true).toTypedExpression(expression);
+ assertThat(result.getReactOnProperties()).containsExactly("age");
+ }
+
private TypedExpression toTypedExpression(String inputExpression, Class<?>
patternType, TypedDeclarationSpec... declarations) {
for(TypedDeclarationSpec d : declarations) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]