Skip to content

Commit 9318817

Browse files
authored
BigDecimal coerce operation (#5786)
1 parent 2b151b7 commit 9318817

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/util/EvalHelper.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -533,28 +533,35 @@ public static String lcFirst(final String name) {
533533
public static Boolean compare(Object left, Object right, EvaluationContext ctx, BiPredicate<Comparable, Comparable> op) {
534534
if ( left == null || right == null ) {
535535
return null;
536-
} else if (left instanceof ChronoPeriod && right instanceof ChronoPeriod) {
536+
}
537+
if (left instanceof ChronoPeriod && right instanceof ChronoPeriod) {
537538
// periods have special compare semantics in FEEL as it ignores "days". Only months and years are compared
538539
Long l = ComparablePeriod.toTotalMonths((ChronoPeriod) left);
539540
Long r = ComparablePeriod.toTotalMonths((ChronoPeriod) right);
540541
return op.test( l, r );
541-
} else if (left instanceof TemporalAccessor && right instanceof TemporalAccessor) {
542+
}
543+
if (left instanceof TemporalAccessor && right instanceof TemporalAccessor) {
542544
// Handle specific cases when both time / datetime
543545
TemporalAccessor l = (TemporalAccessor) left;
544546
TemporalAccessor r = (TemporalAccessor) right;
545547
if (BuiltInType.determineTypeFromInstance(left) == BuiltInType.TIME && BuiltInType.determineTypeFromInstance(right) == BuiltInType.TIME) {
546548
return op.test(valuet(l), valuet(r));
547549
} else if (BuiltInType.determineTypeFromInstance(left) == BuiltInType.DATE_TIME && BuiltInType.determineTypeFromInstance(right) == BuiltInType.DATE_TIME) {
548550
return op.test(valuedt(l, r.query(TemporalQueries.zone())), valuedt(r, l.query(TemporalQueries.zone())));
549-
} // fallback; continue:
551+
}
552+
}
553+
if (left instanceof Number && right instanceof Number) {
554+
// Handle specific cases when both are Number, converting both to BigDecimal
555+
BigDecimal l = getBigDecimalOrNull(left);
556+
BigDecimal r = getBigDecimalOrNull(right);
557+
return op.test(l, r);
550558
}
551559
// last fallback:
552560
if ((left instanceof String && right instanceof String) ||
553-
(left instanceof Number && right instanceof Number) ||
554561
(left instanceof Boolean && right instanceof Boolean) ||
555562
(left instanceof Comparable && left.getClass().isAssignableFrom(right.getClass()))) {
556-
Comparable l = (Comparable) left;
557-
Comparable r = (Comparable) right;
563+
Comparable<?> l = (Comparable<?>) left;
564+
Comparable<?> r = (Comparable<?>) right;
558565
return op.test(l, r);
559566
}
560567
return null;

kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/util/EvalHelperTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.lang.reflect.Method;
2020
import java.math.BigDecimal;
21+
import java.math.BigInteger;
2122

2223
import org.junit.Test;
2324
import org.kie.dmn.feel.lang.FEELProperty;
@@ -70,6 +71,22 @@ public void testGetGenericAccessor() throws NoSuchMethodException {
7071
assertThat(EvalHelper.getGenericAccessor(TestPojo.class, "feelPropertyIdentifier")).as("getGenericAccessor should work for methods annotated with '@FEELProperty'.").isEqualTo(expectedAccessor);
7172
}
7273

74+
@Test
75+
public void testNumericValuesComparative() {
76+
assertThat(EvalHelper.compare(BigDecimal.valueOf(1), BigDecimal.valueOf(2), null, (l, r) -> l.compareTo(r) < 0)).isTrue();
77+
assertThat(EvalHelper.compare(1.0, 2.0, null, (l, r) -> l.compareTo(r) < 0)).isTrue();
78+
assertThat(EvalHelper.compare(1, 2, null, (l, r) -> l.compareTo(r) > 0)).isFalse();
79+
assertThat(EvalHelper.compare(BigDecimal.valueOf(1), 2, null, (l, r) -> l.compareTo(r) > 0)).isFalse();
80+
assertThat(EvalHelper.compare(1, BigDecimal.valueOf(2), null, (l, r) -> l.compareTo(r) < 0)).isTrue();
81+
assertThat(EvalHelper.compare(BigDecimal.valueOf(1), 2.3, null, (l, r) -> l.compareTo(r) == 0)).isFalse();
82+
assertThat(EvalHelper.compare(1.2, BigDecimal.valueOf(1.2), null, (l, r) -> l.compareTo(r) == 0)).isTrue();
83+
assertThat(EvalHelper.compare(BigDecimal.valueOf(1), 0L, null, (l, r) -> l.compareTo(r) > 0)).isTrue();
84+
assertThat(EvalHelper.compare(10L, BigDecimal.valueOf(2), null, (l, r) -> l.compareTo(r) < 0)).isFalse();
85+
assertThat(EvalHelper.compare(BigInteger.valueOf(1), BigInteger.valueOf(2), null, (l, r) -> l.compareTo(r) == 0)).isFalse();
86+
assertThat(EvalHelper.compare(BigInteger.valueOf(1), 2, null, (l, r) -> l.compareTo(r) < 0)).isTrue();
87+
assertThat(EvalHelper.compare(BigInteger.valueOf(1), 2.3, null, (l, r) -> l.compareTo(r) == 0)).isFalse();
88+
}
89+
7390
private static class TestPojo {
7491
@FEELProperty("feelPropertyIdentifier")
7592
public String getAProperty() {

0 commit comments

Comments
 (0)