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]