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]

Reply via email to