gitgabrio commented on code in PR #6535:
URL: 
https://github.com/apache/incubator-kie-drools/pull/6535#discussion_r2569369734


##########
kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/ItemDefinitionDependenciesSorter.java:
##########
@@ -37,66 +38,80 @@ public ItemDefinitionDependenciesSorter(String 
modelNamespace) {
     
     /**
      * 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());

Review Comment:
   👍 



##########
kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/ItemDefinitionDependenciesSorter.java:
##########
@@ -37,66 +38,80 @@ public ItemDefinitionDependenciesSorter(String 
modelNamespace) {
     
     /**
      * 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()), 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) {
+
+    static QName retrieveTypeRef(ItemDefinition o1, DMNVersion dmnVersion) {
         if ( o1.getTypeRef() != null ) {
-            return extFastEqUsingNSPrefix(o1, qname2);
+            return o1.getTypeRef();
         }
-        for ( ItemDefinition ic : o1.getItemComponent() ) {
-            if ( recurseFind(ic, qname2) ) {
-                return true;
+        if (dmnVersion != null && dmnVersion.getDmnVersion() > 
DMNVersion.V1_2.getDmnVersion()) {

Review Comment:
   Hi @AthiraHari77 : what about -> 
   
   ```java
   QName toReturn = o1.getTypeRef();
           if (toReturn == null 
             && dmnVersion.getDmnVersion() > DMNVersion.V1_2.getDmnVersion()
             && o1.getFunctionItem() != null) {
               toReturn = o1.getFunctionItem().getOutputTypeRef();
           }
           return toReturn;
   ```
   (we should avoid the `dmnVersion != null ` check because, it it is null, 
then there is a bug somewhere else, and we should be aware of that)
   ?



##########
kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/compiler/ItemDefinitionDependenciesTest.java:
##########
@@ -227,4 +230,53 @@ void circular3() {
         assertThat(orderedList.subList(0, 2)).contains(fhirAge, fhirExtension);
         assertThat(orderedList.subList(2, 3)).contains(fhirT1);
     }
+
+    @Test
+    void testTypeRefWhenPresent() {
+        QName expected = new QName("ns", "date");
+        ItemDefinition item = new TItemDefinition();
+        item.setTypeRef(expected);
+
+        QName result = retrieveTypeRef(item, DMNVersion.V1_2);
+        assertThat(expected).isEqualTo(result);
+    }
+
+    @Test
+    void testTypeRefNull() {
+        ItemDefinition item = new TItemDefinition();
+
+        QName result = retrieveTypeRef(item, DMNVersion.V1_2);
+        assertThat(result).isNull();
+    }
+
+    @Test
+    void testRetrieveTypeRef_dmnVersionNull() {
+        ItemDefinition item = new TItemDefinition();
+
+        QName result = retrieveTypeRef(item, null);

Review Comment:
   As in other comment, dmn version should never be `null`.
   If you saw that during debug, it means there is a bug somewhere (and an 
exception should be thrown)



##########
kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/ItemDefinitionDependenciesSorter.java:
##########
@@ -37,66 +38,80 @@ public ItemDefinitionDependenciesSorter(String 
modelNamespace) {
     
     /**
      * 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);

Review Comment:
   ❤️ 



##########
kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/ItemDefinitionDependenciesSorter.java:
##########
@@ -57,46 +58,55 @@ public List<ItemDefinition> sort(List<ItemDefinition> ins) {
     /**
      * 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 dfVisit(ItemDefinition node, List<ItemDefinition> allNodes, 
Collection<ItemDefinition> visited, List<ItemDefinition> dfv, 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()), 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);
+                dfVisit(n, allNodes, visited, dfv, dmnVersion);
             }
         }
 
         dfv.add(node);
     }
     
-    private static boolean recurseFind(ItemDefinition o1, QName qname2) {
+    private static boolean recurseFind(ItemDefinition o1, QName qname2, 
DMNVersion dmnVersion) {
         if ( o1.getTypeRef() != null ) {
-            return extFastEqUsingNSPrefix(o1, qname2);
+            return extFastEqUsingNSPrefix(o1, o1.getTypeRef(), qname2);
+        }
+        if (dmnVersion != null && dmnVersion.getDmnVersion() > 
DMNVersion.V1_2.getDmnVersion()) {
+            FunctionItem fi = o1.getFunctionItem();
+            if (fi != null && fi.getOutputTypeRef() != null) {
+                return extFastEqUsingNSPrefix(o1, 
o1.getFunctionItem().getOutputTypeRef(), qname2);

Review Comment:
   Could you please apply, @AthiraHari77  ?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to