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]