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 bb1a956ced [incubator-kie-drools-5868] exec-model : in operator with
BigDecimal and int (#5869)
bb1a956ced is described below
commit bb1a956ced70d5a46b245724113e6719d0fc85f3
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Fri Apr 26 10:19:50 2024 +0900
[incubator-kie-drools-5868] exec-model : in operator with BigDecimal and
int (#5869)
- Enhance InOperator to handle numeric equals
- Convert BigDecimalLiteralExpr for OperatorSpec
---
.../org/drools/model/operators/InOperator.java | 6 ++--
.../generator/drlxparse/ConstraintParser.java | 13 ++-----
.../generator/operatorspec/NativeOperatorSpec.java | 7 ++--
.../codegen/execmodel/util/ExpressionUtils.java} | 39 ++++++++------------
.../execmodel/bigdecimaltest/BigDecimalTest.java | 42 ++++++++++++++++++++++
.../generator/drlxparse/ConstraintParserTest.java | 16 ++++++++-
6 files changed, 83 insertions(+), 40 deletions(-)
diff --git
a/drools-model/drools-canonical-model/src/main/java/org/drools/model/operators/InOperator.java
b/drools-model/drools-canonical-model/src/main/java/org/drools/model/operators/InOperator.java
index adbc42970c..2502394e36 100644
---
a/drools-model/drools-canonical-model/src/main/java/org/drools/model/operators/InOperator.java
+++
b/drools-model/drools-canonical-model/src/main/java/org/drools/model/operators/InOperator.java
@@ -20,6 +20,8 @@ package org.drools.model.operators;
import org.drools.model.functions.Operator;
+import static org.drools.model.util.OperatorUtils.areEqual;
+
public enum InOperator implements Operator.MultipleValue<Object, Object> {
INSTANCE;
@@ -27,9 +29,7 @@ public enum InOperator implements
Operator.MultipleValue<Object, Object> {
@Override
public boolean eval( Object a, Object[] bs ) {
for (Object b : bs) {
- if (a == null && b == null) {
- return true;
- } else if (a != null && a.equals( b )) {
+ if (areEqual(a, b)) {
return true;
}
}
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 f8a7365708..fbc43b7167 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
@@ -98,6 +98,7 @@ import static
org.drools.model.codegen.execmodel.generator.ConstraintUtil.LESS_T
import static
org.drools.model.codegen.execmodel.generator.expressiontyper.ExpressionTyper.convertArithmeticBinaryToMethodCall;
import static
org.drools.model.codegen.execmodel.generator.expressiontyper.ExpressionTyper.getBinaryTypeAfterConversion;
import static
org.drools.model.codegen.execmodel.generator.expressiontyper.ExpressionTyper.shouldConvertArithmeticBinaryToMethodCall;
+import static
org.drools.model.codegen.execmodel.util.ExpressionUtils.convertBigIntegerLiteralExprOrBigDecimalLiteralExpr;
import static org.drools.util.StringUtils.lcFirstForBean;
import static
org.drools.model.codegen.execmodel.generator.DrlxParseUtil.THIS_PLACEHOLDER;
import static
org.drools.model.codegen.execmodel.generator.DrlxParseUtil.createConstraintCompiler;
@@ -356,11 +357,7 @@ public class ConstraintParser {
if (drlxExpr instanceof LiteralExpr) {
Class<?> literalExpressionType =
getLiteralExpressionType(((LiteralExpr) drlxExpr));
- if (drlxExpr instanceof BigIntegerLiteralExpr) {
- drlxExpr = ((BigIntegerLiteralExpr)
drlxExpr).convertToObjectCreationExpr();
- } else if (drlxExpr instanceof BigDecimalLiteralExpr) {
- drlxExpr = ((BigDecimalLiteralExpr)
drlxExpr).convertToObjectCreationExpr();
- }
+ drlxExpr =
convertBigIntegerLiteralExprOrBigDecimalLiteralExpr(drlxExpr);
return new SingleDrlxParseSuccess(patternType, bindingId,
drlxExpr, literalExpressionType)
.setIsPredicate(isBooleanBoxedUnboxed(literalExpressionType));
}
@@ -984,11 +981,7 @@ public class ConstraintParser {
if(arg.isEnclosedExpr()) {
arg = arg.asEnclosedExpr().getInner();
}
- if (arg instanceof BigIntegerLiteralExpr) {
- arg = ((BigIntegerLiteralExpr) arg).convertToObjectCreationExpr();
- } else if (arg instanceof BigDecimalLiteralExpr ) {
- arg = ((BigDecimalLiteralExpr) arg).convertToObjectCreationExpr();
- }
+ arg = convertBigIntegerLiteralExprOrBigDecimalLiteralExpr(arg);
toBigDecimalMethod.addArgument( arg );
return toBigDecimalMethod;
}
diff --git
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/operatorspec/NativeOperatorSpec.java
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/operatorspec/NativeOperatorSpec.java
index 164fbf73b1..57fcecda5b 100644
---
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/operatorspec/NativeOperatorSpec.java
+++
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/operatorspec/NativeOperatorSpec.java
@@ -23,12 +23,12 @@ import java.util.Optional;
import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.expr.MethodCallExpr;
import com.github.javaparser.ast.expr.UnaryExpr;
-import org.drools.model.functions.Operator;
import org.drools.model.codegen.execmodel.errors.InvalidExpressionErrorResult;
import org.drools.model.codegen.execmodel.generator.RuleContext;
import org.drools.model.codegen.execmodel.generator.TypedExpression;
import
org.drools.model.codegen.execmodel.generator.drlxparse.CoercedExpression;
import
org.drools.model.codegen.execmodel.generator.expressiontyper.ExpressionTyper;
+import org.drools.model.functions.Operator;
import org.drools.mvel.parser.ast.expr.PointFreeExpr;
import org.drools.mvel.parser.printer.PrintUtil;
@@ -36,6 +36,7 @@ import static
org.drools.model.codegen.execmodel.generator.DrlxParseUtil.toStrin
import static
org.drools.model.codegen.execmodel.generator.DslMethodNames.EVAL_CALL;
import static
org.drools.model.codegen.execmodel.generator.DslMethodNames.createDslTopLevelMethod;
import static
org.drools.model.codegen.execmodel.generator.drlxparse.ConstraintParser.getCoercedRightExpression;
+import static
org.drools.model.codegen.execmodel.util.ExpressionUtils.convertBigIntegerLiteralExprOrBigDecimalLiteralExpr;
public class NativeOperatorSpec implements OperatorSpec {
public static final NativeOperatorSpec INSTANCE = new NativeOperatorSpec();
@@ -60,7 +61,9 @@ public class NativeOperatorSpec implements OperatorSpec {
} else {
coercedRight = right;
}
- methodCallExpr.addArgument(coercedRight.getExpression() );
+ Expression rightExpression = coercedRight.getExpression();
+ rightExpression =
convertBigIntegerLiteralExprOrBigDecimalLiteralExpr(rightExpression);
+ methodCallExpr.addArgument(rightExpression);
});
}
diff --git
a/drools-model/drools-canonical-model/src/main/java/org/drools/model/operators/InOperator.java
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/util/ExpressionUtils.java
similarity index 52%
copy from
drools-model/drools-canonical-model/src/main/java/org/drools/model/operators/InOperator.java
copy to
drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/util/ExpressionUtils.java
index adbc42970c..cfd8ffe180 100644
---
a/drools-model/drools-canonical-model/src/main/java/org/drools/model/operators/InOperator.java
+++
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/util/ExpressionUtils.java
@@ -1,4 +1,4 @@
-/**
+/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
@@ -16,33 +16,24 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.drools.model.operators;
+package org.drools.model.codegen.execmodel.util;
-import org.drools.model.functions.Operator;
+import com.github.javaparser.ast.expr.Expression;
+import org.drools.mvel.parser.ast.expr.BigDecimalLiteralExpr;
+import org.drools.mvel.parser.ast.expr.BigIntegerLiteralExpr;
-public enum InOperator implements Operator.MultipleValue<Object, Object> {
+public class ExpressionUtils {
- INSTANCE;
-
- @Override
- public boolean eval( Object a, Object[] bs ) {
- for (Object b : bs) {
- if (a == null && b == null) {
- return true;
- } else if (a != null && a.equals( b )) {
- return true;
- }
- }
- return false;
+ private ExpressionUtils() {
+ // utility class
}
- @Override
- public String getOperatorName() {
- return "in";
- }
-
- @Override
- public boolean requiresCoercion() {
- return true;
+ public static Expression
convertBigIntegerLiteralExprOrBigDecimalLiteralExpr(Expression expression) {
+ if (expression instanceof BigIntegerLiteralExpr) {
+ return ((BigIntegerLiteralExpr)
expression).convertToObjectCreationExpr();
+ } else if (expression instanceof BigDecimalLiteralExpr) {
+ return ((BigDecimalLiteralExpr)
expression).convertToObjectCreationExpr();
+ }
+ return expression;
}
}
diff --git
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/bigdecimaltest/BigDecimalTest.java
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/bigdecimaltest/BigDecimalTest.java
index 407462de39..885b27cb02 100644
---
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/bigdecimaltest/BigDecimalTest.java
+++
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/bigdecimaltest/BigDecimalTest.java
@@ -813,4 +813,46 @@ public class BigDecimalTest extends BaseModelTest {
assertThat(result).contains(new BigDecimal("80000"));
}
+
+ @Test
+ public void bigDecimalInWithInt_shouldNotFailToBuild() {
+ String str =
+ "package org.drools.modelcompiler.bigdecimals\n" +
+ "import " + BDFact.class.getCanonicalName() + ";\n" +
+ "rule \"Rule 1a\"\n" +
+ " when\n" +
+ " BDFact( value1 in (100, 200) )\n" +
+ " then\n" +
+ "end";
+
+ KieSession ksession = getKieSession(str);
+
+ BDFact bdFact = new BDFact();
+ bdFact.setValue1(new BigDecimal("100"));
+
+ ksession.insert(bdFact);
+
+ assertThat(ksession.fireAllRules()).isEqualTo(1);
+ }
+
+ @Test
+ public void bigDecimalInWithBD_shouldNotFailToBuild() {
+ String str =
+ "package org.drools.modelcompiler.bigdecimals\n" +
+ "import " + BDFact.class.getCanonicalName() + ";\n" +
+ "rule \"Rule 1a\"\n" +
+ " when\n" +
+ " BDFact( value1 in (100B, 200B) )\n" +
+ " then\n" +
+ "end";
+
+ KieSession ksession = getKieSession(str);
+
+ BDFact bdFact = new BDFact();
+ bdFact.setValue1(new BigDecimal("100"));
+
+ ksession.insert(bdFact);
+
+ assertThat(ksession.fireAllRules()).isEqualTo(1);
+ }
}
diff --git
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/generator/drlxparse/ConstraintParserTest.java
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/generator/drlxparse/ConstraintParserTest.java
index fa30324b94..cc62dedfdc 100644
---
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/generator/drlxparse/ConstraintParserTest.java
+++
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/generator/drlxparse/ConstraintParserTest.java
@@ -153,9 +153,23 @@ public class ConstraintParserTest {
}
@Test
- public void bigDecimalArithmeticInMathodCallScope() {
+ public void bigDecimalArithmeticInMethodCallScope() {
SingleDrlxParseSuccess result = (SingleDrlxParseSuccess)
parser.drlxParse(Person.class, "$p", "(money * new
java.math.BigDecimal(\"1000\")).longValue()");
assertThat(result.getExpr().toString()).isEqualTo("_this.getMoney().multiply(new
java.math.BigDecimal(\"1000\"),
java.math.MathContext.DECIMAL128).longValue()");
}
+
+ @Test
+ public void bigDecimalInWithInt() {
+ SingleDrlxParseSuccess result = (SingleDrlxParseSuccess)
parser.drlxParse(Person.class, "$p", "(money in (100, 200))");
+
+
assertThat(result.getExpr().toString()).isEqualTo("D.eval(org.drools.model.operators.InOperator.INSTANCE,
_this.getMoney(), 100, 200)");
+ }
+
+ @Test
+ public void bigDecimalInWithBD() {
+ SingleDrlxParseSuccess result = (SingleDrlxParseSuccess)
parser.drlxParse(Person.class, "$p", "(money in (100B, 200B))");
+
+
assertThat(result.getExpr().toString()).isEqualTo("D.eval(org.drools.model.operators.InOperator.INSTANCE,
_this.getMoney(), new java.math.BigDecimal(\"100\"), new
java.math.BigDecimal(\"200\"))");
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]