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 c9496141f0 [incubator-kie-issues#2178] handle functionItem in
ItemDefinition (#6535)
c9496141f0 is described below
commit c9496141f08b8888675626eb364c03244864ddbd
Author: AthiraHari77 <[email protected]>
AuthorDate: Thu Dec 4 16:28:33 2025 +0530
[incubator-kie-issues#2178] handle functionItem in ItemDefinition (#6535)
* [incubator-kie-issues#2178]fix functionItem method
* [incubator-kie-issues#2178] handle getFunctionItem
* [incubator-kie-issues#2178] code refactor
* [incubator-kie-issues#2178] code refactoring
* [incubator-kie-issues#2178] code refactoring
* [incubator-kie-issues#2178] fix dmnversion issue
* [incubator-kie-issues#2178] update test cases
* [incubator-kie-issues#2178] code fix for namespace update
* [incubator-kie-issues#2178] update tests
* [incubator-kie-issues#2158] update tests
---------
Co-authored-by: athira <[email protected]>
---
.../org/kie/dmn/core/compiler/DMNCompilerImpl.java | 2 +-
.../compiler/ItemDefinitionDependenciesSorter.java | 75 +++++++++++---------
.../ItemDefinitionDependenciesGeneratedTest.java | 5 +-
.../compiler/ItemDefinitionDependenciesTest.java | 79 ++++++++++++++++++++--
.../java/org/kie/dmn/feel/lang/FEELDialect.java | 1 +
5 files changed, 120 insertions(+), 42 deletions(-)
diff --git
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java
index cad37f8f1b..a7e9ec068c 100644
---
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java
+++
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNCompilerImpl.java
@@ -290,7 +290,7 @@ public class DMNCompilerImpl implements DMNCompiler {
private void processItemDefinitions(DMNCompilerContext ctx, DMNModelImpl
model, Definitions dmndefs) {
dmndefs.normalize();
- List<ItemDefinition> ordered = new
ItemDefinitionDependenciesSorter(model.getNamespace()).sort(dmndefs.getItemDefinition());
+ List<ItemDefinition> ordered = new
ItemDefinitionDependenciesSorter(model.getNamespace()).sort(dmndefs.getItemDefinition(),
model.getDMNVersion());
Set<String> names = new HashSet<>();
for (ItemDefinition id : ordered) {
diff --git
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/ItemDefinitionDependenciesSorter.java
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/ItemDefinitionDependenciesSorter.java
index e98e45f6ac..515403b847 100644
---
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/ItemDefinitionDependenciesSorter.java
+++
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/ItemDefinitionDependenciesSorter.java
@@ -21,10 +21,10 @@ package org.kie.dmn.core.compiler;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
-import java.util.stream.Collectors;
import javax.xml.namespace.QName;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.model.api.ItemDefinition;
public class ItemDefinitionDependenciesSorter {
@@ -37,66 +37,77 @@ public class ItemDefinitionDependenciesSorter {
/**
* Return a new list of ItemDefinition sorted by dependencies (required
dependencies comes first)
+ * @param itemDefinitions list of ItemDefinitions available in the model
+ * @param dmnVersion version of dmn in the current model
*/
- public List<ItemDefinition> sort(List<ItemDefinition> ins) {
+ public List<ItemDefinition> sort(List<ItemDefinition> itemDefinitions,
DMNVersion dmnVersion) {
// In a graph A -> B -> {C, D}
// showing that A requires B, and B requires C,D
// then a depth-first visit would satisfy required ordering, for
example a valid depth first visit is also a valid sort here: C, D, B, A.
- Collection<ItemDefinition> visited = new ArrayList<>(ins.size());
- List<ItemDefinition> dfv = new ArrayList<>(ins.size());
+ Collection<ItemDefinition> visited = new
ArrayList<>(itemDefinitions.size());
+ List<ItemDefinition> sortedItemDefinitions = new
ArrayList<>(itemDefinitions.size());
- for (ItemDefinition node : ins) {
+ for (ItemDefinition node : itemDefinitions) {
if (!visited.contains(node)) {
- dfVisit(node, ins, visited, dfv);
+ populateSortedItemDefinitions(node, itemDefinitions, visited,
sortedItemDefinitions, dmnVersion);
}
}
- return dfv;
+ return sortedItemDefinitions;
}
/**
* Performs a depth first visit, but keeping a separate reference of
visited/visiting nodes, _also_ to avoid potential issues of circularities.
*/
- private void dfVisit(ItemDefinition node, List<ItemDefinition> allNodes,
Collection<ItemDefinition> visited, List<ItemDefinition> dfv) {
+ private void populateSortedItemDefinitions(ItemDefinition node,
List<ItemDefinition> allNodes, Collection<ItemDefinition> visited,
List<ItemDefinition> sortedItemDefinitions, DMNVersion dmnVersion) {
visited.add(node);
List<ItemDefinition> neighbours = allNodes.stream()
.filter(n ->
!n.getName().equals(node.getName())) // filter out `node`
- .filter(n ->
recurseFind(node, new QName(modelNamespace, n.getName()))) // I pick from
allNodes, those referenced by this `node`. Only neighbours of `node`, because N
is referenced by NODE.
-
.collect(Collectors.toList());
+ .filter(n ->
recurseFind(node, new QName(modelNamespace, n.getName()), modelNamespace,
dmnVersion)) // I pick from allNodes, those referenced by this `node`. Only
neighbours of `node`, because N is referenced by NODE.
+ .toList();
for (ItemDefinition n : neighbours) {
if (!visited.contains(n)) {
- dfVisit(n, allNodes, visited, dfv);
+ populateSortedItemDefinitions(n, allNodes, visited,
sortedItemDefinitions, dmnVersion);
}
}
- dfv.add(node);
+ sortedItemDefinitions.add(node);
}
-
- private static boolean recurseFind(ItemDefinition o1, QName qname2) {
- if ( o1.getTypeRef() != null ) {
- return extFastEqUsingNSPrefix(o1, qname2);
- }
- for ( ItemDefinition ic : o1.getItemComponent() ) {
- if ( recurseFind(ic, qname2) ) {
- return true;
+
+ private static boolean recurseFind(ItemDefinition o1, QName qname2, String
modelNamespace, DMNVersion dmnVersion) {
+ QName typeRef = retrieveTypeRef(o1, modelNamespace, dmnVersion);
+ return (typeRef != null)
+ ? matchesQNameUsingNamespacePrefixes(o1, typeRef, qname2)
+ : o1.getItemComponent().stream()
+ .anyMatch(component -> recurseFind(component, qname2,
modelNamespace, dmnVersion));
+ }
+
+ static QName retrieveTypeRef(ItemDefinition o1, String modelNamespace,
DMNVersion dmnVersion) {
+ QName toReturn = o1.getTypeRef();
+ if (toReturn == null
+ && dmnVersion.getDmnVersion() > DMNVersion.V1_2.getDmnVersion()
+ && o1.getFunctionItem() != null) {
+ toReturn = o1.getFunctionItem().getOutputTypeRef();
+ if (toReturn != null && toReturn.getNamespaceURI().isEmpty()) {
+ toReturn = new QName(modelNamespace, toReturn.getLocalPart());
}
}
- return false;
+ return toReturn;
}
-
- private static boolean extFastEqUsingNSPrefix(ItemDefinition o1, QName
qname2) {
- if (o1.getTypeRef().equals(qname2)) {
+
+ private static boolean matchesQNameUsingNamespacePrefixes(ItemDefinition
o1, QName typeRef, QName qname2) {
+ if (typeRef.equals(qname2)) {
return true;
}
- if (o1.getTypeRef().getLocalPart().endsWith(qname2.getLocalPart())) {
+ if (typeRef.getLocalPart().endsWith(qname2.getLocalPart())) {
for (String nsKey : o1.recurseNsKeys()) {
String ns = o1.getNamespaceURI(nsKey);
if (ns == null || !ns.equals(qname2.getNamespaceURI())) {
continue;
}
String prefix = nsKey + ".";
- if (o1.getTypeRef().getLocalPart().startsWith(prefix) &&
- o1.getTypeRef().getLocalPart().replace(prefix,
"").equals(qname2.getLocalPart())) {
+ if (typeRef.getLocalPart().startsWith(prefix) &&
+ typeRef.getLocalPart().replace(prefix,
"").equals(qname2.getLocalPart())) {
return true;
}
}
@@ -106,7 +117,7 @@ public class ItemDefinitionDependenciesSorter {
private static boolean directFind(ItemDefinition o1, QName qname2) {
if ( o1.getTypeRef() != null ) {
- return extFastEqUsingNSPrefix(o1, qname2);
+ return matchesQNameUsingNamespacePrefixes(o1, o1.getTypeRef(),
qname2);
}
for ( ItemDefinition ic : o1.getItemComponent() ) {
if ( ic.getTypeRef() == null ) {
@@ -120,8 +131,8 @@ public class ItemDefinitionDependenciesSorter {
}
return false;
}
-
- public static void displayDependencies(List<ItemDefinition> ins, String
namespaceURI) {
+
+ public static void displayDependencies(List<ItemDefinition> ins, String
namespaceURI, DMNVersion dmnVersion) {
for ( ItemDefinition in : ins ) {
System.out.println(in.getName());
List<ItemDefinition> others = new ArrayList<>(ins);
@@ -130,7 +141,7 @@ public class ItemDefinitionDependenciesSorter {
QName otherQName = new QName(namespaceURI, other.getName());
if ( directFind(in, otherQName) ) {
System.out.println(" direct depends on: "+other.getName());
- } else if ( recurseFind(in, otherQName) ) {
+ } else if ( recurseFind(in, otherQName, namespaceURI,
dmnVersion) ) {
System.out.println(" indir. depends on: "+other.getName());
}
}
@@ -138,4 +149,4 @@ public class ItemDefinitionDependenciesSorter {
}
-}
+}
\ No newline at end of file
diff --git
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/ItemDefinitionDependenciesGeneratedTest.java
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/ItemDefinitionDependenciesGeneratedTest.java
index 55f6377acf..449b970069 100644
---
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/ItemDefinitionDependenciesGeneratedTest.java
+++
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/ItemDefinitionDependenciesGeneratedTest.java
@@ -29,8 +29,9 @@ import javax.xml.namespace.QName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
+import org.kie.dmn.api.core.DMNVersion;
import org.kie.dmn.model.api.ItemDefinition;
-import org.kie.dmn.model.v1_1.TItemDefinition;
+import org.kie.dmn.model.v1_6.TItemDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -173,7 +174,7 @@ public class ItemDefinitionDependenciesGeneratedTest {
}
private List<ItemDefinition> orderingStrategy(final List<ItemDefinition>
ins) {
- return new ItemDefinitionDependenciesSorter(TEST_NS).sort(ins);
+ return new ItemDefinitionDependenciesSorter(TEST_NS).sort(ins,
DMNVersion.getLatest());
}
@MethodSource("generateParameters")
diff --git
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/ItemDefinitionDependenciesTest.java
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/ItemDefinitionDependenciesTest.java
index dcd2301cc5..c4f65e3c88 100644
---
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/ItemDefinitionDependenciesTest.java
+++
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/ItemDefinitionDependenciesTest.java
@@ -24,11 +24,14 @@ import java.util.List;
import javax.xml.namespace.QName;
import org.junit.jupiter.api.Test;
+import org.kie.dmn.api.core.DMNVersion;
+import org.kie.dmn.model.api.FunctionItem;
import org.kie.dmn.model.api.ItemDefinition;
-import org.kie.dmn.model.v1_1.TItemDefinition;
+import org.kie.dmn.model.v1_6.TFunctionItem;
+import org.kie.dmn.model.v1_6.TItemDefinition;
import static org.assertj.core.api.Assertions.assertThat;
-
+import static
org.kie.dmn.core.compiler.ItemDefinitionDependenciesSorter.retrieveTypeRef;
class ItemDefinitionDependenciesTest {
@@ -51,7 +54,7 @@ class ItemDefinitionDependenciesTest {
}
private List<ItemDefinition> orderingStrategy(final List<ItemDefinition>
ins) {
- return new ItemDefinitionDependenciesSorter(TEST_NS).sort(ins);
+ return new ItemDefinitionDependenciesSorter(TEST_NS).sort(ins,
DMNVersion.getLatest());
}
@Test
@@ -59,13 +62,13 @@ class ItemDefinitionDependenciesTest {
final ItemDefinition a = build("a");
final ItemDefinition b = build("b");
-
+
final ItemDefinition c = build("c", a, b);
-
+
final ItemDefinition d = build("d", c);
final List<ItemDefinition> originalList = Arrays.asList(d, c, b, a);
-
+
final List<ItemDefinition> orderedList =
orderingStrategy(originalList);
assertThat(orderedList.subList(0, 2)).contains(a,b);
@@ -227,4 +230,66 @@ class ItemDefinitionDependenciesTest {
assertThat(orderedList.subList(0, 2)).contains(fhirAge, fhirExtension);
assertThat(orderedList.subList(2, 3)).contains(fhirT1);
}
-}
+
+ @Test
+ void testTypeRefWhenPresent() {
+ QName expected = new QName(TEST_NS, "date");
+ ItemDefinition item = new TItemDefinition();
+ item.setTypeRef(expected);
+
+ QName result = retrieveTypeRef(item, TEST_NS, DMNVersion.V1_2);
+ assertThat(expected).isEqualTo(result);
+ }
+
+ @Test
+ void testTypeRefNull() {
+ ItemDefinition item = new TItemDefinition();
+
+ QName result = retrieveTypeRef(item, TEST_NS, DMNVersion.V1_2);
+ assertThat(result).isNull();
+ }
+
+ @Test
+ void testRetrieveTypeRefFromFunctionItem() {
+ ItemDefinition id = new TItemDefinition();
+ FunctionItem fi = new TFunctionItem();
+ QName type = new QName(TEST_NS, "date");
+ fi.setOutputTypeRef(type);
+ id.setFunctionItem(fi);
+ QName result = retrieveTypeRef(id, TEST_NS, DMNVersion.V1_3);
+ assertThat(type).isEqualTo(result);
+ }
+
+ @Test
+ void retrieveTypeRef_withUnsupportedDMNVersion() {
+ ItemDefinition id = new TItemDefinition();
+ FunctionItem fi = new TFunctionItem();
+ QName type = new QName(TEST_NS, "date");
+ fi.setOutputTypeRef(type);
+ id.setFunctionItem(fi);
+ QName result = retrieveTypeRef(id, TEST_NS, DMNVersion.V1_2);
+ assertThat(result).isNull();
+ }
+
+ @Test
+ public void testFunctionItemTypeRefDependency() {
+ ItemDefinition functionReturningDateList = new TItemDefinition();
+ ItemDefinition dateList = new TItemDefinition();
+ FunctionItem functionItem = new TFunctionItem();
+ functionItem.setOutputTypeRef(new QName("dateList"));
+
+ functionReturningDateList.setName("functionReturningDateList");
+ functionReturningDateList.setFunctionItem(functionItem);
+
+ dateList.setName("dateList");
+ dateList.setTypeRef(new QName(TEST_NS, "date"));
+
+ ItemDefinitionDependenciesSorter sorter = new
ItemDefinitionDependenciesSorter(TEST_NS);
+ List<ItemDefinition> input = Arrays.asList(functionReturningDateList,
dateList);
+ List<ItemDefinition> sorted = sorter.sort(input, DMNVersion.V1_6);
+
+ assertThat(sorted).hasSize(2);
+
assertThat(sorted.indexOf(dateList)).isLessThan(sorted.indexOf(functionReturningDateList));
+ }
+
+}
\ No newline at end of file
diff --git
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/FEELDialect.java
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/FEELDialect.java
index 3ee454bf74..b152d1773b 100644
--- a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/FEELDialect.java
+++ b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/lang/FEELDialect.java
@@ -72,6 +72,7 @@ public enum FEELDialect {
toReturn.add(org.kie.dmn.model.v1_3.KieDMNModelInstrumentedBase.URI_FEEL);
toReturn.add(org.kie.dmn.model.v1_4.KieDMNModelInstrumentedBase.URI_FEEL);
toReturn.add(org.kie.dmn.model.v1_5.KieDMNModelInstrumentedBase.URI_FEEL);
+
toReturn.add(org.kie.dmn.model.v1_6.KieDMNModelInstrumentedBase.URI_FEEL);
return toReturn;
}
}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]