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

yamer 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 aabf01713e [kie-issues#1008] Big Decimal data type conversion Issue 
(#5782)
aabf01713e is described below

commit aabf01713e1b768a54cf1922a1cb33fb4764bd26
Author: Yeser Amer <[email protected]>
AuthorDate: Fri Mar 15 09:47:56 2024 +0100

    [kie-issues#1008] Big Decimal data type conversion Issue (#5782)
    
    * BigDecimal coerce operation
    
    * BigDecimal coerce operation
---
 .../main/java/org/kie/dmn/feel/util/EvalHelper.java   | 19 +++++++++++++------
 .../java/org/kie/dmn/feel/util/EvalHelperTest.java    | 17 +++++++++++++++++
 2 files changed, 30 insertions(+), 6 deletions(-)

diff --git 
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/util/EvalHelper.java 
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/util/EvalHelper.java
index 452b3b2db1..8a85cef4ed 100644
--- a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/util/EvalHelper.java
+++ b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/util/EvalHelper.java
@@ -546,12 +546,14 @@ public class EvalHelper {
     public static Boolean compare(Object left, Object right, EvaluationContext 
ctx, BiPredicate<Comparable, Comparable> op) {
         if ( left == null || right == null ) {
             return null;
-        } else if (left instanceof ChronoPeriod && right instanceof 
ChronoPeriod) {
+        }
+        if (left instanceof ChronoPeriod && right instanceof ChronoPeriod) {
             // periods have special compare semantics in FEEL as it ignores 
"days". Only months and years are compared
             Long l = ComparablePeriod.toTotalMonths((ChronoPeriod) left);
             Long r = ComparablePeriod.toTotalMonths((ChronoPeriod) right);
             return op.test( l, r );
-        } else if (left instanceof TemporalAccessor && right instanceof 
TemporalAccessor) {
+        }
+        if (left instanceof TemporalAccessor && right instanceof 
TemporalAccessor) {
             // Handle specific cases when both time / datetime
             TemporalAccessor l = (TemporalAccessor) left;
             TemporalAccessor r = (TemporalAccessor) right;
@@ -559,15 +561,20 @@ public class EvalHelper {
                 return op.test(valuet(l), valuet(r));
             } else if (BuiltInType.determineTypeFromInstance(left) == 
BuiltInType.DATE_TIME && BuiltInType.determineTypeFromInstance(right) == 
BuiltInType.DATE_TIME) {
                 return op.test(valuedt(l, r.query(TemporalQueries.zone())), 
valuedt(r, l.query(TemporalQueries.zone())));
-            } // fallback; continue:
+            }
+        }
+        if (left instanceof Number && right instanceof Number) {
+            // Handle specific cases when both are Number, converting both to 
BigDecimal
+            BigDecimal l = getBigDecimalOrNull(left);
+            BigDecimal r = getBigDecimalOrNull(right);
+            return op.test(l, r);
         }
         // last fallback:
         if ((left instanceof String && right instanceof String) ||
-            (left instanceof Number && right instanceof Number) ||
             (left instanceof Boolean && right instanceof Boolean) ||
             (left instanceof Comparable && 
left.getClass().isAssignableFrom(right.getClass()))) {
-            Comparable l = (Comparable) left;
-            Comparable r = (Comparable) right;
+            Comparable<?> l = (Comparable<?>) left;
+            Comparable<?> r = (Comparable<?>) right;
             return op.test(l, r);
         }
         return null;
diff --git 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/util/EvalHelperTest.java 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/util/EvalHelperTest.java
index 259e9c32c2..3d7791ad65 100644
--- 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/util/EvalHelperTest.java
+++ 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/util/EvalHelperTest.java
@@ -20,6 +20,7 @@ package org.kie.dmn.feel.util;
 
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
+import java.math.BigInteger;
 
 import org.junit.Test;
 import org.kie.dmn.feel.lang.FEELProperty;
@@ -72,6 +73,22 @@ public class EvalHelperTest {
         assertThat(EvalHelper.getGenericAccessor(TestPojo.class, 
"feelPropertyIdentifier")).as("getGenericAccessor should work for methods 
annotated with '@FEELProperty'.").isEqualTo(expectedAccessor);
     }
 
+    @Test
+    public void testNumericValuesComparative() {
+        assertThat(EvalHelper.compare(BigDecimal.valueOf(1), 
BigDecimal.valueOf(2), null, (l, r) -> l.compareTo(r) < 0)).isTrue();
+        assertThat(EvalHelper.compare(1.0, 2.0, null, (l, r) -> l.compareTo(r) 
< 0)).isTrue();
+        assertThat(EvalHelper.compare(1, 2, null, (l, r) -> l.compareTo(r) > 
0)).isFalse();
+        assertThat(EvalHelper.compare(BigDecimal.valueOf(1), 2, null, (l, r) 
-> l.compareTo(r) > 0)).isFalse();
+        assertThat(EvalHelper.compare(1, BigDecimal.valueOf(2), null, (l, r) 
-> l.compareTo(r) < 0)).isTrue();
+        assertThat(EvalHelper.compare(BigDecimal.valueOf(1), 2.3, null, (l, r) 
-> l.compareTo(r) == 0)).isFalse();
+        assertThat(EvalHelper.compare(1.2, BigDecimal.valueOf(1.2), null, (l, 
r) -> l.compareTo(r) == 0)).isTrue();
+        assertThat(EvalHelper.compare(BigDecimal.valueOf(1), 0L, null, (l, r) 
-> l.compareTo(r) > 0)).isTrue();
+        assertThat(EvalHelper.compare(10L, BigDecimal.valueOf(2), null, (l, r) 
-> l.compareTo(r) < 0)).isFalse();
+        assertThat(EvalHelper.compare(BigInteger.valueOf(1), 
BigInteger.valueOf(2), null, (l, r) -> l.compareTo(r) == 0)).isFalse();
+        assertThat(EvalHelper.compare(BigInteger.valueOf(1), 2, null, (l, r) 
-> l.compareTo(r) < 0)).isTrue();
+        assertThat(EvalHelper.compare(BigInteger.valueOf(1), 2.3, null, (l, r) 
-> l.compareTo(r) == 0)).isFalse();
+    }
+
     private static class TestPojo {
         @FEELProperty("feelPropertyIdentifier")
         public String getAProperty() {


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

Reply via email to