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]

Reply via email to