This is an automated email from the ASF dual-hosted git repository.

mariofusco 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 d506c1a3b9 [kie-issues#941] Fix wrongly generated type for parentheses 
enclosed expression variable binding (#5692)
d506c1a3b9 is described below

commit d506c1a3b977fe5f4f20bb3db826837505e02c9e
Author: Tibor Zimányi <[email protected]>
AuthorDate: Fri Feb 16 19:30:11 2024 +0100

    [kie-issues#941] Fix wrongly generated type for parentheses enclosed 
expression variable binding (#5692)
    
    * [kie-issues#941] Fix binding of enclosed expressions.
    
    * Additional fix for EnclosedExpr bindings.
    
    * Bind EnclosedExpr only when there is a bind variable.
    
    * Revert Misc2Test settings.
    
    * Add test for constraint binding.
    
    * Fix import.
---
 .../generator/drlxparse/ConstraintParser.java      |  9 +++++--
 .../expression/AbstractExpressionBuilder.java      | 13 ++++++++--
 .../model/codegen/execmodel/BindingTest.java       | 30 ++++++++++++++++++++++
 3 files changed, 48 insertions(+), 4 deletions(-)

diff --git 
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/drlxparse/ConstraintParser.java
 
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/drlxparse/ConstraintParser.java
index 8702e687c9..a6b5cab721 100644
--- 
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/drlxparse/ConstraintParser.java
+++ 
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/drlxparse/ConstraintParser.java
@@ -202,7 +202,12 @@ public class ConstraintParser {
     private void addDeclaration(DrlxExpression drlx, SingleDrlxParseSuccess 
singleResult, String bindId) {
         TypedDeclarationSpec decl = context.addDeclaration(bindId, 
getDeclarationType(drlx, singleResult));
         if (drlx.getExpr() instanceof NameExpr) {
-            decl.setBoundVariable( PrintUtil.printNode(drlx.getExpr()) );
+            decl.setBoundVariable(PrintUtil.printNode(drlx.getExpr()));
+        } else if (drlx.getExpr() instanceof EnclosedExpr && drlx.getBind() != 
null) {
+            ExpressionTyperContext expressionTyperContext = new 
ExpressionTyperContext();
+            ExpressionTyper expressionTyper = new ExpressionTyper(context, 
singleResult.getPatternType(), bindId, false, expressionTyperContext);
+            TypedExpressionResult typedExpressionResult = 
expressionTyper.toTypedExpression(drlx.getExpr());
+            
singleResult.setBoundExpr(typedExpressionResult.typedExpressionOrException());
         } else if (drlx.getExpr() instanceof BinaryExpr) {
             Expression leftMostExpression = 
getLeftMostExpression(drlx.getExpr().asBinaryExpr());
             decl.setBoundVariable(PrintUtil.printNode(leftMostExpression));
@@ -212,7 +217,7 @@ public class ConstraintParser {
                 ExpressionTyper expressionTyper = new ExpressionTyper(context, 
singleResult.getPatternType(), bindId, false, expressionTyperContext);
                 TypedExpressionResult leftTypedExpressionResult = 
expressionTyper.toTypedExpression(leftMostExpression);
                 Optional<TypedExpression> optLeft = 
leftTypedExpressionResult.getTypedExpression();
-                if (!optLeft.isPresent()) {
+                if (optLeft.isEmpty()) {
                     throw new IllegalStateException("Cannot create 
TypedExpression for " + drlx.getExpr().asBinaryExpr().getLeft());
                 }
                 singleResult.setBoundExpr(optLeft.get());
diff --git 
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/expression/AbstractExpressionBuilder.java
 
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/expression/AbstractExpressionBuilder.java
index 8c071c0d43..1bdf5bcde5 100644
--- 
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/expression/AbstractExpressionBuilder.java
+++ 
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/expression/AbstractExpressionBuilder.java
@@ -115,8 +115,17 @@ public abstract class AbstractExpressionBuilder {
         } else {
             final TypedExpression boundExpr = drlxParseResult.getBoundExpr();
             // Can we unify it? Sometimes expression is in the left sometimes 
in expression
-            final Expression e = boundExpr != null ? 
findLeftmostExpression(boundExpr.getExpression()) : drlxParseResult.getExpr();
-            return buildConstraintExpression(drlxParseResult, 
drlxParseResult.getUsedDeclarationsOnLeft(), e);
+            final Expression expression;
+            if (boundExpr != null) {
+                if (boundExpr.getExpression() instanceof EnclosedExpr) {
+                    expression = boundExpr.getExpression();
+                } else {
+                    expression = 
findLeftmostExpression(boundExpr.getExpression());
+                }
+            } else {
+                expression = drlxParseResult.getExpr();
+            }
+            return buildConstraintExpression(drlxParseResult, 
drlxParseResult.getUsedDeclarationsOnLeft(), expression);
         }
     }
 
diff --git 
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/BindingTest.java
 
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/BindingTest.java
index 7ecf142262..83e0d3411d 100644
--- 
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/BindingTest.java
+++ 
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/BindingTest.java
@@ -475,4 +475,34 @@ public class BindingTest extends BaseModelTest {
         ksession.fireAllRules();
         assertThat(result).isEmpty();
     }
+
+    @Test
+    public void testConstraintExpression() {
+        String str = "package constraintexpression\n" +
+                "\n" +
+                "import " + Person.class.getCanonicalName() + "\n" +
+                "import java.util.List; \n" +
+                "global List<Boolean> booleanListGlobal; \n" +
+                "rule \"r1\"\n" +
+                "when \n" +
+                "    $p : Person($booleanVariable: (name != null))\n" +
+                "then \n" +
+                "    System.out.println($booleanVariable); \n" +
+                "    System.out.println($p); \n" +
+                "    booleanListGlobal.add($booleanVariable); \n " +
+                "end \n";
+
+        KieSession ksession = getKieSession(str);
+        try {
+            final List<Boolean> booleanListGlobal = new ArrayList<>();
+            ksession.setGlobal("booleanListGlobal", booleanListGlobal);
+            Person person = new Person("someName");
+            ksession.insert(person);
+            int rulesFired = ksession.fireAllRules();
+            assertThat(rulesFired).isEqualTo(1);
+            
assertThat(booleanListGlobal).isNotEmpty().containsExactly(Boolean.TRUE);
+        } finally {
+            ksession.dispose();
+        }
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to