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]

Reply via email to