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

gitgabrio 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 59af187683 [incubator-kie-issues#21] Support negation of duration in 
DMN (#5662)
59af187683 is described below

commit 59af18768345b21ddce37d2e06aa2c208d32c62d
Author: Gabriele Cardosi <[email protected]>
AuthorDate: Wed Jan 24 16:40:14 2024 +0100

    [incubator-kie-issues#21] Support negation of duration in DMN (#5662)
    
    Co-authored-by: BAMOE CI <[email protected]>
---
 .../org/kie/dmn/feel/codegen/feel11/CompiledFEELSupport.java | 10 +++++++++-
 .../main/java/org/kie/dmn/feel/lang/ast/SignedUnaryNode.java |  8 ++++++++
 .../org/kie/dmn/feel/runtime/FEELDateTimeDurationTest.java   | 12 ++++++++++++
 3 files changed, 29 insertions(+), 1 deletion(-)

diff --git 
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/codegen/feel11/CompiledFEELSupport.java
 
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/codegen/feel11/CompiledFEELSupport.java
index 4224ad2be2..7b64e8000b 100644
--- 
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/codegen/feel11/CompiledFEELSupport.java
+++ 
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/codegen/feel11/CompiledFEELSupport.java
@@ -46,6 +46,7 @@ import 
org.kie.dmn.feel.lang.ast.QuantifiedExpressionNode.Quantifier;
 import org.kie.dmn.feel.lang.ast.forexpressioniterators.ForIteration;
 import org.kie.dmn.feel.lang.impl.SilentWrappingEvaluationContextImpl;
 import org.kie.dmn.feel.lang.types.BuiltInType;
+import org.kie.dmn.feel.lang.types.impl.ComparablePeriod;
 import org.kie.dmn.feel.runtime.FEELFunction;
 import org.kie.dmn.feel.runtime.Range;
 import org.kie.dmn.feel.runtime.UnaryTest;
@@ -59,6 +60,7 @@ import org.kie.dmn.feel.util.MsgUtil;
 import java.math.BigDecimal;
 import java.math.MathContext;
 
+import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -531,8 +533,14 @@ public class CompiledFEELSupport {
         return BigDecimalMath.pow( l, r, MathContext.DECIMAL128 );
     }
 
-    public static BigDecimal negate(EvaluationContext feelExprCtx, Object 
value) {
+    public static Object negate(EvaluationContext feelExprCtx, Object value) {
         if (isValidSignedType(feelExprCtx, value)) {
+            if (value instanceof ComparablePeriod comparablePeriod) {
+                return comparablePeriod.negated();
+            }
+            if (value instanceof Duration duration) {
+                return duration.negated();
+            }
             return ((BigDecimal) value).negate();
         } else {
             return null;
diff --git 
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/ast/SignedUnaryNode.java
 
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/ast/SignedUnaryNode.java
index 3ff34deaaf..be40367eaf 100644
--- 
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/ast/SignedUnaryNode.java
+++ 
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/ast/SignedUnaryNode.java
@@ -22,10 +22,12 @@ import org.antlr.v4.runtime.ParserRuleContext;
 import org.kie.dmn.api.feel.runtime.events.FEELEvent.Severity;
 import org.kie.dmn.feel.lang.EvaluationContext;
 import org.kie.dmn.feel.lang.Type;
+import org.kie.dmn.feel.lang.types.impl.ComparablePeriod;
 import org.kie.dmn.feel.util.EvalHelper;
 import org.kie.dmn.feel.util.Msg;
 
 import java.math.BigDecimal;
+import java.time.Duration;
 
 public class SignedUnaryNode
         extends BaseNode {
@@ -68,6 +70,12 @@ public class SignedUnaryNode
             ctx.notifyEvt( astEvent(Severity.ERROR, 
Msg.createMessage(Msg.CANNOT_BE_SIGNED)));
             return null;
         }
+        if (expressionResult instanceof ComparablePeriod comparablePeriod) {
+            return  Sign.NEGATIVE == sign ? comparablePeriod.negated() : 
expressionResult;
+        }
+        if (expressionResult instanceof Duration duration) {
+            return  Sign.NEGATIVE == sign ? duration.negated() : 
expressionResult;
+        }
         BigDecimal result = EvalHelper.getBigDecimalOrNull( expressionResult );
         if ( result == null ) {
             ctx.notifyEvt( astEvent(Severity.WARN, 
Msg.createMessage(Msg.NEGATING_A_NULL)));
diff --git 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/FEELDateTimeDurationTest.java
 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/FEELDateTimeDurationTest.java
index 42028a5b08..ee2b27411f 100644
--- 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/FEELDateTimeDurationTest.java
+++ 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/FEELDateTimeDurationTest.java
@@ -80,6 +80,7 @@ public class FEELDateTimeDurationTest extends BaseFEELTest {
                 { "(@\"13:20:00@Europe/Rome\").timezone", "Europe/Rome" , 
null},
                 { "(@\"13:20:00@Etc/UTC\").timezone", "Etc/UTC" , null},
                 { "(@\"13:20:00@Etc/GMT\").timezone", "Etc/GMT" , null},
+                { "-duration( \"P2Y2M\" )", ComparablePeriod.parse( "-P2Y2M" ) 
, null},
 
                 // comparison operators
                 { "duration( \"P1Y6M\" ) = duration( \"P1Y6M\" )", 
Boolean.TRUE , null},
@@ -94,6 +95,10 @@ public class FEELDateTimeDurationTest extends BaseFEELTest {
                 { "duration( \"P1Y6M\" ) != null", Boolean.TRUE , null},
                 { "duration( \"P1Y6M\" ) > null", null , null},
                 { "duration( \"P1Y6M\" ) < null", null , null},
+                { "-duration( \"P1Y6M\" ) = (duration( \"P1Y6M\" )*-1) ", 
Boolean.TRUE , null},
+                { "-duration( \"P1Y8M\" ) < duration( \"P1Y6M\" )", 
Boolean.TRUE , null},
+                { "-duration( \"P1Y8M\" ) < -duration( \"P1Y6M\" )", 
Boolean.TRUE , null},
+                { "-duration( \"P1Y6M\" ) > -duration( \"P1Y8M\" )", 
Boolean.TRUE , null},
                 {"time(\"10:30:00@Europe/Rome\") = 
time(\"10:30:00@Europe/Rome\")", Boolean.TRUE, null},
                 {"time(\"10:30:00@Europe/Rome\") = 
time(\"10:30:00@Europe/Paris\")", Boolean.TRUE, null},
                 {"is(time(\"10:30:00@Europe/Rome\"), 
time(\"10:30:00@Europe/Paris\"))", Boolean.FALSE, null},
@@ -165,8 +170,10 @@ public class FEELDateTimeDurationTest extends BaseFEELTest 
{
                 { "duration( \"P1Y1M\" ) + date and 
time(\"2016-07-29T05:48:23\")", LocalDateTime.of(2017, 8, 29, 5, 48, 23, 0) , 
null},
                 { "duration( \"P1DT1H1M\" ) + date and 
time(\"2016-07-29T05:48:23Z\")", ZonedDateTime.of(2016, 7, 30, 6, 49, 23, 0, 
ZoneId.of("Z").normalized()) , null},
                 { "duration( \"P1DT1H1M\" ) + date and 
time(\"2016-07-29T05:48:23\")", LocalDateTime.of(2016, 7, 30, 6, 49, 23, 0) , 
null},
+                { "-duration( \"P1DT1H1M\" ) + date and 
time(\"2016-07-29T05:48:23\")", LocalDateTime.of(2016, 7, 28, 4, 47, 23, 0) , 
null},
                 { "time(\"22:57:00\") + duration( \"PT1H1M\" )", 
LocalTime.of(23, 58, 0) , null},
                 { "duration( \"PT1H1M\" ) + time(\"22:57:00\")", 
LocalTime.of(23, 58, 0) , null},
+                { "-duration( \"PT1H1M\" ) + time(\"22:57:00\")", 
LocalTime.of(21, 56, 0) , null},
                 { "time( 22, 57, 00, duration(\"PT5H\")) + duration( 
\"PT1H1M\" )", OffsetTime.of( 23, 58, 0, 0, ZoneOffset.ofHours( 5 ) ) , null},
                 { "duration( \"PT1H1M\" ) + time( 22, 57, 00, 
duration(\"PT5H\"))", OffsetTime.of( 23, 58, 0, 0, ZoneOffset.ofHours( 5 ) ) , 
null},
 
@@ -186,11 +193,16 @@ public class FEELDateTimeDurationTest extends 
BaseFEELTest {
                 { "date and time(\"2016-07-29T05:48:23\") - duration( 
\"P1DT1H1M\" )", LocalDateTime.of(2016, 7, 28, 4, 47, 23, 0) , null},
                 { "date(\"2016-07-29\") - duration( \"P1D\" )", 
LocalDate.of(2016, 7, 28) , null},
                 { "date(\"2016-07-29\") - duration( \"P1Y1M\" )", 
LocalDate.of(2015, 6, 29) , null},
+                { "date(\"2016-07-29\") + (-duration( \"P1Y1M\" ))", 
LocalDate.of(2015, 6, 29) , null},
                 { "time(\"22:57:00\") - duration( \"PT1H1M\" )", 
LocalTime.of(21, 56, 0) , null},
                 { "time( 22, 57, 00, duration(\"PT5H\")) - duration( 
\"PT1H1M\" )", OffsetTime.of( 21, 56, 0, 0, ZoneOffset.ofHours( 5 ) ) , null},
 
+                { "duration( \"P2Y2M\" ) - (-duration( \"P1Y1M\" ))", 
ComparablePeriod.parse("P3Y3M"), null },
+                { "-duration( \"P2Y2M\" ) + duration( \"P1Y1M\" )", 
ComparablePeriod.parse("-P1Y1M"), null },
                 { "duration( \"P2Y2M\" ) * 2", ComparablePeriod.parse("P52M"), 
null },
                 { "2 * duration( \"P2Y2M\" )", ComparablePeriod.parse("P52M"), 
null },
+                { "-duration( \"P2Y2M\" ) * 2", 
ComparablePeriod.parse("-P52M"), null },
+                { "2 * -duration( \"P2Y2M\" )", 
ComparablePeriod.parse("-P52M"), null },
                 { "duration( \"P2Y2M\" ) * duration( \"P2Y2M\" )", null , 
FEELEvent.Severity.ERROR},
                 { "duration( \"P2DT20H14M\" ) * 2", Duration.parse( 
"P4DT40H28M" ) , null},
                 { "2 * duration( \"P2DT20H14M\" )", Duration.parse( 
"P4DT40H28M" ) , null},


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

Reply via email to