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 4478a4c66a [Incubator kie issues#1743]Return a list of dates instead
of a range (#6223)
4478a4c66a is described below
commit 4478a4c66ac44ea0bd1ae77681a1bd3d93970413
Author: AthiraHari77 <[email protected]>
AuthorDate: Tue Jan 21 12:14:43 2025 +0530
[Incubator kie issues#1743]Return a list of dates instead of a range (#6223)
* [incubator-kie-issues-162105] Code fix to return list of dates
* [incubator-kie-issues-162105] WIP
* [incubator-kie-issues-162105] WIP
* [incubator-kie-issues#1743] Updated test cases
* [incubator-kie-issues#1743] Code refactoring
* [incubator-kie-issues#1743] Code refactoring
* [incubator-kie-issues#1743] Code clean up
* [incubator-kie-issues#1743] Updated test cases
* [incubator-kie-issues#1743] Code fixes
* [incubator-kie-issues#1743] Code clean up
* [incubator-kie-issues#1743] Fix review comments
* [incubator-kie-issues#1743] Code fix
* [incubator-kie-issues#1743] Fix review comments
* [incubator-kie-issues#1743] Fix merge conflicts
* [incubator-kie-issues#1743] Fix broken testcases and remove unused classes
---------
Co-authored-by: athira <[email protected]>
---
...pointOfForIterationDifferentTypeException.java} | 2 +-
...dpointOfForIterationNotValidTypeException.java} | 2 +-
.../EndpointOfRangeNotOfNumberException.java | 22 ----
.../kie/dmn/feel/lang/ast/ForExpressionNode.java | 18 ++--
.../forexpressioniterators/ForIterationUtils.java | 17 +--
.../main/java/org/kie/dmn/feel/runtime/Range.java | 8 ++
.../org/kie/dmn/feel/runtime/impl/RangeImpl.java | 30 ++++++
.../src/main/java/org/kie/dmn/feel/util/Msg.java | 1 +
.../dmn/feel/lang/ast/ForExpressionNodeTest.java | 41 +++-----
.../ForIterationUtilsTest.java | 20 ++--
.../kie/dmn/feel/runtime/impl/RangeImplTest.java | 116 +++++++++++++++++++++
.../dmn/feel/util/ExpressionNodeFactoryUtils.java | 94 +++++++++++++++++
12 files changed, 295 insertions(+), 76 deletions(-)
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/exceptions/EndpointOfRangeOfDifferentTypeException.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/exceptions/EndpointOfForIterationDifferentTypeException.java
similarity index 91%
rename from
kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/exceptions/EndpointOfRangeOfDifferentTypeException.java
rename to
kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/exceptions/EndpointOfForIterationDifferentTypeException.java
index 4c62799bea..fd762a0e7a 100644
---
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/exceptions/EndpointOfRangeOfDifferentTypeException.java
+++
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/exceptions/EndpointOfForIterationDifferentTypeException.java
@@ -18,6 +18,6 @@
*/
package org.kie.dmn.feel.exceptions;
-public class EndpointOfRangeOfDifferentTypeException extends RuntimeException {
+public class EndpointOfForIterationDifferentTypeException extends
RuntimeException {
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/exceptions/EndpointOfRangeNotValidTypeException.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/exceptions/EndpointOfForIterationNotValidTypeException.java
similarity index 91%
rename from
kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/exceptions/EndpointOfRangeNotValidTypeException.java
rename to
kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/exceptions/EndpointOfForIterationNotValidTypeException.java
index f49115f618..9e1b3d69e6 100644
---
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/exceptions/EndpointOfRangeNotValidTypeException.java
+++
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/exceptions/EndpointOfForIterationNotValidTypeException.java
@@ -18,6 +18,6 @@
*/
package org.kie.dmn.feel.exceptions;
-public class EndpointOfRangeNotValidTypeException extends RuntimeException {
+public class EndpointOfForIterationNotValidTypeException extends
RuntimeException {
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/exceptions/EndpointOfRangeNotOfNumberException.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/exceptions/EndpointOfRangeNotOfNumberException.java
deleted file mode 100644
index 3c6ce52b78..0000000000
---
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/exceptions/EndpointOfRangeNotOfNumberException.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.kie.dmn.feel.exceptions;
-
-public class EndpointOfRangeNotOfNumberException extends RuntimeException {
-}
\ No newline at end of file
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/ast/ForExpressionNode.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/ast/ForExpressionNode.java
index 1229c35445..e8b32efdbf 100644
---
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/ast/ForExpressionNode.java
+++
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/ast/ForExpressionNode.java
@@ -19,12 +19,13 @@
package org.kie.dmn.feel.lang.ast;
import org.antlr.v4.runtime.ParserRuleContext;
-import org.kie.dmn.feel.exceptions.EndpointOfRangeNotValidTypeException;
-import org.kie.dmn.feel.exceptions.EndpointOfRangeOfDifferentTypeException;
+import org.kie.dmn.feel.exceptions.EndpointOfForIterationNotValidTypeException;
+import
org.kie.dmn.feel.exceptions.EndpointOfForIterationDifferentTypeException;
import org.kie.dmn.feel.lang.EvaluationContext;
import org.kie.dmn.feel.lang.Type;
import org.kie.dmn.feel.lang.ast.forexpressioniterators.ForIteration;
import org.kie.dmn.feel.lang.types.BuiltInType;
+import org.kie.dmn.feel.runtime.Range;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -82,7 +83,7 @@ public class ForExpressionNode
populateToReturn(0, ctx, toReturn);
LOG.trace("returning {}", toReturn);
return toReturn;
- } catch (EndpointOfRangeNotValidTypeException |
EndpointOfRangeOfDifferentTypeException e) {
+ } catch (EndpointOfForIterationNotValidTypeException |
EndpointOfForIterationDifferentTypeException e) {
// ast error already reported
return null;
} finally {
@@ -127,13 +128,18 @@ public class ForExpressionNode
private ForIteration createForIteration(EvaluationContext ctx,
IterationContextNode iterationContextNode) {
LOG.trace("Creating ForIteration for {}", iterationContextNode);
- ForIteration toReturn;
+ ForIteration toReturn = null;
String name = iterationContextNode.evaluateName(ctx);
Object result = iterationContextNode.evaluate(ctx);
Object rangeEnd = iterationContextNode.evaluateRangeEnd(ctx);
if (rangeEnd == null) {
- Iterable values = result instanceof Iterable iterable? iterable :
Collections.singletonList(result);
- toReturn = new ForIteration(name, values);
+ if (result instanceof Iterable iterable) {
+ toReturn = new ForIteration(name, iterable);
+ } else if (result instanceof Range) {
+ toReturn = getForIteration(ctx, name, ((Range)
result).getStart(), ((Range) result).getEnd());
+ } else {
+ toReturn = new ForIteration(name,
Collections.singletonList(result));
+ }
} else {
toReturn = getForIteration(ctx, name, result, rangeEnd);
}
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/ast/forexpressioniterators/ForIterationUtils.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/ast/forexpressioniterators/ForIterationUtils.java
index 2e02c5df99..2c53802edb 100644
---
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/ast/forexpressioniterators/ForIterationUtils.java
+++
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/ast/forexpressioniterators/ForIterationUtils.java
@@ -22,8 +22,8 @@ import java.math.BigDecimal;
import java.time.LocalDate;
import org.kie.dmn.api.feel.runtime.events.FEELEvent;
-import org.kie.dmn.feel.exceptions.EndpointOfRangeNotValidTypeException;
-import org.kie.dmn.feel.exceptions.EndpointOfRangeOfDifferentTypeException;
+import
org.kie.dmn.feel.exceptions.EndpointOfForIterationDifferentTypeException;
+import org.kie.dmn.feel.exceptions.EndpointOfForIterationNotValidTypeException;
import org.kie.dmn.feel.lang.EvaluationContext;
import org.kie.dmn.feel.runtime.events.ASTEventBase;
import org.kie.dmn.feel.util.Msg;
@@ -42,15 +42,15 @@ public class ForIterationUtils {
return new ForIteration(name, localDate, (LocalDate) end);
}
ctx.notifyEvt(() -> new ASTEventBase(FEELEvent.Severity.ERROR,
-
Msg.createMessage(Msg.VALUE_X_NOT_A_VALID_ENDPOINT_FOR_RANGE_BECAUSE_NOT_A_NUMBER_NOT_A_DATE,
start), null));
- throw new EndpointOfRangeOfDifferentTypeException();
+
Msg.createMessage(Msg.VALUE_X_NOT_A_VALID_ENDPOINT_FOR_FORITERATION_BECAUSE_NOT_A_NUMBER_NOT_A_DATE,
start), null));
+ throw new EndpointOfForIterationDifferentTypeException();
}
static void validateValues(EvaluationContext ctx, Object start, Object
end) {
if (start.getClass() != end.getClass()) {
ctx.notifyEvt(() -> new ASTEventBase(FEELEvent.Severity.ERROR,
Msg.createMessage(Msg.X_TYPE_INCOMPATIBLE_WITH_Y_TYPE,
start, end), null));
- throw new EndpointOfRangeOfDifferentTypeException();
+ throw new EndpointOfForIterationDifferentTypeException();
}
valueMustBeValid(ctx, start);
valueMustBeValid(ctx, end);
@@ -58,9 +58,10 @@ public class ForIterationUtils {
static void valueMustBeValid(EvaluationContext ctx, Object value) {
if (!(value instanceof BigDecimal) && !(value instanceof LocalDate)) {
- ctx.notifyEvt(() -> new ASTEventBase(FEELEvent.Severity.ERROR,
Msg.createMessage(Msg.VALUE_X_NOT_A_VALID_ENDPOINT_FOR_RANGE_BECAUSE_NOT_A_NUMBER_NOT_A_DATE,
value), null));
- throw new EndpointOfRangeNotValidTypeException();
+ ctx.notifyEvt(() -> new ASTEventBase(FEELEvent.Severity.ERROR,
Msg.createMessage(Msg.VALUE_X_NOT_A_VALID_ENDPOINT_FOR_FORITERATION_BECAUSE_NOT_A_NUMBER_NOT_A_DATE,
value), null));
+ throw new EndpointOfForIterationNotValidTypeException();
}
}
-
}
+
+
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/Range.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/Range.java
index 6cf3c539c1..e9d73c23c3 100644
--- a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/Range.java
+++ b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/Range.java
@@ -20,6 +20,9 @@ package org.kie.dmn.feel.runtime;
import org.kie.dmn.feel.lang.FEELDialect;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
public interface Range {
enum RangeBoundary {
@@ -38,4 +41,9 @@ public interface Range {
boolean isWithUndefined();
+ Comparable getStart();
+
+ Comparable getEnd();
+
+
}
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/impl/RangeImpl.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/impl/RangeImpl.java
index 32208d8724..ce49c8cf6d 100644
---
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/impl/RangeImpl.java
+++
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/impl/RangeImpl.java
@@ -18,6 +18,8 @@
*/
package org.kie.dmn.feel.runtime.impl;
+import java.math.BigDecimal;
+import java.time.LocalDate;
import java.util.function.BiPredicate;
import org.kie.dmn.feel.lang.FEELDialect;
@@ -98,6 +100,34 @@ public class RangeImpl
return withUndefined;
}
+ @Override
+ public Comparable getStart() {
+ if(lowEndPoint instanceof BigDecimal) {
+ BigDecimal start = (BigDecimal) lowEndPoint;
+ start = lowBoundary == Range.RangeBoundary.OPEN ?
start.add(BigDecimal.ONE) : start;
+ return start;
+ } else if (lowEndPoint instanceof LocalDate) {
+ LocalDate start = (LocalDate) lowEndPoint;
+ start = lowBoundary == Range.RangeBoundary.OPEN ?
start.plusDays(1) : start;
+ return start;
+ }
+ return lowEndPoint;
+ }
+
+ @Override
+ public Comparable getEnd() {
+ if (highEndPoint instanceof BigDecimal) {
+ BigDecimal end = (BigDecimal) highEndPoint;
+ end = highBoundary == Range.RangeBoundary.OPEN ?
end.subtract(BigDecimal.ONE) : end;
+ return end;
+ } else if (highEndPoint instanceof LocalDate) {
+ LocalDate end = (LocalDate) highEndPoint;
+ end = highBoundary == Range.RangeBoundary.OPEN ? end.minusDays(1)
: end;
+ return end;
+ }
+ return highEndPoint;
+ }
+
private Boolean finiteRangeIncludes(FEELDialect feelDialect, Object param)
{
if (lowBoundary == RangeBoundary.OPEN && highBoundary ==
RangeBoundary.OPEN) {
return bothOrThrow(compare(feelDialect, lowEndPoint, param, (l, r)
-> l.compareTo(r) < 0) , compare(feelDialect, highEndPoint, param, (l, r) ->
l.compareTo(r) > 0), param);
diff --git a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/util/Msg.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/util/Msg.java
index 1eb8b5a01d..f1715d3cc0 100644
--- a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/util/Msg.java
+++ b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/util/Msg.java
@@ -39,6 +39,7 @@ public final class Msg {
public static final Message2 X_TYPE_INCOMPATIBLE_WITH_Y_TYPE = new
Message2("%s type incompatible with %s type");
public static final Message1 INCOMPATIBLE_TYPE_FOR_RANGE = new
Message1("Type %s can not be used in a range unary test");
public static final Message1
VALUE_X_NOT_A_VALID_ENDPOINT_FOR_RANGE_BECAUSE_NOT_A_NUMBER_NOT_A_DATE = new
Message1("Value %s is not a valid endpoint for range, because neither a
feel:number nor a feel:date");
+ public static final Message1
VALUE_X_NOT_A_VALID_ENDPOINT_FOR_FORITERATION_BECAUSE_NOT_A_NUMBER_NOT_A_DATE =
new Message1("Value %s is not a valid value for forIteration, because neither a
feel:number nor a feel:date");
public static final Message1 EVALUATED_TO_NULL = new Message1("%s
evaluated to null");
public static final Message1 IS_NULL = new Message1("%s is null");
public static final Message0 BASE_NODE_EVALUATE_CALLED = new
Message0("BaseNode evaluate called");
diff --git
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/lang/ast/ForExpressionNodeTest.java
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/lang/ast/ForExpressionNodeTest.java
index f09f03caa6..fc7e9b17d0 100644
---
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/lang/ast/ForExpressionNodeTest.java
+++
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/lang/ast/ForExpressionNodeTest.java
@@ -19,6 +19,7 @@
package org.kie.dmn.feel.lang.ast;
import java.math.BigDecimal;
+import java.time.LocalDate;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap;
@@ -27,10 +28,14 @@ import java.util.Map;
import org.junit.jupiter.api.Test;
import org.kie.dmn.feel.util.EvaluationContextTestUtil;
-import org.kie.dmn.feel.lang.Type;
import org.kie.dmn.feel.lang.types.BuiltInType;
import static org.assertj.core.api.Assertions.assertThat;
+import static
org.kie.dmn.feel.util.ExpressionNodeFactoryUtils.getIterationContextNode;
+import static org.kie.dmn.feel.util.ExpressionNodeFactoryUtils.getListNode;
+import static org.kie.dmn.feel.util.ExpressionNodeFactoryUtils.getNameRefNode;
+import static
org.kie.dmn.feel.util.ExpressionNodeFactoryUtils.getNestedListNode;
+import static org.kie.dmn.feel.util.ExpressionNodeFactoryUtils.getRangeNode;
class ForExpressionNodeTest {
@@ -58,32 +63,12 @@ class ForExpressionNodeTest {
}
- private IterationContextNode getIterationContextNode(String variableName,
BaseNode expression, String text) {
- return new IterationContextNode(getNameDefNode(variableName),
expression, null, text);
- }
-
- private NameDefNode getNameDefNode(String text) {
- return new NameDefNode(Collections.singletonList(text), null, text);
- }
-
- private NameRefNode getNameRefNode(Type type, String text) {
- return new NameRefNode(type, text);
- }
-
- private ListNode getNestedListNode(String text, Map<String, List<String>>
values) {
- List<BaseNode> elements = values.entrySet()
- .stream()
- .map(entry -> getListNode(entry.getKey(), entry.getValue()))
- .map(BaseNode.class::cast)
- .toList();
- return new ListNode(elements, text);
- }
-
- private ListNode getListNode(String text, List<String> values) {
- List<BaseNode> elements = values.stream()
- .map(value -> new NumberNode(new BigDecimal(value), value))
- .map(BaseNode.class::cast)
- .toList();
- return new ListNode(elements, text);
+ @Test
+ void evaluateRange() {
+ IterationContextNode x = getIterationContextNode("x",
getRangeNode("[1980-01-01 .. 1980-01-03]", LocalDate.of(1980, 1, 1),
LocalDate.of(1980, 1, 3), RangeNode.IntervalBoundary.CLOSED,
RangeNode.IntervalBoundary.CLOSED ), "x in [1980-01-01 .. 1980-01-03]");
+ ForExpressionNode forExpressionNode = new
ForExpressionNode(Collections.singletonList(x),
getNameRefNode(BuiltInType.DATE, "x"), "for x in [1980-01-01 .. 1980-01-03]
return x");
+ Object retrieved =
forExpressionNode.evaluate(EvaluationContextTestUtil.newEmptyEvaluationContext());
+
assertThat(retrieved).isInstanceOf(List.class).asList().containsExactly(LocalDate.of(1980,
1, 1),
+ LocalDate.of(1980, 1, 2), LocalDate.of(1980, 1, 3));
}
}
\ No newline at end of file
diff --git
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/lang/ast/forexpressioniterators/ForIterationUtilsTest.java
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/lang/ast/forexpressioniterators/ForIterationUtilsTest.java
index 852ed9e205..7b068a1d4c 100644
---
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/lang/ast/forexpressioniterators/ForIterationUtilsTest.java
+++
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/lang/ast/forexpressioniterators/ForIterationUtilsTest.java
@@ -25,8 +25,8 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.kie.dmn.api.feel.runtime.events.FEELEvent;
import org.kie.dmn.api.feel.runtime.events.FEELEventListener;
-import org.kie.dmn.feel.exceptions.EndpointOfRangeNotValidTypeException;
-import org.kie.dmn.feel.exceptions.EndpointOfRangeOfDifferentTypeException;
+import
org.kie.dmn.feel.exceptions.EndpointOfForIterationDifferentTypeException;
+import org.kie.dmn.feel.exceptions.EndpointOfForIterationNotValidTypeException;
import org.kie.dmn.feel.lang.EvaluationContext;
import org.kie.dmn.feel.lang.impl.FEELEventListenersManager;
import org.mockito.ArgumentCaptor;
@@ -71,7 +71,7 @@ class ForIterationUtilsTest {
try {
getForIteration(ctx, "iteration", "NOT", "VALID");
} catch (Exception e) {
-
assertThat(e).isInstanceOf(EndpointOfRangeNotValidTypeException.class);
+
assertThat(e).isInstanceOf(EndpointOfForIterationNotValidTypeException.class);
final ArgumentCaptor<FEELEvent> captor =
ArgumentCaptor.forClass(FEELEvent.class);
verify(listener, times(1)).onEvent(captor.capture());
reset(listener);
@@ -79,7 +79,7 @@ class ForIterationUtilsTest {
try {
getForIteration(ctx, "iteration", BigDecimal.valueOf(1),
LocalDate.of(2021, 1, 1));
} catch (Exception e) {
-
assertThat(e).isInstanceOf(EndpointOfRangeOfDifferentTypeException.class);
+
assertThat(e).isInstanceOf(EndpointOfForIterationDifferentTypeException.class);
final ArgumentCaptor<FEELEvent> captor =
ArgumentCaptor.forClass(FEELEvent.class);
verify(listener, times(1)).onEvent(captor.capture());
reset(listener);
@@ -87,7 +87,7 @@ class ForIterationUtilsTest {
try {
getForIteration(ctx, "iteration", LocalDate.of(2021, 1, 1),
BigDecimal.valueOf(1));
} catch (Exception e) {
-
assertThat(e).isInstanceOf(EndpointOfRangeOfDifferentTypeException.class);
+
assertThat(e).isInstanceOf(EndpointOfForIterationDifferentTypeException.class);
final ArgumentCaptor<FEELEvent> captor =
ArgumentCaptor.forClass(FEELEvent.class);
verify(listener, times(1)).onEvent(captor.capture());
reset(listener);
@@ -107,7 +107,7 @@ class ForIterationUtilsTest {
try {
valueMustBeValid(ctx, "INVALID");
} catch (Exception e) {
-
assertThat(e).isInstanceOf(EndpointOfRangeNotValidTypeException.class);
+
assertThat(e).isInstanceOf(EndpointOfForIterationNotValidTypeException.class);
final ArgumentCaptor<FEELEvent> captor =
ArgumentCaptor.forClass(FEELEvent.class);
verify(listener, times(1)).onEvent(captor.capture());
}
@@ -126,7 +126,7 @@ class ForIterationUtilsTest {
try {
validateValues(ctx, "INVALID", "INVALID");
} catch (Exception e) {
-
assertThat(e).isInstanceOf(EndpointOfRangeNotValidTypeException.class);
+
assertThat(e).isInstanceOf(EndpointOfForIterationNotValidTypeException.class);
final ArgumentCaptor<FEELEvent> captor =
ArgumentCaptor.forClass(FEELEvent.class);
verify(listener, times(1)).onEvent(captor.capture());
reset(listener);
@@ -134,7 +134,7 @@ class ForIterationUtilsTest {
try {
validateValues(ctx, BigDecimal.valueOf(1), LocalDate.of(2021, 1,
1));
} catch (Exception e) {
-
assertThat(e).isInstanceOf(EndpointOfRangeOfDifferentTypeException.class);
+
assertThat(e).isInstanceOf(EndpointOfForIterationDifferentTypeException.class);
final ArgumentCaptor<FEELEvent> captor =
ArgumentCaptor.forClass(FEELEvent.class);
verify(listener, times(1)).onEvent(captor.capture());
reset(listener);
@@ -142,10 +142,10 @@ class ForIterationUtilsTest {
try {
validateValues(ctx, LocalDate.of(2021, 1, 1),
BigDecimal.valueOf(1));
} catch (Exception e) {
-
assertThat(e).isInstanceOf(EndpointOfRangeOfDifferentTypeException.class);
+
assertThat(e).isInstanceOf(EndpointOfForIterationDifferentTypeException.class);
final ArgumentCaptor<FEELEvent> captor =
ArgumentCaptor.forClass(FEELEvent.class);
verify(listener, times(1)).onEvent(captor.capture());
reset(listener);
}
}
-}
\ No newline at end of file
+}
diff --git
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/impl/RangeImplTest.java
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/impl/RangeImplTest.java
index f81ddb68f7..83aefa0d8b 100644
---
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/impl/RangeImplTest.java
+++
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/impl/RangeImplTest.java
@@ -22,6 +22,10 @@ import org.junit.jupiter.api.Test;
import org.kie.dmn.feel.lang.FEELDialect;
import org.kie.dmn.feel.runtime.Range;
+import java.math.BigDecimal;
+import java.time.Duration;
+import java.time.LocalDate;
+
import static org.assertj.core.api.Assertions.assertThat;
class RangeImplTest {
@@ -160,4 +164,116 @@ class RangeImplTest {
rangeImpl2 = new RangeImpl(Range.RangeBoundary.CLOSED, 12, 17,
Range.RangeBoundary.CLOSED);
assertThat(rangeImpl2).doesNotHaveSameHashCodeAs(rangeImpl);
}
+
+ @Test
+ void getStartForBigDecimalRangeOpenBoundary() {
+ RangeImpl rangeImpl = new RangeImpl(Range.RangeBoundary.OPEN,
BigDecimal.TEN, BigDecimal.valueOf(20), Range.RangeBoundary.OPEN);
+
+ Comparable expectedResult = BigDecimal.valueOf(11);
+ Comparable actualResult = rangeImpl.getStart();
+ assertThat(actualResult).isEqualTo(expectedResult);
+ }
+
+ @Test
+ void getStartForBigDecimalRangeClosedBoundary() {
+ RangeImpl rangeImpl = new RangeImpl(Range.RangeBoundary.CLOSED,
BigDecimal.TEN, BigDecimal.valueOf(20), Range.RangeBoundary.OPEN);
+
+ Comparable expectedResult = BigDecimal.TEN;
+ Comparable actualResult = rangeImpl.getStart();
+ assertThat(actualResult).isEqualTo(expectedResult);
+ }
+
+ @Test
+ void getEndForBigDecimalRangeOpenBoundary() {
+ RangeImpl rangeImpl = new RangeImpl(Range.RangeBoundary.OPEN,
BigDecimal.TEN, BigDecimal.valueOf(20), Range.RangeBoundary.OPEN);
+
+ Comparable expectedResult = BigDecimal.valueOf(19);
+ Comparable actualResult = rangeImpl.getEnd();
+ assertThat(actualResult).isEqualTo(expectedResult);
+ }
+
+ @Test
+ void getEndForBigDecimalRangeClosedBoundary() {
+ RangeImpl rangeImpl = new RangeImpl(Range.RangeBoundary.CLOSED,
BigDecimal.TEN, BigDecimal.valueOf(20), Range.RangeBoundary.CLOSED);
+
+ Comparable expectedResult = BigDecimal.valueOf(20);
+ Comparable actualResult = rangeImpl.getEnd();
+ assertThat(actualResult).isEqualTo(expectedResult);
+ }
+
+ @Test
+ void getStartForLocalDateRangeOpenBoundary() {
+ RangeImpl rangeImpl = new RangeImpl(Range.RangeBoundary.OPEN,
LocalDate.of(2025, 1, 1), LocalDate.of(2025, 1, 7), Range.RangeBoundary.OPEN);
+
+ Comparable expectedResult = LocalDate.of(2025, 1, 2);
+ Comparable actualResult = rangeImpl.getStart();
+ assertThat(actualResult).isEqualTo(expectedResult);
+ }
+
+ @Test
+ void getStartForLocalDateRangeClosedBoundary() {
+ RangeImpl rangeImpl = new RangeImpl(Range.RangeBoundary.CLOSED,
LocalDate.of(2025, 1, 1), LocalDate.of(2025, 1, 7), Range.RangeBoundary.OPEN);
+
+ Comparable expectedResult = LocalDate.of(2025, 1, 1);
+ Comparable actualResult = rangeImpl.getStart();
+ assertThat(actualResult).isEqualTo(expectedResult);
+ }
+
+ @Test
+ void getEndForLocalDateRangeOpenBoundary() {
+ RangeImpl rangeImpl = new RangeImpl(Range.RangeBoundary.OPEN,
LocalDate.of(2025, 1, 1), LocalDate.of(2025, 1, 7), Range.RangeBoundary.OPEN);
+
+ Comparable expectedResult = LocalDate.of(2025, 1, 6);
+ Comparable actualResult = rangeImpl.getEnd();
+ assertThat(actualResult).isEqualTo(expectedResult);
+ }
+
+ @Test
+ void getEndForLocalDateRangeClosedBoundary() {
+ RangeImpl rangeImpl = new RangeImpl(Range.RangeBoundary.CLOSED,
LocalDate.of(2025, 1, 1), LocalDate.of(2025, 1, 7), Range.RangeBoundary.CLOSED);
+
+ Comparable expectedResult = LocalDate.of(2025, 1, 7);
+ Comparable actualResult = rangeImpl.getEnd();
+ assertThat(actualResult).isEqualTo(expectedResult);
+ }
+
+ @Test
+ void getStartForStringRangeClosedBoundary() {
+ RangeImpl rangeImpl = new RangeImpl(Range.RangeBoundary.CLOSED, "a",
"z", Range.RangeBoundary.OPEN);
+
+ Comparable expectedResult = "a";
+ Comparable actualResult = rangeImpl.getStart();
+ assertThat(actualResult).isEqualTo(expectedResult);
+
+ }
+
+ @Test
+ void getEndForStringRangeOpenBoundary() {
+ RangeImpl rangeImpl = new RangeImpl(Range.RangeBoundary.CLOSED, "a",
"z", Range.RangeBoundary.OPEN);
+
+ Comparable expectedResult = "z";
+ Comparable actualResult = rangeImpl.getEnd();
+ assertThat(actualResult).isEqualTo(expectedResult);
+
+ }
+
+ @Test
+ void getStartForDurationRangeOpenBoundary() {
+ RangeImpl rangeImpl = new RangeImpl(Range.RangeBoundary.OPEN,
Duration.parse("P2DT20H14M"), Duration.parse("P3DT20H14M"),
Range.RangeBoundary.CLOSED);
+
+ Comparable expectedResult = Duration.parse("P2DT20H14M");
+ Comparable actualResult = rangeImpl.getStart();
+ assertThat(actualResult).isEqualTo(expectedResult);
+
+ }
+
+ @Test
+ void getEndForDurationRangeClosedBoundary() {
+ RangeImpl rangeImpl = new RangeImpl(Range.RangeBoundary.CLOSED,
Duration.parse("P2DT20H14M"), Duration.parse("P3DT20H14M"),
Range.RangeBoundary.CLOSED);
+
+ Comparable expectedResult = Duration.parse("P3DT20H14M");
+ Comparable actualResult = rangeImpl.getEnd();
+ assertThat(actualResult).isEqualTo(expectedResult);
+
+ }
}
\ No newline at end of file
diff --git
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/util/ExpressionNodeFactoryUtils.java
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/util/ExpressionNodeFactoryUtils.java
new file mode 100644
index 0000000000..f7afe8f0c7
--- /dev/null
+++
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/util/ExpressionNodeFactoryUtils.java
@@ -0,0 +1,94 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.dmn.feel.util;
+
+import org.kie.dmn.feel.lang.Type;
+import org.kie.dmn.feel.lang.ast.BaseNode;
+import org.kie.dmn.feel.lang.ast.FunctionInvocationNode;
+import org.kie.dmn.feel.lang.ast.IterationContextNode;
+import org.kie.dmn.feel.lang.ast.ListNode;
+import org.kie.dmn.feel.lang.ast.NameDefNode;
+import org.kie.dmn.feel.lang.ast.NameRefNode;
+import org.kie.dmn.feel.lang.ast.NumberNode;
+import org.kie.dmn.feel.lang.ast.RangeNode;
+import org.kie.dmn.feel.lang.ast.StringNode;
+import org.kie.dmn.feel.lang.ast.TemporalConstantNode;
+import org.kie.dmn.feel.lang.types.BuiltInType;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+public class ExpressionNodeFactoryUtils {
+
+ public static IterationContextNode getIterationContextNode(String
variableName, BaseNode expression, String text) {
+ return new IterationContextNode(getNameDefNode(variableName),
expression, null, text);
+ }
+
+ public static NameDefNode getNameDefNode(String text) {
+ return new NameDefNode(Collections.singletonList(text), null, text);
+ }
+
+ public static NameRefNode getNameRefNode(Type type, String text) {
+ return new NameRefNode(type, text);
+ }
+
+ public static ListNode getNestedListNode(String text, Map<String,
List<String>> values) {
+ List<BaseNode> elements = values.entrySet()
+ .stream()
+ .map(entry -> getListNode(entry.getKey(), entry.getValue()))
+ .map(BaseNode.class::cast)
+ .toList();
+ return new ListNode(elements, text);
+ }
+
+ public static ListNode getListNode(String text, List<String> values) {
+ List<BaseNode> elements = values.stream()
+ .map(value -> {
+ if (value.matches("-?\\d+(\\.\\d+)?")) {
+ return new NumberNode(new BigDecimal(value), value);
+ } else if (value.matches("\\d{4}-\\d{2}-\\d{2}")) {
+ return new StringNode(value);
+ } else {
+ return new StringNode(value);
+ }
+ })
+ .map(BaseNode.class::cast)
+ .toList();
+
+ return new ListNode(elements, text);
+ }
+
+ public static TemporalConstantNode getTemporalConstantNode(Object value) {
+ return new TemporalConstantNode(value, null, null, null);
+ }
+
+ public static RangeNode getRangeNode(String text, LocalDate start,
LocalDate end, RangeNode.IntervalBoundary lowerBound,
RangeNode.IntervalBoundary upperBound) {
+ BaseNode nameRefNode = getNameRefNode(BuiltInType.DATE, "x");
+ ListNode startParams = getListNode(start.toString(),
List.of(start.toString()));
+ ListNode endParams = getListNode(end.toString(),
List.of(end.toString()));
+ BaseNode startNode = new FunctionInvocationNode(nameRefNode,
startParams, getTemporalConstantNode(start), start.toString());
+ BaseNode endNode = new FunctionInvocationNode(nameRefNode, endParams,
getTemporalConstantNode(end), end.toString());
+
+ return new RangeNode(lowerBound, upperBound, startNode, endNode, text);
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]