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

tzimanyi pushed a commit to branch 8.40.x
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git


The following commit(s) were added to refs/heads/8.40.x by this push:
     new 40820b0ca3 [kie-issues#649] Use appropriate BigDecimal method to 
convert to primitive type (#5567) (#5570)
40820b0ca3 is described below

commit 40820b0ca3da9ae6835f8fad887632ec7c57188a
Author: Tibor Zimányi <[email protected]>
AuthorDate: Mon Oct 30 13:55:26 2023 +0100

    [kie-issues#649] Use appropriate BigDecimal method to convert to primitive 
type (#5567) (#5570)
---
 .../mvelcompiler/ast/FieldToAccessorTExpr.java     |  14 ++-
 .../src/test/java/org/drools/Person.java           |  82 +++++++++++++++
 .../org/drools/mvelcompiler/MvelCompilerTest.java  | 110 +++++++++++++++++++++
 3 files changed, 205 insertions(+), 1 deletion(-)

diff --git 
a/drools-model/drools-mvel-compiler/src/main/java/org/drools/mvelcompiler/ast/FieldToAccessorTExpr.java
 
b/drools-model/drools-mvel-compiler/src/main/java/org/drools/mvelcompiler/ast/FieldToAccessorTExpr.java
index 1a9b1a290d..4c69faa9ed 100644
--- 
a/drools-model/drools-mvel-compiler/src/main/java/org/drools/mvelcompiler/ast/FieldToAccessorTExpr.java
+++ 
b/drools-model/drools-mvel-compiler/src/main/java/org/drools/mvelcompiler/ast/FieldToAccessorTExpr.java
@@ -19,6 +19,7 @@ package org.drools.mvelcompiler.ast;
 import java.lang.reflect.Method;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
+import java.math.BigDecimal;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
@@ -28,6 +29,7 @@ import com.github.javaparser.ast.Node;
 import com.github.javaparser.ast.expr.EnclosedExpr;
 import com.github.javaparser.ast.expr.Expression;
 import com.github.javaparser.ast.expr.MethodCallExpr;
+import org.drools.mvelcompiler.util.BigDecimalArgumentCoercion;
 import org.drools.util.MethodUtils;
 
 import static com.github.javaparser.ast.NodeList.nodeList;
@@ -70,7 +72,17 @@ public class FieldToAccessorTExpr implements TypedExpression 
{
                 .map(this::convertToStringIfNeeded)
                 .collect(Collectors.toList());
 
-        return new MethodCallExpr((Expression) scope.toJavaExpression(), 
accessor.getName(), nodeList(expressionArguments));
+        Optional<Type> rhsType = this.arguments.stream()
+                .findFirst()
+                .flatMap(TypedExpression::getType);
+
+        // Right is BigDecimal, left is other, coerce
+        if(rhsType.isPresent() && rhsType.get().equals(BigDecimal.class) && 
!type.equals(BigDecimal.class)) {
+            Expression coercedExpression = new 
BigDecimalArgumentCoercion().coercedArgument(BigDecimal.class, (Class<?>)type, 
expressionArguments.get(0));
+            return new MethodCallExpr((Expression) scope.toJavaExpression(), 
accessor.getName(), nodeList(coercedExpression));
+        } else {
+            return new MethodCallExpr((Expression) scope.toJavaExpression(), 
accessor.getName(), nodeList(expressionArguments));
+        }
     }
 
     private Expression convertToStringIfNeeded(TypedExpression 
argumentExpression) {
diff --git 
a/drools-model/drools-mvel-compiler/src/test/java/org/drools/Person.java 
b/drools-model/drools-mvel-compiler/src/test/java/org/drools/Person.java
index a79fc61d09..c7aa2e565e 100644
--- a/drools-model/drools-mvel-compiler/src/test/java/org/drools/Person.java
+++ b/drools-model/drools-mvel-compiler/src/test/java/org/drools/Person.java
@@ -26,6 +26,16 @@ public class Person {
 
     private String name;
     private int age;
+    private long longValue;
+    private short shortValue;
+    private double doubleValue;
+    private float floatValue;
+
+    private Integer integerBoxed;
+    private Long longBoxed;
+    private Short shortBoxed;
+    private Double doubleBoxed;
+    private Float floatBoxed;
 
     private Person parent;
     private Address address;
@@ -120,4 +130,76 @@ public class Person {
     public boolean isEven(int value) {
         return true;
     }
+
+    public long getLongValue() {
+        return longValue;
+    }
+
+    public void setLongValue(long longValue) {
+        this.longValue = longValue;
+    }
+
+    public short getShortValue() {
+        return shortValue;
+    }
+
+    public void setShortValue(short shortValue) {
+        this.shortValue = shortValue;
+    }
+
+    public double getDoubleValue() {
+        return doubleValue;
+    }
+
+    public void setDoubleValue(double doubleValue) {
+        this.doubleValue = doubleValue;
+    }
+
+    public float getFloatValue() {
+        return floatValue;
+    }
+
+    public void setFloatValue(float floatValue) {
+        this.floatValue = floatValue;
+    }
+
+    public Integer getIntegerBoxed() {
+        return integerBoxed;
+    }
+
+    public void setIntegerBoxed(Integer integerBoxed) {
+        this.integerBoxed = integerBoxed;
+    }
+
+    public Long getLongBoxed() {
+        return longBoxed;
+    }
+
+    public void setLongBoxed(Long longBoxed) {
+        this.longBoxed = longBoxed;
+    }
+
+    public Short getShortBoxed() {
+        return shortBoxed;
+    }
+
+    public void setShortBoxed(Short shortBoxed) {
+        this.shortBoxed = shortBoxed;
+    }
+
+    public Double getDoubleBoxed() {
+        return doubleBoxed;
+    }
+
+    public void setDoubleBoxed(Double doubleBoxed) {
+        this.doubleBoxed = doubleBoxed;
+    }
+
+    public Float getFloatBoxed() {
+        return floatBoxed;
+    }
+
+    public void setFloatBoxed(Float floatBoxed) {
+        this.floatBoxed = floatBoxed;
+    }
 }
diff --git 
a/drools-model/drools-mvel-compiler/src/test/java/org/drools/mvelcompiler/MvelCompilerTest.java
 
b/drools-model/drools-mvel-compiler/src/test/java/org/drools/mvelcompiler/MvelCompilerTest.java
index 24e7372038..315b57c972 100644
--- 
a/drools-model/drools-mvel-compiler/src/test/java/org/drools/mvelcompiler/MvelCompilerTest.java
+++ 
b/drools-model/drools-mvel-compiler/src/test/java/org/drools/mvelcompiler/MvelCompilerTest.java
@@ -778,6 +778,116 @@ public class MvelCompilerTest implements CompilerTest {
                      "}");
     }
 
+    @Test
+    public void testBigDecimalAssignmentToInt() {
+        test(ctx -> ctx.addDeclaration("$p", Person.class),
+                "{ " +
+                        "    $p.age = $p.salary;\n" +
+                        "}",
+                "{ " +
+                        "    $p.setAge($p.getSalary().intValue());\n" +
+                        "}");
+    }
+
+    @Test
+    public void testBigDecimalAssignmentToIntegerBoxed() {
+        test(ctx -> ctx.addDeclaration("$p", Person.class),
+                "{ " +
+                        "    $p.integerBoxed = $p.salary;\n" +
+                        "}",
+                "{ " +
+                        "    $p.setIntegerBoxed($p.getSalary().intValue());\n" 
+
+                        "}");
+    }
+
+    @Test
+    public void testBigDecimalAssignmentToLong() {
+        test(ctx -> ctx.addDeclaration("$p", Person.class),
+                "{ " +
+                        "    $p.longValue = $p.salary;\n" +
+                        "}",
+                "{ " +
+                        "    $p.setLongValue($p.getSalary().longValue());\n" +
+                        "}");
+    }
+
+    @Test
+    public void testBigDecimalAssignmentToLongBoxed() {
+        test(ctx -> ctx.addDeclaration("$p", Person.class),
+                "{ " +
+                        "    $p.longBoxed = $p.salary;\n" +
+                        "}",
+                "{ " +
+                        "    $p.setLongBoxed($p.getSalary().longValue());\n" +
+                        "}");
+    }
+
+    @Test
+    public void testBigDecimalAssignmentToShort() {
+        test(ctx -> ctx.addDeclaration("$p", Person.class),
+                "{ " +
+                        "    $p.shortValue = $p.salary;\n" +
+                        "}",
+                "{ " +
+                        "    $p.setShortValue($p.getSalary().shortValue());\n" 
+
+                        "}");
+    }
+
+    @Test
+    public void testBigDecimalAssignmentToShortBoxed() {
+        test(ctx -> ctx.addDeclaration("$p", Person.class),
+                "{ " +
+                        "    $p.shortBoxed = $p.salary;\n" +
+                        "}",
+                "{ " +
+                        "    $p.setShortBoxed($p.getSalary().shortValue());\n" 
+
+                        "}");
+    }
+
+    @Test
+    public void testBigDecimalAssignmentToDouble() {
+        test(ctx -> ctx.addDeclaration("$p", Person.class),
+                "{ " +
+                        "    $p.doubleValue = $p.salary;\n" +
+                        "}",
+                "{ " +
+                        "    
$p.setDoubleValue($p.getSalary().doubleValue());\n" +
+                        "}");
+    }
+
+    @Test
+    public void testBigDecimalAssignmentToDoubleBoxed() {
+        test(ctx -> ctx.addDeclaration("$p", Person.class),
+                "{ " +
+                        "    $p.doubleBoxed = $p.salary;\n" +
+                        "}",
+                "{ " +
+                        "    
$p.setDoubleBoxed($p.getSalary().doubleValue());\n" +
+                        "}");
+    }
+
+    @Test
+    public void testBigDecimalAssignmentToFloat() {
+        test(ctx -> ctx.addDeclaration("$p", Person.class),
+                "{ " +
+                        "    $p.floatValue = $p.salary;\n" +
+                        "}",
+                "{ " +
+                        "    $p.setFloatValue($p.getSalary().floatValue());\n" 
+
+                        "}");
+    }
+
+    @Test
+    public void testBigDecimalAssignmentToFloatBoxed() {
+        test(ctx -> ctx.addDeclaration("$p", Person.class),
+                "{ " +
+                        "    $p.floatBoxed = $p.salary;\n" +
+                        "}",
+                "{ " +
+                        "    $p.setFloatBoxed($p.getSalary().floatValue());\n" 
+
+                        "}");
+    }
+
     @Test
     public void testBigDecimalPromotionAllFourOperations() {
         test(ctx -> ctx.addDeclaration("$p", Person.class),


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

Reply via email to