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 fed30f8880 [Incubator-kie-issues#1356] DMN Elements with null IDs are 
not correctly managed (#6033)
fed30f8880 is described below

commit fed30f8880a261a2f3dd59d6a5c1c3d7dadf7c2f
Author: Gabriele Cardosi <[email protected]>
AuthorDate: Thu Aug 1 12:02:52 2024 +0200

    [Incubator-kie-issues#1356] DMN Elements with null IDs are not correctly 
managed (#6033)
    
    * [incubator-kie-issues#1356] Implemented TupleIdentifier as key for nods 
maps inside DMNModelImpl
    
    * [incubator-kie-issues#1356] Working with tests
    
    * [incubator-kie-issues#1356] Fix null management inside TupleIdentifier. 
Add  tests.
    
    * [incubator-kie-issues#1356] Add symmetrical equality tests for 
TupleIdentifier
    
    ---------
    
    Co-authored-by: Gabriele-Cardosi <[email protected]>
---
 .../java/org/kie/dmn/core/ast/DMNBaseNode.java     |  20 ++-
 .../java/org/kie/dmn/core/ast/ItemDefNodeImpl.java |   4 -
 .../org/kie/dmn/core/compiler/DMNCompilerImpl.java |   9 +-
 .../dmn/core/compiler/DMNTypeRegistryAbstract.java |  23 +--
 .../kie/dmn/core/compiler/DMNTypeRegistryV11.java  |   4 +-
 .../kie/dmn/core/compiler/DMNTypeRegistryV12.java  |   3 +-
 .../kie/dmn/core/compiler/DMNTypeRegistryV13.java  |   3 +-
 .../kie/dmn/core/compiler/DMNTypeRegistryV14.java  |   3 +-
 .../kie/dmn/core/compiler/DMNTypeRegistryV15.java  |   3 +-
 .../java/org/kie/dmn/core/impl/DMNModelImpl.java   | 123 +++++++--------
 .../org/kie/dmn/core/impl/TupleIdentifier.java     |  86 +++++++++++
 .../java/org/kie/dmn/core/DMNCompilerTest.java     |  58 ++++++-
 .../test/java/org/kie/dmn/core/DMNRuntimeTest.java |  15 +-
 .../org/kie/dmn/core/impl/DMNModelImplTest.java    | 171 +++++++++++++++++++++
 .../org/kie/dmn/core/impl/TupleIdentifierTest.java | 101 ++++++++++++
 .../kie/dmn/core/0089-nested-inputdata-imports.dmn |  38 +++++
 .../test/resources/org/kie/dmn/core/Model_B.dmn    |  31 ++++
 .../test/resources/org/kie/dmn/core/Model_B2.dmn   |  31 ++++
 .../resources/org/kie/dmn/core/Say_hello_1ID1D.dmn |  30 ++++
 .../legacy/tests/core/v1_1/DMNCompilerTest.java    |   2 +-
 .../dmn/legacy/tests/core/v1_1/DMNRuntimeTest.java |  15 +-
 .../java/org/kie/dmn/model/api/DMNElement.java     |   2 +-
 22 files changed, 667 insertions(+), 108 deletions(-)

diff --git 
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/DMNBaseNode.java 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/DMNBaseNode.java
index 3ceb7742de..0ca078e34c 100644
--- a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/DMNBaseNode.java
+++ b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/DMNBaseNode.java
@@ -7,7 +7,7 @@
  * "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
+ * 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
@@ -24,6 +24,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.UUID;
 
 import javax.xml.namespace.QName;
 
@@ -45,17 +46,21 @@ public abstract class DMNBaseNode implements DMNNode {
 
     private Map<String, QName> importAliases = new HashMap<>();
 
+    private final String id;
+
     public DMNBaseNode() {
+        id = UUID.randomUUID().toString();
     }
 
     public DMNBaseNode(NamedElement source) {
         this.source = source;
+        id = source != null && source.getId() != null ? source.getId() : 
UUID.randomUUID().toString();
     }
 
     public abstract DMNType getType();
 
     public String getId() {
-        return source != null ? source.getId() : null;
+        return id;
     }
 
     public String getName() {
@@ -88,7 +93,7 @@ public abstract class DMNBaseNode implements DMNNode {
 
     public String getIdentifierString() {
         String identifier = "[unnamed]";
-        if( source != null ) {
+        if (source != null) {
             identifier = source.getName() != null ? source.getName() : 
source.getId();
         }
         return identifier;
@@ -107,11 +112,11 @@ public abstract class DMNBaseNode implements DMNNode {
     }
 
     public void addDependency(String name, DMNNode dependency) {
-        this.dependencies.put( name, dependency );
+        this.dependencies.put(name, dependency);
     }
 
     public List<InformationRequirement> getInformationRequirement() {
-        if ( source instanceof Decision ) {
+        if (source instanceof Decision) {
             return ((Decision) source).getInformationRequirement();
         } else {
             return Collections.emptyList();
@@ -119,9 +124,9 @@ public abstract class DMNBaseNode implements DMNNode {
     }
 
     public List<KnowledgeRequirement> getKnowledgeRequirement() {
-        if ( source instanceof Decision ) {
+        if (source instanceof Decision) {
             return ((Decision) source).getKnowledgeRequirement();
-        } else if( source instanceof BusinessKnowledgeModel ) {
+        } else if (source instanceof BusinessKnowledgeModel) {
             return ((BusinessKnowledgeModel) source).getKnowledgeRequirement();
         } else {
             return Collections.emptyList();
@@ -148,5 +153,4 @@ public abstract class DMNBaseNode implements DMNNode {
         builder.append("]");
         return builder.toString();
     }
-
 }
diff --git 
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/ItemDefNodeImpl.java 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/ItemDefNodeImpl.java
index 05fcddb2d1..ddbaa2b90a 100644
--- 
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/ItemDefNodeImpl.java
+++ 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/ast/ItemDefNodeImpl.java
@@ -47,10 +47,6 @@ public class ItemDefNodeImpl
         this.itemDef = itemDef;
     }
 
-    public String getId() {
-        return itemDef.getId();
-    }
-
     public String getName() {
         return itemDef.getName();
     }
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 8cc1eb40c2..823084f4b6 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
@@ -384,7 +384,7 @@ public class DMNCompilerImpl implements DMNCompiler {
                                       Msg.DUPLICATED_ITEM_DEFINITION,
                                       id.getName());
             }
-            if (id.getItemComponent() != null && id.getItemComponent().size() 
> 0) {
+            if (id.getItemComponent() != null && 
!id.getItemComponent().isEmpty()) {
                 DMNCompilerHelper.checkVariableName(model, id, id.getName());
                 CompositeTypeImpl compType = new 
CompositeTypeImpl(model.getNamespace(), id.getName(), id.getId(), 
id.isIsCollection());
                 DMNType preregistered = 
model.getTypeRegistry().registerType(compType);
@@ -402,6 +402,9 @@ public class DMNCompilerImpl implements DMNCompiler {
     private void processDrgElements(DMNCompilerContext ctx, DMNModelImpl 
model, Definitions dmndefs) {
         for ( DRGElement e : dmndefs.getDrgElement() ) {
             boolean foundIt = false;
+            if (e.getId() == null) {
+                e.setId(UUID.randomUUID().toString());
+            }
             for( DRGElementCompiler dc : drgCompilers ) {
                 if ( dc.accept( e ) ) {
                     foundIt = true;
@@ -436,10 +439,8 @@ public class DMNCompilerImpl implements DMNCompiler {
                         ds.setVariable(variable);
                     }
                     // continuing with normal compilation of Decision Service:
-                    boolean foundIt = false;
                     for (DRGElementCompiler dc : drgCompilers) {
                         if (dc.accept(ds)) {
-                            foundIt = true;
                             dc.compileNode(ds, this, model);
                         }
                     }
@@ -487,7 +488,7 @@ public class DMNCompilerImpl implements DMNCompiler {
     }
     
     @FunctionalInterface
-    public static interface AfterProcessDrgElements {
+    public interface AfterProcessDrgElements {
         void callback(DMNCompilerImpl compiler, DMNCompilerContext ctx, 
DMNModelImpl model);
     }
     
diff --git 
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryAbstract.java
 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryAbstract.java
index a902e7b0b1..5aac998a9c 100644
--- 
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryAbstract.java
+++ 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryAbstract.java
@@ -30,6 +30,7 @@ import org.kie.dmn.api.core.DMNType;
 import org.kie.dmn.core.impl.BaseDMNTypeImpl;
 import org.kie.dmn.core.impl.CompositeTypeImpl;
 import org.kie.dmn.core.impl.SimpleTypeImpl;
+import org.kie.dmn.core.impl.TupleIdentifier;
 import org.kie.dmn.feel.lang.Scope;
 import org.kie.dmn.feel.lang.Type;
 import org.kie.dmn.feel.lang.types.BuiltInType;
@@ -41,12 +42,12 @@ import org.kie.dmn.feel.lang.types.WrappingScopeImpl;
 public abstract class DMNTypeRegistryAbstract implements DMNTypeRegistry, 
FEELTypeRegistry {
 
     protected Map<String, Map<String, DMNType>> types = new HashMap<>();
-    protected Map<String, QName> aliases;
+    protected Map<TupleIdentifier, QName> aliases;
     protected ScopeImpl feelTypesScope = new ScopeImpl(); // no parent scope, 
intentional.
-    protected Map<String, ScopeImpl> feelTypesScopeChildLU = new HashMap<>();
+    protected Map<TupleIdentifier, ScopeImpl> feelTypesScopeChildLU = new 
HashMap<>();
 
 
-    public DMNTypeRegistryAbstract(Map<String, QName> aliases) {
+    public DMNTypeRegistryAbstract(Map<TupleIdentifier, QName> aliases) {
         this.aliases = aliases;
         String feelNamespace = feelNS();
         Map<String, DMNType> feelTypes = new HashMap<>(  );
@@ -85,10 +86,10 @@ public abstract class DMNTypeRegistryAbstract implements 
DMNTypeRegistry, FEELTy
     public Type resolveFEELType(List<String> qns) {
         if (qns.size() == 1) {
             return feelTypesScope.resolve(qns.get(0)).getType();
-        } else if (qns.size() == 2 && 
feelTypesScopeChildLU.containsKey(qns.get(0))) {
-            return 
feelTypesScopeChildLU.get(qns.get(0)).resolve(qns.get(1)).getType();
+        } else if (qns.size() == 2 && feelTypesScopeChildLU.containsKey(new 
TupleIdentifier(null, qns.get(0)))) {
+            return feelTypesScopeChildLU.get(new TupleIdentifier(null, 
qns.get(0))).resolve(qns.get(1)).getType();
         } else {
-            throw new IllegalStateException("Inconsistent state when resolving 
for qns: " + qns.toString());
+            throw new IllegalStateException("Inconsistent state when resolving 
for qns: " + qns);
         }
     }
 
@@ -98,21 +99,21 @@ public abstract class DMNTypeRegistryAbstract implements 
DMNTypeRegistry, FEELTy
     }
 
     protected void registerAsFEELType(DMNType dmnType) {
-        Optional<String> optAliasKey = keyfromNS(dmnType.getNamespace());
+        Optional<TupleIdentifier> optAliasKey = 
keyfromNS(dmnType.getNamespace());
         Type feelType = ((BaseDMNTypeImpl) dmnType).getFeelType();
         if (optAliasKey.isEmpty()) {
             feelTypesScope.define(new TypeSymbol(dmnType.getName(), feelType));
         } else {
-            String aliasKey = optAliasKey.get();
+            TupleIdentifier aliasKey = optAliasKey.get();
             feelTypesScopeChildLU.computeIfAbsent(aliasKey, k -> {
-                ScopeImpl importScope = new ScopeImpl(k, feelTypesScope);
-                feelTypesScope.define(new TypeSymbol(k, null));
+                ScopeImpl importScope = new ScopeImpl(k.getName(), 
feelTypesScope);
+                feelTypesScope.define(new TypeSymbol(k.getName(), null));
                 return importScope;
             }).define(new TypeSymbol(dmnType.getName(), feelType));
         }
     }
 
-    private Optional<String> keyfromNS(String ns) {
+    private Optional<TupleIdentifier> keyfromNS(String ns) {
         return aliases == null ? Optional.empty() : 
aliases.entrySet().stream().filter(kv -> 
kv.getValue().getNamespaceURI().equals(ns)).map(kv -> kv.getKey()).findFirst();
     }
 
diff --git 
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV11.java
 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV11.java
index cee46ab767..e8bd031899 100644
--- 
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV11.java
+++ 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV11.java
@@ -24,12 +24,12 @@ import javax.xml.namespace.QName;
 
 import org.kie.dmn.api.core.DMNType;
 import org.kie.dmn.core.impl.SimpleTypeImpl;
-import org.kie.dmn.feel.lang.types.BuiltInType;
+import org.kie.dmn.core.impl.TupleIdentifier;
 import org.kie.dmn.model.v1_1.KieDMNModelInstrumentedBase;
 
 public class DMNTypeRegistryV11 extends DMNTypeRegistryAbstract {
 
-    public DMNTypeRegistryV11(Map<String, QName> aliases) {
+    public DMNTypeRegistryV11(Map<TupleIdentifier, QName> aliases) {
         super(aliases);
     }
 
diff --git 
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV12.java
 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV12.java
index f146d2e1a2..ade5a60fc3 100644
--- 
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV12.java
+++ 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV12.java
@@ -27,6 +27,7 @@ import javax.xml.namespace.QName;
 
 import org.kie.dmn.api.core.DMNType;
 import org.kie.dmn.core.impl.SimpleTypeImpl;
+import org.kie.dmn.core.impl.TupleIdentifier;
 import org.kie.dmn.feel.lang.types.BuiltInType;
 import org.kie.dmn.model.v1_2.KieDMNModelInstrumentedBase;
 
@@ -38,7 +39,7 @@ public class DMNTypeRegistryV12 extends 
DMNTypeRegistryAbstract {
         super(Collections.emptyMap());
     }
 
-    public DMNTypeRegistryV12(Map<String, QName> aliases) {
+    public DMNTypeRegistryV12(Map<TupleIdentifier, QName> aliases) {
         super(aliases);
     }
 
diff --git 
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV13.java
 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV13.java
index 45c0ed87f8..4cf902bf1f 100644
--- 
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV13.java
+++ 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV13.java
@@ -24,13 +24,14 @@ import javax.xml.namespace.QName;
 
 import org.kie.dmn.api.core.DMNType;
 import org.kie.dmn.core.impl.SimpleTypeImpl;
+import org.kie.dmn.core.impl.TupleIdentifier;
 import org.kie.dmn.model.v1_3.KieDMNModelInstrumentedBase;
 
 public class DMNTypeRegistryV13 extends DMNTypeRegistryAbstract {
 
     private static final DMNType UNKNOWN = 
SimpleTypeImpl.UNKNOWN_DMNTYPE(KieDMNModelInstrumentedBase.URI_FEEL);
 
-    public DMNTypeRegistryV13(Map<String, QName> aliases) {
+    public DMNTypeRegistryV13(Map<TupleIdentifier, QName> aliases) {
         super(aliases);
     }
 
diff --git 
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV14.java
 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV14.java
index a39b5aeb42..2c7d99d719 100644
--- 
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV14.java
+++ 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV14.java
@@ -24,13 +24,14 @@ import javax.xml.namespace.QName;
 
 import org.kie.dmn.api.core.DMNType;
 import org.kie.dmn.core.impl.SimpleTypeImpl;
+import org.kie.dmn.core.impl.TupleIdentifier;
 import org.kie.dmn.model.v1_4.KieDMNModelInstrumentedBase;
 
 public class DMNTypeRegistryV14 extends DMNTypeRegistryAbstract {
 
     private static final DMNType UNKNOWN = 
SimpleTypeImpl.UNKNOWN_DMNTYPE(KieDMNModelInstrumentedBase.URI_FEEL);
 
-    public DMNTypeRegistryV14(Map<String, QName> aliases) {
+    public DMNTypeRegistryV14(Map<TupleIdentifier, QName> aliases) {
         super(aliases);
     }
 
diff --git 
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV15.java
 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV15.java
index 332fe992b9..359edde31b 100644
--- 
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV15.java
+++ 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/compiler/DMNTypeRegistryV15.java
@@ -20,6 +20,7 @@ package org.kie.dmn.core.compiler;
 
 import org.kie.dmn.api.core.DMNType;
 import org.kie.dmn.core.impl.SimpleTypeImpl;
+import org.kie.dmn.core.impl.TupleIdentifier;
 import org.kie.dmn.model.v1_5.KieDMNModelInstrumentedBase;
 
 import javax.xml.namespace.QName;
@@ -30,7 +31,7 @@ public class DMNTypeRegistryV15 extends 
DMNTypeRegistryAbstract {
     private static final DMNType UNKNOWN = 
SimpleTypeImpl.UNKNOWN_DMNTYPE(KieDMNModelInstrumentedBase.URI_FEEL);
 
 
-    public DMNTypeRegistryV15(Map<String, QName> aliases) {
+    public DMNTypeRegistryV15(Map<TupleIdentifier, QName> aliases) {
         super(aliases);
     }
 
diff --git 
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/DMNModelImpl.java 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/DMNModelImpl.java
index d100cbbc85..6cd1b3a4b6 100644
--- a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/DMNModelImpl.java
+++ b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/DMNModelImpl.java
@@ -72,36 +72,39 @@ import org.kie.dmn.model.api.DMNModelInstrumentedBase;
 import org.kie.dmn.model.api.Definitions;
 
 import static org.kie.dmn.core.compiler.UnnamedImportUtils.isInUnnamedImport;
+import static org.kie.dmn.core.impl.TupleIdentifier.createTupleIdentifier;
+import static org.kie.dmn.core.impl.TupleIdentifier.createTupleIdentifierById;
+import static 
org.kie.dmn.core.impl.TupleIdentifier.createTupleIdentifierByName;
 
 public class DMNModelImpl
         implements DMNModel, DMNMessageManager, Externalizable {
     
-    private static enum SerializationFormat {
+    private enum SerializationFormat {
         // To ensure backward compatibility, append only:
         DMN_XML
     }
-    
 
     private SerializationFormat serializedAs = SerializationFormat.DMN_XML;
     private Resource resource;
     private Definitions definitions;
     
-    private Map<String, InputDataNode>              inputs       = new 
LinkedHashMap<>();
-    private Map<String, DecisionNode>               decisions    = new 
LinkedHashMap<>();
-    private Map<String, BusinessKnowledgeModelNode> bkms         = new 
LinkedHashMap<>();
-    private Map<String, ItemDefNode>                itemDefs     = new 
LinkedHashMap<>();
-    private Map<String, DecisionServiceNode> decisionServices    = new 
LinkedHashMap<>();
+    private Map<TupleIdentifier, InputDataNode>              inputs       = 
new LinkedHashMap<>();
+    private Map<TupleIdentifier, DecisionNode>               decisions    = 
new LinkedHashMap<>();
+    private Map<TupleIdentifier, BusinessKnowledgeModelNode> bkms         = 
new LinkedHashMap<>();
+    private Map<TupleIdentifier, ItemDefNode>                itemDefs     = 
new LinkedHashMap<>();
+    private Map<TupleIdentifier, DecisionServiceNode> decisionServices    = 
new LinkedHashMap<>();
+    private Map<TupleIdentifier, DMNImportPMMLInfo> pmmlImportInfo = new 
HashMap<>();
+    private Map<TupleIdentifier, QName> importAliases = new HashMap<>();
 
     // these are messages created at loading/compilation time
     private DMNMessageManager messages;
 
     private DMNTypeRegistry types;
     /**
-     * a compile-time preference to indicate if type-check should be performed 
during runtime evaluation. 
+     * a compile-time preference to indicate if type-check should be performed 
during runtime evaluation.
      */
     private boolean runtimeTypeCheck = false;
 
-    private Map<String, QName> importAliases = new HashMap<>();
     private ImportChain importChain;
 
     public DMNModelImpl() {
@@ -173,12 +176,12 @@ public class DMNModelImpl
     }
 
     public void addInput(InputDataNode idn) {
-        computeDRGElementModelLocalId(idn).forEach(id -> inputs.put(id, idn));
+        computeDRGElementModelLocalId(idn).forEach(id -> 
inputs.put(createTupleIdentifier(id, nameInCurrentModel(idn)), idn));
     }
 
     @Override
     public InputDataNode getInputById(String id) {
-        return this.inputs.get( id );
+        return this.inputs.get( new TupleIdentifier(id, null) );
     }
 
     @Override
@@ -186,12 +189,7 @@ public class DMNModelImpl
         if ( name == null ) {
             return null;
         }
-        for ( InputDataNode in : this.inputs.values() ) {
-            if (Objects.equals(name, nameInCurrentModel(in))) {
-                return in;
-            }
-        }
-        return null;
+        return inputs.get(new TupleIdentifier(null, name));
     }
 
     @Override
@@ -200,7 +198,7 @@ public class DMNModelImpl
     }
 
     public void addDecision(DecisionNode dn) {
-        computeDRGElementModelLocalId(dn).forEach(id -> decisions.put(id, dn));
+        computeDRGElementModelLocalId(dn).forEach(id -> 
decisions.put(createTupleIdentifier(id, nameInCurrentModel(dn)), dn));
     }
 
     private List<String> computeDRGElementModelLocalId(DMNNode node) {
@@ -220,7 +218,7 @@ public class DMNModelImpl
 
     @Override
     public DecisionNode getDecisionById(String id) {
-        return this.decisions.get(id);
+        return id != null ? this.decisions.get(new TupleIdentifier(id, null)) 
: null;
     }
 
     @Override
@@ -228,12 +226,7 @@ public class DMNModelImpl
         if ( name == null ) {
             return null;
         }
-        for ( DecisionNode dn : this.decisions.values() ) {
-            if (Objects.equals(name, nameInCurrentModel(dn))) {
-                return dn;
-            }
-        }
-        return null;
+        return decisions.get(new TupleIdentifier(null, name));
     }
 
     @Override
@@ -262,23 +255,18 @@ public class DMNModelImpl
     }
 
     public void addDecisionService(DecisionServiceNode dsn) {
-        computeDRGElementModelLocalId(dsn).forEach(id -> 
decisionServices.put(id, dsn));
+        computeDRGElementModelLocalId(dsn).forEach(id -> 
decisionServices.put(createTupleIdentifier(id, dsn.getName()), dsn));
     }
 
     public DecisionServiceNode getDecisionServiceById(String id) {
-        return this.decisionServices.get(id);
+        return this.decisionServices.get(new TupleIdentifier(id, null));
     }
 
     public DecisionServiceNode getDecisionServiceByName(String name) {
         if (name == null) {
             return null;
         }
-        for (DecisionServiceNode dn : this.decisionServices.values()) {
-            if (Objects.equals(name, dn.getName())) {
-                return dn;
-            }
-        }
-        return null;
+        return decisionServices.get(new TupleIdentifier(null, name));
     }
 
     @Override
@@ -287,12 +275,12 @@ public class DMNModelImpl
     }
 
     public void addBusinessKnowledgeModel(BusinessKnowledgeModelNode bkm) {
-        computeDRGElementModelLocalId(bkm).forEach(id -> bkms.put(id, bkm));
+        computeDRGElementModelLocalId(bkm).forEach(id -> 
bkms.put(createTupleIdentifier(id, bkm.getName()), bkm));
     }
 
     @Override
     public BusinessKnowledgeModelNode getBusinessKnowledgeModelById(String id) 
{
-        return this.bkms.get( id );
+        return this.bkms.get( new TupleIdentifier(id, null) );
     }
 
     @Override
@@ -300,17 +288,12 @@ public class DMNModelImpl
         if ( name == null ) {
             return null;
         }
-        for ( BusinessKnowledgeModelNode bkm : this.bkms.values() ) {
-            if (Objects.equals(name, bkm.getName())) {
-                return bkm;
-            }
-        }
-        return null;
+        return bkms.get(new TupleIdentifier(null, name));
     }
 
     @Override
     public Set<BusinessKnowledgeModelNode> getBusinessKnowledgeModels() {
-        return 
this.bkms.values().stream().collect(Collectors.toCollection(LinkedHashSet::new));
+        return new LinkedHashSet<>(this.bkms.values());
     }
 
     private void collectRequiredInputs(Collection<DMNNode> deps, 
Set<InputDataNode> inputs) {
@@ -327,12 +310,13 @@ public class DMNModelImpl
 
     public void addItemDefinition(ItemDefNode idn) {
         // if ID is null, generate an ID for it
-        this.itemDefs.put( idn.getId() != null ? idn.getId() : 
"_"+this.itemDefs.size(), idn );
+        String id = idn.getId() != null ? idn.getId() : "_" + 
this.itemDefs.size();
+        this.itemDefs.put( createTupleIdentifier(id, idn.getName()), idn );
     }
 
     @Override
     public ItemDefNode getItemDefinitionById(String id) {
-        return this.itemDefs.get( id );
+        return this.itemDefs.get( new TupleIdentifier(id, null) );
     }
 
     @Override
@@ -340,17 +324,12 @@ public class DMNModelImpl
         if ( name == null ) {
             return null;
         }
-        for ( ItemDefNode in : this.itemDefs.values() ) {
-            if (Objects.equals(name, in.getName())) {
-                return in;
-            }
-        }
-        return null;
+        return itemDefs.get(new TupleIdentifier(null, name));
     }
 
     @Override
     public Set<ItemDefNode> getItemDefinitions() {
-        return this.itemDefs.values().stream().collect( 
Collectors.toCollection(LinkedHashSet::new) );
+        return new LinkedHashSet<>(this.itemDefs.values());
     }
 
     @Override
@@ -477,21 +456,23 @@ public class DMNModelImpl
 
     public void setImportAliasForNS(String iAlias, String iNS, String 
iModelName) {
         if (getImportAliasFor(iNS, iModelName).isEmpty()) {
-            this.importAliases.put(iAlias, new QName(iNS, iModelName));
+            this.importAliases.put(createTupleIdentifierByName(iAlias), new 
QName(iNS, iModelName));
         }
     }
 
     public Map<String, QName> getImportAliasesForNS() {
-        return Collections.unmodifiableMap(this.importAliases);
+        return importAliases.entrySet()
+                .stream().collect(Collectors.toMap(tupleIdentifierQNameEntry 
-> tupleIdentifierQNameEntry.getKey().getName(),
+                                                   Entry::getValue));
     }
 
     public Optional<String> getImportAliasFor(String ns, String iModelName) {
         QName lookup = new QName(ns, iModelName);
-        return this.importAliases.entrySet().stream().filter(kv -> 
kv.getValue().equals(lookup)).map(kv -> kv.getKey()).findFirst();
+        return this.importAliases.entrySet().stream().filter(kv -> 
kv.getValue().equals(lookup)).map(kv -> kv.getKey().getName()).findFirst();
     }
 
     public QName getImportNamespaceAndNameforAlias(String iAlias) {
-        return this.importAliases.get(iAlias);
+        return this.importAliases.get(createTupleIdentifierByName(iAlias));
     }
 
     public void addImportChainChild(ImportChain child, String alias) {
@@ -510,6 +491,23 @@ public class DMNModelImpl
         return this.importChain.getImportChainDirectChildModels();
     }
 
+
+    @Override
+    public void addAllUnfiltered(List<? extends DMNMessage> messages) {
+        this.messages.addAllUnfiltered( messages );
+    }
+
+    public void addPMMLImportInfo(DMNImportPMMLInfo info) {
+        
this.pmmlImportInfo.put(createTupleIdentifierByName(info.getImportName()), 
info);
+    }
+
+    public Map<String, DMNImportPMMLInfo> getPmmlImportInfo() {
+        return pmmlImportInfo.entrySet()
+                .stream().collect(Collectors.toMap(tupleIdentifierQNameEntry 
-> tupleIdentifierQNameEntry.getKey().getName(),
+                                                   Entry::getValue));
+
+    }
+
     private static class ImportChain {
         private final String alias;
         private final DMNModel node;
@@ -565,19 +563,4 @@ public class DMNModelImpl
         }
     }
 
-    @Override
-    public void addAllUnfiltered(List<? extends DMNMessage> messages) {
-        this.messages.addAllUnfiltered( messages );
-    }
-
-    private Map<String, DMNImportPMMLInfo> pmmlImportInfo = new HashMap<>();
-
-    public void addPMMLImportInfo(DMNImportPMMLInfo info) {
-        this.pmmlImportInfo.put(info.getImportName(), info);
-    }
-
-    public Map<String, DMNImportPMMLInfo> getPmmlImportInfo() {
-        return Collections.unmodifiableMap(pmmlImportInfo);
-    }
-
 }
diff --git 
a/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/TupleIdentifier.java 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/TupleIdentifier.java
new file mode 100644
index 0000000000..16b3758d79
--- /dev/null
+++ 
b/kie-dmn/kie-dmn-core/src/main/java/org/kie/dmn/core/impl/TupleIdentifier.java
@@ -0,0 +1,86 @@
+/**
+ * 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.core.impl;
+
+import java.util.Objects;
+
+public class TupleIdentifier {
+
+    private final String id;
+    private final String name;
+
+    static final String AUTO_GENERATED_ID_PREFIX = "auto-generated-id";
+    static final String AUTO_GENERATED_NAME_PREFIX = "auto-generated-name";
+
+    static TupleIdentifier createTupleIdentifier(String id, String name) {
+        return new TupleIdentifier(id, name);
+    }
+
+    static TupleIdentifier createTupleIdentifierById(String id) {
+        return new TupleIdentifier(id, generateNameFromId(id));
+    }
+
+    static TupleIdentifier createTupleIdentifierByName(String name) {
+        return new TupleIdentifier(generateIdFromName(name), name);
+    }
+
+    static String generateIdFromName(String name) {
+        return String.format("%s-%s", AUTO_GENERATED_ID_PREFIX, 
Objects.hash(name));
+    }
+
+    static String generateNameFromId(String id) {
+        return String.format("%s-%s", AUTO_GENERATED_NAME_PREFIX, 
Objects.hash(id));
+    }
+
+    public TupleIdentifier(String id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof TupleIdentifier that)) {
+            return false;
+        }
+        // This "null" availability it is to allow for search based only on id 
or name
+        if (id == null || that.id == null) {
+            return Objects.equals(name, that.name);
+        } else if (name == null || that.name == null) {
+            return Objects.equals(id, that.id);
+        } else {
+            return Objects.equals(id, that.id) && Objects.equals(name, 
that.name);
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(1); // we have to consider "null" comparisons, so 
everything should go in same "bucket"
+    }
+}
\ No newline at end of file
diff --git 
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNCompilerTest.java 
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNCompilerTest.java
index fcaadef883..8b3776593e 100644
--- a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNCompilerTest.java
+++ b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNCompilerTest.java
@@ -20,10 +20,12 @@ package org.kie.dmn.core;
 
 import java.util.Arrays;
 import java.util.Map;
+import java.util.function.Consumer;
 
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
 import org.kie.dmn.api.core.DMNContext;
+import org.kie.dmn.api.core.DMNDecisionResult;
 import org.kie.dmn.api.core.DMNMessage;
 import org.kie.dmn.api.core.DMNModel;
 import org.kie.dmn.api.core.DMNResult;
@@ -37,6 +39,7 @@ import org.kie.dmn.core.impl.BaseDMNTypeImpl;
 import org.kie.dmn.core.impl.CompositeTypeImpl;
 import org.kie.dmn.core.impl.DMNContextFPAImpl;
 import org.kie.dmn.core.impl.DMNModelImpl;
+import org.kie.dmn.core.impl.DMNResultImpl;
 import org.kie.dmn.core.impl.SimpleTypeImpl;
 import org.kie.dmn.core.util.DMNRuntimeUtil;
 import org.kie.dmn.feel.lang.EvaluationContext;
@@ -47,6 +50,8 @@ import org.slf4j.LoggerFactory;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.fail;
+import static org.assertj.core.api.InstanceOfAssertFactories.map;
+import static 
org.kie.dmn.api.core.DMNDecisionResult.DecisionEvaluationStatus.SUCCEEDED;
 import static org.kie.dmn.core.util.DynamicTypeUtils.entry;
 import static org.kie.dmn.core.util.DynamicTypeUtils.mapOf;
 import static org.kie.dmn.core.util.DynamicTypeUtils.prototype;
@@ -164,7 +169,7 @@ public class DMNCompilerTest extends BaseVariantTest {
         final ItemDefNode itemDef = 
dmnModel.getItemDefinitionByName("tEmploymentStatus" );
 
         assertThat(itemDef.getName()).isEqualTo("tEmploymentStatus");
-        assertThat(itemDef.getId()).isNull();
+        assertThat(itemDef.getId()).isNotNull();
 
         final DMNType type = itemDef.getType();
 
@@ -286,6 +291,57 @@ public class DMNCompilerTest extends BaseVariantTest {
         }
     }
 
+    @ParameterizedTest
+    @MethodSource("params")
+    void testNestedImports(VariantTestConf conf) {
+        testConfig = conf;
+        final DMNRuntime runtime = 
createRuntimeWithAdditionalResources("0089-nested-inputdata-imports.dmn",
+                                                                        
this.getClass(),
+                                                                        
"Model_B.dmn",
+                                                                        
"Model_B2.dmn",
+                                                                        
"Say_hello_1ID1D.dmn");
+
+        final DMNModel importedModelB = 
runtime.getModel("http://www.trisotech.com/definitions/_2a1d771a-a899-4fef-abd6-fc894332337c";,
+                                                        "Model B");
+        assertThat(importedModelB).isNotNull();
+        for (final DMNMessage message : importedModelB.getMessages()) {
+            LOG.debug("{}", message);
+        }
+
+        final DMNModel importedModelB2 = 
runtime.getModel("http://www.trisotech.com/definitions/_9d46ece4-a96c-4cb0-abc0-0ca121ac3768";,
+                                                         "Model B2");
+        assertThat(importedModelB2).isNotNull();
+        for (final DMNMessage message : importedModelB2.getMessages()) {
+            LOG.debug("{}", message);
+        }
+
+        final DMNModel importedModelA= 
runtime.getModel("http://www.trisotech.com/definitions/_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9";,
+                                                         "Say hello 1ID1D");
+        assertThat(importedModelA).isNotNull();
+        for (final DMNMessage message : importedModelA.getMessages()) {
+            LOG.debug("{}", message);
+        }
+
+        final DMNModel modelC = 
runtime.getModel("http://www.trisotech.com/definitions/_10435dcd-8774-4575-a338-49dd554a0928";,
+                                                   "Model C");
+        assertThat(modelC).isNotNull();
+        for (final DMNMessage message : modelC.getMessages()) {
+            LOG.debug("{}", message);
+        }
+
+        final DMNContext context = runtime.newContext();
+        context.set("Model B", mapOf(entry("modelA", mapOf(entry("Person 
name", "B.A.John")))));
+        context.set("Model B2", mapOf(entry("modelA", mapOf(entry("Person 
name", "B2.A.John2")))));
+
+        final DMNResult evaluateModelCDecision = 
runtime.evaluateByName(modelC, context, "Model C Decision based on Bs");
+        for (final DMNMessage message : evaluateModelCDecision.getMessages()) {
+            LOG.debug("{}", message);
+        }
+        LOG.debug("{}", evaluateModelCDecision);
+        
assertThat(evaluateModelCDecision.getDecisionResults()).size().isEqualTo(3);
+        evaluateModelCDecision.getDecisionResults().forEach(dmnDecisionResult 
-> assertThat(dmnDecisionResult.getEvaluationStatus()).isEqualTo(SUCCEEDED));
+    }
+
     @ParameterizedTest
     @MethodSource("params")
     void emptyNamedModelImportWithHrefNamespace(VariantTestConf conf) {
diff --git 
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNRuntimeTest.java 
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNRuntimeTest.java
index 5489113177..5ade865fb2 100644
--- a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNRuntimeTest.java
+++ b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/DMNRuntimeTest.java
@@ -63,9 +63,12 @@ import 
org.kie.dmn.api.core.event.BeforeEvaluateDecisionEvent;
 import org.kie.dmn.api.core.event.BeforeEvaluateDecisionTableEvent;
 import org.kie.dmn.api.core.event.DMNRuntimeEventListener;
 import org.kie.dmn.core.api.DMNFactory;
+import org.kie.dmn.core.api.EvaluatorResult;
 import org.kie.dmn.core.ast.DMNContextEvaluator;
 import org.kie.dmn.core.ast.DecisionNodeImpl;
+import org.kie.dmn.core.ast.EvaluatorResultImpl;
 import org.kie.dmn.core.impl.DMNModelImpl;
+import org.kie.dmn.core.impl.SimpleTypeImpl;
 import org.kie.dmn.core.model.Person;
 import org.kie.dmn.core.util.DMNRuntimeUtil;
 import org.kie.dmn.core.util.KieHelper;
@@ -76,9 +79,11 @@ import org.kie.dmn.feel.marshaller.FEELStringMarshaller;
 import org.kie.dmn.feel.util.NumberEvalHelper;
 import org.kie.dmn.model.api.Decision;
 import org.kie.dmn.model.api.Definitions;
+import org.kie.dmn.model.api.InformationItem;
 import org.kie.dmn.model.api.ItemDefinition;
 import org.kie.dmn.model.v1_1.TDecision;
 import org.kie.dmn.model.v1_1.TDefinitions;
+import org.kie.dmn.model.v1_1.TInformationItem;
 import org.mockito.ArgumentCaptor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -1724,6 +1729,9 @@ public class DMNRuntimeTest extends 
BaseInterpretedVsCompiledTest {
         for (final String d : decisions) {
             final Decision dec = new TDecision();
             dec.setName(d);
+            InformationItem variable = new TInformationItem();
+            variable.setName("variable-" + d);
+            dec.setVariable(variable);
             def.getDrgElement().add(dec);
             def.addChildren(dec);
             dec.setParent(def);
@@ -1732,7 +1740,12 @@ public class DMNRuntimeTest extends 
BaseInterpretedVsCompiledTest {
     }
 
     private DecisionNodeImpl buildSimplifiedDecisionNode(final Definitions 
def, final String name) {
-        return new DecisionNodeImpl(def.getDrgElement().stream().filter(drg -> 
drg.getName().equals(name)).filter(Decision.class::isInstance).map(Decision.class::cast).findFirst().get());
+        DecisionNodeImpl toReturn = new 
DecisionNodeImpl(def.getDrgElement().stream().filter(drg -> 
drg.getName().equals(name)).filter(Decision.class::isInstance)
+                                                                 
.map(Decision.class::cast)
+                                                                 
.findFirst().get());
+        toReturn.setEvaluator((eventManager, result) -> new 
EvaluatorResultImpl(name, EvaluatorResult.ResultType.SUCCESS));
+        toReturn.setResultType(SimpleTypeImpl.UNKNOWN_DMNTYPE(""));
+        return toReturn;
     }
 
     @ParameterizedTest
diff --git 
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/impl/DMNModelImplTest.java
 
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/impl/DMNModelImplTest.java
new file mode 100644
index 0000000000..7663612df4
--- /dev/null
+++ 
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/impl/DMNModelImplTest.java
@@ -0,0 +1,171 @@
+/**
+ * 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.core.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.IntStream;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.kie.dmn.api.core.ast.DecisionNode;
+import org.kie.dmn.core.ast.DecisionNodeImpl;
+import org.kie.dmn.model.api.Decision;
+import org.kie.dmn.model.api.Definitions;
+import org.kie.dmn.model.v1_5.TDecision;
+import org.kie.dmn.model.v1_5.TDefinitions;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class DMNModelImplTest {
+
+    private DMNModelImpl model;
+    private static final String MODEL_NAMESPACE = "model_namespace";
+
+    @BeforeEach
+    public void init() {
+        model = new DMNModelImpl();
+        model.setDefinitions(getDefinitions(MODEL_NAMESPACE));
+    }
+
+    @Test
+    void addDecisionSameModel() {
+        List<DecisionNode> decisionNodeList = new ArrayList<>();
+        IntStream.range(0, 3).forEach(i -> {
+            DecisionNode toAdd = getDecisionNode("id_" + i, "decision_" + i, 
model.getDefinitions());
+            model.addDecision(toAdd);
+            decisionNodeList.add(toAdd);
+        });
+
+        decisionNodeList.forEach(decisionNode -> {
+            assertThat(model.getDecisionByName(decisionNode.getName()))
+                    .isNotNull()
+                    .isEqualTo(decisionNode);
+            assertThat(model.getDecisionById(decisionNode.getId()))
+                    .isNotNull()
+                    .isEqualTo(decisionNode);
+        });
+    }
+
+    @Test
+    void addDecisionWithoutIdSameModel() {
+        List<DecisionNode> decisionNodeList = new ArrayList<>();
+        IntStream.range(0, 3).forEach(i -> {
+            DecisionNode toAdd = getDecisionNode(null, "decision_" + i, 
model.getDefinitions());
+            model.addDecision(toAdd);
+            decisionNodeList.add(toAdd);
+        });
+
+        decisionNodeList.forEach(decisionNode ->
+                                         
assertThat(model.getDecisionByName(decisionNode.getName()))
+                                                 .isNotNull()
+                                                 .isEqualTo(decisionNode));
+    }
+
+    @Test
+    void addDecisionWithoutNameSameModel() {
+        List<DecisionNode> decisionNodeList = new ArrayList<>();
+        IntStream.range(0, 3).forEach(i -> {
+            DecisionNode toAdd = getDecisionNode("id_" + i, null, 
model.getDefinitions());
+            model.addDecision(toAdd);
+            decisionNodeList.add(toAdd);
+        });
+        decisionNodeList.forEach(decisionNode ->
+                                         
assertThat(model.getDecisionById(decisionNode.getId()))
+                                                 .isNotNull()
+                                                 .isEqualTo(decisionNode));
+    }
+
+    @Test
+    void addDecisionImportedModel() {
+        List<DecisionNode> decisionNodeList = new ArrayList<>();
+        String importedNameSpace = "imported_namespace";
+        Definitions definitions = getDefinitions(importedNameSpace);
+        model.setImportAliasForNS(importedNameSpace, 
definitions.getNamespace(), definitions.getName());
+        IntStream.range(0, 3).forEach(i -> {
+            DecisionNode toAdd = getDecisionNode("id_" + i, "decision_" + i, 
definitions);
+            model.addDecision(toAdd);
+            decisionNodeList.add(toAdd);
+        });
+
+        decisionNodeList.forEach(decisionNode -> {
+            assertThat(model.getDecisionByName(String.format("%s.%s", 
importedNameSpace, decisionNode.getName())))
+                    .isNotNull()
+                    .isEqualTo(decisionNode);
+            assertThat(model.getDecisionById(String.format("%s#%s", 
importedNameSpace, decisionNode.getId())))
+                    .isNotNull()
+                    .isEqualTo(decisionNode);
+        });
+    }
+
+    @Test
+    void addDecisionWithoutIdImportedModel() {
+        List<DecisionNode> decisionNodeList = new ArrayList<>();
+        String importedNameSpace = "imported_namespace";
+        Definitions definitions = getDefinitions(importedNameSpace);
+        model.setImportAliasForNS(importedNameSpace, 
definitions.getNamespace(), definitions.getName());
+        IntStream.range(0, 3).forEach(i -> {
+            DecisionNode toAdd = getDecisionNode(null, "decision_" + 
i,definitions);
+            model.addDecision(toAdd);
+            decisionNodeList.add(toAdd);
+        });
+
+        decisionNodeList.forEach(decisionNode ->
+                                         
assertThat(model.getDecisionByName(String.format("%s.%s", importedNameSpace, 
decisionNode.getName())))
+                                                 .isNotNull()
+                                                 .isEqualTo(decisionNode));
+    }
+
+    @Test
+    void addDecisionWithoutNameImportedModel() {
+        List<DecisionNode> decisionNodeList = new ArrayList<>();
+        String importedNameSpace = "imported_namespace";
+        Definitions definitions = getDefinitions(importedNameSpace);
+        model.setImportAliasForNS(importedNameSpace, 
definitions.getNamespace(), definitions.getName());
+        IntStream.range(0, 3).forEach(i -> {
+            DecisionNode toAdd = getDecisionNode("id_" + i, null, definitions);
+            model.addDecision(toAdd);
+            decisionNodeList.add(toAdd);
+        });
+        decisionNodeList.forEach(decisionNode ->
+                                         
assertThat(model.getDecisionById(String.format("%s#%s", importedNameSpace, 
decisionNode.getId())))
+                                                 .isNotNull()
+                                                 .isEqualTo(decisionNode));
+    }
+
+    private Definitions getDefinitions(String nameSpace) {
+        Definitions toReturn = new TDefinitions();
+        toReturn.setNamespace(nameSpace);
+        toReturn.setName("Definitions_" + nameSpace);
+        return toReturn;
+    }
+
+    private DecisionNode getDecisionNode(String id, String name, Definitions 
parent) {
+        Decision decision = getDecision(id, name, parent);
+        return new DecisionNodeImpl(decision);
+    }
+
+    private Decision getDecision(String id, String name, Definitions parent) {
+        Decision toReturn = new TDecision();
+        toReturn.setId(id);
+        toReturn.setName(name);
+        toReturn.setParent(parent);
+        return toReturn;
+    }
+}
\ No newline at end of file
diff --git 
a/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/impl/TupleIdentifierTest.java
 
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/impl/TupleIdentifierTest.java
new file mode 100644
index 0000000000..af5f2eed2b
--- /dev/null
+++ 
b/kie-dmn/kie-dmn-core/src/test/java/org/kie/dmn/core/impl/TupleIdentifierTest.java
@@ -0,0 +1,101 @@
+/**
+ * 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.core.impl;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class TupleIdentifierTest {
+
+    @Test
+    void createTupleIdentifier() {
+        String id = "123124";
+        String name = "name";
+        TupleIdentifier retrieved = TupleIdentifier.createTupleIdentifier(id, 
name);
+        assertThat(retrieved).isNotNull();
+        assertThat(retrieved.getId()).isEqualTo(id);
+        assertThat(retrieved.getName()).isEqualTo(name);
+    }
+
+    @Test
+    void createTupleIdentifierById() {
+        String id = "123124";
+        TupleIdentifier retrieved = 
TupleIdentifier.createTupleIdentifierById(id);
+        assertThat(retrieved).isNotNull();
+        assertThat(retrieved.getId()).isEqualTo(id);
+        assertThat(retrieved.getName()).isNotNull();
+    }
+
+    @Test
+    void createTupleIdentifierByName() {
+        String name = "name";
+        TupleIdentifier retrieved = 
TupleIdentifier.createTupleIdentifierByName(name);
+        assertThat(retrieved).isNotNull();
+        assertThat(retrieved.getName()).isEqualTo(name);
+        assertThat(retrieved.getId()).isNotNull();
+    }
+
+    @Test
+    void generateIdFromName() {
+        String name = "name";
+        String wrongName = "wrong-name";
+        String retrieved = TupleIdentifier.generateIdFromName(name);
+        
assertThat(retrieved).isEqualTo(TupleIdentifier.generateIdFromName(name))
+                .isNotEqualTo(TupleIdentifier.generateIdFromName(wrongName));
+    }
+
+    @Test
+    void generateNameFromId() {
+        String id = "123124";
+        String wrongId = "423423";
+        String retrieved = TupleIdentifier.generateNameFromId(id);
+        assertThat(retrieved).isEqualTo(TupleIdentifier.generateNameFromId(id))
+                .isNotEqualTo(TupleIdentifier.generateNameFromId(wrongId));
+    }
+
+    @Test
+    void testTupleIdentifierEquality() {
+        String id = "123124";
+        String wrongId = "3242342";
+        String name = "name";
+        String wrongName = "wrong-name";
+        TupleIdentifier original = new TupleIdentifier(id, name);
+        commonTestEquality(original, new TupleIdentifier(id, name), true);
+        commonTestEquality(original, new TupleIdentifier(id, name), true);
+        commonTestEquality(original, new TupleIdentifier(null, name), true);
+        commonTestEquality(original, new TupleIdentifier(id, null), true);
+
+        commonTestEquality(original, new TupleIdentifier(id, wrongName), 
false);
+        commonTestEquality(original, new TupleIdentifier(wrongId, name), 
false);
+        commonTestEquality(original, new TupleIdentifier(wrongId, wrongName), 
false);
+        commonTestEquality(original, new TupleIdentifier(null, wrongName), 
false);
+        commonTestEquality(original, new TupleIdentifier(wrongId, null), 
false);
+    }
+
+    private void commonTestEquality(TupleIdentifier original, TupleIdentifier 
comparison, boolean shouldBeEqual) {
+        if (shouldBeEqual) {
+            assertThat(original).isEqualTo(comparison);
+            assertThat(comparison).isEqualTo(original);
+        } else {
+            assertThat(original).isNotEqualTo(comparison);
+            assertThat(comparison).isNotEqualTo(original);
+        }
+    }
+}
\ No newline at end of file
diff --git 
a/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/0089-nested-inputdata-imports.dmn
 
b/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/0089-nested-inputdata-imports.dmn
new file mode 100644
index 0000000000..e158a08647
--- /dev/null
+++ 
b/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/0089-nested-inputdata-imports.dmn
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<definitions xmlns:semantic="https://www.omg.org/spec/DMN/20211108/MODEL/"; 
+                      
xmlns:dmn11="http://www.omg.org/spec/DMN/20151101/dmn.xsd"; 
+                      xmlns:rss="http://purl.org/rss/2.0/"; 
+                      xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/"; 
+                      xmlns:drools="http://www.drools.org/kie/dmn/1.1"; 
+                      xmlns:trisofeed="http://trisotech.com/feed"; 
+                      
xmlns:dmndi="https://www.omg.org/spec/DMN/20191111/DMNDI/"; 
+                      xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/"; 
+                      
xmlns:triso="http://www.trisotech.com/2015/triso/modeling"; 
+                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
+                      xmlns:feel="https://www.omg.org/spec/DMN/20211108/FEEL/"; 
+                      
xmlns:include1="http://www.trisotech.com/definitions/_2a1d771a-a899-4fef-abd6-fc894332337c";
 
+                      
xmlns:include2="http://www.trisotech.com/definitions/_9d46ece4-a96c-4cb0-abc0-0ca121ac3768";
              
+                      xmlns:trisodmn="http://www.trisotech.com/2016/triso/dmn"; 
 
+                      xmlns:tc="http://www.omg.org/spec/DMN/20160719/testcase"; 
 
+                      xmlns="https://www.omg.org/spec/DMN/20211108/MODEL/"; 
+                      id="_10435dcd-8774-4575-a338-49dd554a0928" name="Model 
C" 
+                      
namespace="http://www.trisotech.com/definitions/_10435dcd-8774-4575-a338-49dd554a0928";
 exporter="DMN Modeler" exporterVersion="6.2.4.2" triso:logoChoice="Default">
+    <import 
namespace="http://www.trisotech.com/definitions/_2a1d771a-a899-4fef-abd6-fc894332337c";
+                     name="Model B" 
+                     importType="https://www.omg.org/spec/DMN/20211108/MODEL/"; 
/>
+    <import 
namespace="http://www.trisotech.com/definitions/_9d46ece4-a96c-4cb0-abc0-0ca121ac3768";
 
+                     name="Model B2" 
+                     importType="https://www.omg.org/spec/DMN/20211108/MODEL/"; 
/>
+    <decision id="_fc1bff6c-b1ca-4a10-ba9a-23b8f5e86e6a" name="Model C 
Decision based on Bs" triso:useOutputTypeAsAnswer="false">
+        <variable name="Model C Decision based on Bs" 
id="_2e323310-3d83-4c51-a256-3082e0ccacea" typeRef="Any"/>
+        <informationRequirement id="_e848f84a-25ef-432b-b944-2848f11ea91c">
+            <requiredDecision 
href="http://www.trisotech.com/definitions/_9d46ece4-a96c-4cb0-abc0-0ca121ac3768#_96df766e-23e1-4aa6-9d5d-545fbe2f1e23"/>
+        </informationRequirement>
+        <informationRequirement id="_dc7aa090-f5ce-4552-a467-2adb36d7e263">
+            <requiredDecision 
href="http://www.trisotech.com/definitions/_2a1d771a-a899-4fef-abd6-fc894332337c#_96df766e-23e1-4aa6-9d5d-545fbe2f1e23"/>
+        </informationRequirement>
+        <literalExpression id="_05fab753-c3c4-41a9-8984-e078f4aabe32" 
typeRef="Any" triso:expressionId="_66b680ec-9fc3-497d-831b-39708a930a1b">
+            <text>"B: " + Model B.Evaluating Say Hello + "; B2: " + Model 
B2.Evaluating B2 Say Hello</text>
+        </literalExpression>
+    </decision>
+</definitions>
\ No newline at end of file
diff --git 
a/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Model_B.dmn 
b/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Model_B.dmn
new file mode 100644
index 0000000000..9cf1c88443
--- /dev/null
+++ b/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Model_B.dmn
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<definitions xmlns:semantic="https://www.omg.org/spec/DMN/20211108/MODEL/"; 
+                      
xmlns:dmn11="http://www.omg.org/spec/DMN/20151101/dmn.xsd"; 
+                      xmlns:rss="http://purl.org/rss/2.0/"; 
+                      xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/"; 
+                      xmlns:drools="http://www.drools.org/kie/dmn/1.1"; 
+                      xmlns:trisofeed="http://trisotech.com/feed"; 
+                      
xmlns:dmndi="https://www.omg.org/spec/DMN/20191111/DMNDI/"; 
+                      xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/"; 
+                      
xmlns:triso="http://www.trisotech.com/2015/triso/modeling"; 
+                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
+                      xmlns:feel="https://www.omg.org/spec/DMN/20211108/FEEL/"; 
+                      
xmlns:include1="http://www.trisotech.com/definitions/_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9";
             
+                      xmlns:trisodmn="http://www.trisotech.com/2016/triso/dmn"; 
 
+                      xmlns:tc="http://www.omg.org/spec/DMN/20160719/testcase"; 
 
+                      xmlns="https://www.omg.org/spec/DMN/20211108/MODEL/"; 
+                      id="_2a1d771a-a899-4fef-abd6-fc894332337c" name="Model 
B" 
+                      
namespace="http://www.trisotech.com/definitions/_2a1d771a-a899-4fef-abd6-fc894332337c";
 exporter="DMN Modeler" exporterVersion="6.2.4.2" triso:logoChoice="Default">
+    <import 
namespace="http://www.trisotech.com/definitions/_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9";
 
+                     name="modelA" 
+                     importType="https://www.omg.org/spec/DMN/20211108/MODEL/"; 
/>
+    <decision id="_96df766e-23e1-4aa6-9d5d-545fbe2f1e23" name="Evaluating Say 
Hello" triso:useOutputTypeAsAnswer="false">
+        <variable name="Evaluating Say Hello" 
id="_0a5ade68-3746-4022-99e3-e15e42216725" typeRef="string"/>
+        <informationRequirement id="_d3627327-056c-4117-b167-df7029d21511">
+            <requiredDecision 
href="http://www.trisotech.com/definitions/_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9#_f7fdaec4-d669-4797-b3b4-12b860de2eb5"/>
+        </informationRequirement>
+        <literalExpression typeRef="string" 
id="_026e05fb-6c07-4046-9c52-716ba5619a69" 
triso:expressionId="_5d8ea0f4-1c32-450d-a141-60df64654436">
+            <text>"Evaluating Say Hello to: "+modelA.Greet the Person</text>
+        </literalExpression>
+    </decision>
+</definitions>
diff --git 
a/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Model_B2.dmn 
b/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Model_B2.dmn
new file mode 100644
index 0000000000..74f588ebdf
--- /dev/null
+++ b/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Model_B2.dmn
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<definitions xmlns:semantic="https://www.omg.org/spec/DMN/20211108/MODEL/"; 
+                      
xmlns:dmn11="http://www.omg.org/spec/DMN/20151101/dmn.xsd"; 
+                      xmlns:rss="http://purl.org/rss/2.0/"; 
+                      xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/"; 
+                      xmlns:drools="http://www.drools.org/kie/dmn/1.1"; 
+                      xmlns:trisofeed="http://trisotech.com/feed"; 
+                      
xmlns:dmndi="https://www.omg.org/spec/DMN/20191111/DMNDI/"; 
+                      xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/"; 
+                      
xmlns:triso="http://www.trisotech.com/2015/triso/modeling"; 
+                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
+                      xmlns:feel="https://www.omg.org/spec/DMN/20211108/FEEL/"; 
+                      
xmlns:include1="http://www.trisotech.com/definitions/_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9";
             
+                      xmlns:trisodmn="http://www.trisotech.com/2016/triso/dmn"; 
 
+                      xmlns:tc="http://www.omg.org/spec/DMN/20160719/testcase"; 
 
+                      xmlns="https://www.omg.org/spec/DMN/20211108/MODEL/"; 
+                      id="_9d46ece4-a96c-4cb0-abc0-0ca121ac3768" name="Model 
B2" 
+                      
namespace="http://www.trisotech.com/definitions/_9d46ece4-a96c-4cb0-abc0-0ca121ac3768";
 exporter="DMN Modeler" exporterVersion="6.2.4.2" triso:logoChoice="Default">
+    <import 
namespace="http://www.trisotech.com/definitions/_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9";
 
+            name="modelA" 
+            importType="https://www.omg.org/spec/DMN/20211108/MODEL/"; />
+    <decision id="_96df766e-23e1-4aa6-9d5d-545fbe2f1e23" name="Evaluating B2 
Say Hello" triso:useOutputTypeAsAnswer="false">
+        <variable name="Evaluating B2 Say Hello" 
id="_0a5ade68-3746-4022-99e3-e15e42216725" typeRef="string"/>
+        <informationRequirement id="_3eb95d84-08de-4497-9827-5dcd5cb5927e">
+            <requiredDecision 
href="http://www.trisotech.com/definitions/_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9#_f7fdaec4-d669-4797-b3b4-12b860de2eb5"/>
+        </informationRequirement>
+        <literalExpression typeRef="string" 
id="_026e05fb-6c07-4046-9c52-716ba5619a69" 
triso:expressionId="_8ff85959-661b-4674-8a9a-f20ca598f7b1">
+            <text>"Evaluating Say Hello to: "+modelA.Greet the Person</text>
+        </literalExpression>
+    </decision>
+</definitions>
diff --git 
a/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Say_hello_1ID1D.dmn 
b/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Say_hello_1ID1D.dmn
new file mode 100644
index 0000000000..3db63e9121
--- /dev/null
+++ 
b/kie-dmn/kie-dmn-core/src/test/resources/org/kie/dmn/core/Say_hello_1ID1D.dmn
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<definitions xmlns:semantic="https://www.omg.org/spec/DMN/20211108/MODEL/";
+                      
xmlns:dmn11="http://www.omg.org/spec/DMN/20151101/dmn.xsd"; 
+                      xmlns:rss="http://purl.org/rss/2.0/"; 
+                      xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/"; 
+                      xmlns:trisofeed="http://trisotech.com/feed"; 
+                      
xmlns:dmndi="https://www.omg.org/spec/DMN/20191111/DMNDI/"; 
+                      xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/"; 
+                      
xmlns:triso="http://www.trisotech.com/2015/triso/modeling"; 
+                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
+                      xmlns:feel="https://www.omg.org/spec/DMN/20211108/FEEL/"; 
          
+                      xmlns:trisodmn="http://www.trisotech.com/2016/triso/dmn"; 
 
+                      xmlns:tc="http://www.omg.org/spec/DMN/20160719/testcase"; 
 
+                      xmlns:drools="http://www.drools.org/kie/dmn/1.1";  
+                      xmlns="https://www.omg.org/spec/DMN/20211108/MODEL/"; 
+                      id="_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9" name="Say 
hello 1ID1D" 
+                      
namespace="http://www.trisotech.com/definitions/_ae5b3c17-1ac3-4e1d-b4f9-2cf861aec6d9";
 exporter="DMN Modeler" exporterVersion="6.2.4.2" triso:logoChoice="Default">
+    <inputData id="_4f6c136c-8512-4d71-8bbf-7c9eb6e74063" name="Person name">
+        <variable name="Person name" 
id="_46b6677b-4a26-4bca-9532-9a57dd55b8ec" typeRef="string"/>
+    </inputData>
+    <decision id="_f7fdaec4-d669-4797-b3b4-12b860de2eb5" name="Greet the 
Person" triso:useOutputTypeAsAnswer="false">
+        <variable name="Greet the Person" 
id="_85193e88-cb32-41da-9181-fb8e5450753a" typeRef="string"/>
+        <informationRequirement id="b1507384-44a9-4da7-8223-fa49ffa65410">
+            <requiredInput href="#_4f6c136c-8512-4d71-8bbf-7c9eb6e74063"/>
+        </informationRequirement>
+        <literalExpression typeRef="string" 
id="_429b0c63-31e0-4f79-b457-32f565167702" 
triso:expressionId="_28c34a9a-ebce-4ae4-ae8e-7eb062aa35d3">
+            <text>"Hello, "+Person name</text>
+        </literalExpression>
+    </decision>
+</definitions>
diff --git 
a/kie-dmn/kie-dmn-legacy-tests/src/test/java/org/kie/dmn/legacy/tests/core/v1_1/DMNCompilerTest.java
 
b/kie-dmn/kie-dmn-legacy-tests/src/test/java/org/kie/dmn/legacy/tests/core/v1_1/DMNCompilerTest.java
index 0cbb307653..51d4eb3aef 100644
--- 
a/kie-dmn/kie-dmn-legacy-tests/src/test/java/org/kie/dmn/legacy/tests/core/v1_1/DMNCompilerTest.java
+++ 
b/kie-dmn/kie-dmn-legacy-tests/src/test/java/org/kie/dmn/legacy/tests/core/v1_1/DMNCompilerTest.java
@@ -59,7 +59,7 @@ public class DMNCompilerTest extends BaseDMN1_1VariantTest {
         final ItemDefNode itemDef = 
dmnModel.getItemDefinitionByName("tEmploymentStatus" );
 
         assertThat(itemDef.getName()).isEqualTo("tEmploymentStatus");
-        assertThat(itemDef.getId()).isNull();
+        assertThat(itemDef.getId()).isNotNull();
 
         final DMNType type = itemDef.getType();
 
diff --git 
a/kie-dmn/kie-dmn-legacy-tests/src/test/java/org/kie/dmn/legacy/tests/core/v1_1/DMNRuntimeTest.java
 
b/kie-dmn/kie-dmn-legacy-tests/src/test/java/org/kie/dmn/legacy/tests/core/v1_1/DMNRuntimeTest.java
index 8c944344a4..550a7817e2 100644
--- 
a/kie-dmn/kie-dmn-legacy-tests/src/test/java/org/kie/dmn/legacy/tests/core/v1_1/DMNRuntimeTest.java
+++ 
b/kie-dmn/kie-dmn-legacy-tests/src/test/java/org/kie/dmn/legacy/tests/core/v1_1/DMNRuntimeTest.java
@@ -58,9 +58,12 @@ import 
org.kie.dmn.api.core.event.BeforeEvaluateDecisionEvent;
 import org.kie.dmn.api.core.event.BeforeEvaluateDecisionTableEvent;
 import org.kie.dmn.api.core.event.DMNRuntimeEventListener;
 import org.kie.dmn.core.api.DMNFactory;
+import org.kie.dmn.core.api.EvaluatorResult;
 import org.kie.dmn.core.ast.DMNContextEvaluator;
 import org.kie.dmn.core.ast.DecisionNodeImpl;
+import org.kie.dmn.core.ast.EvaluatorResultImpl;
 import org.kie.dmn.core.impl.DMNModelImpl;
+import org.kie.dmn.core.impl.SimpleTypeImpl;
 import org.kie.dmn.core.model.Person;
 import org.kie.dmn.core.util.DMNRuntimeUtil;
 import org.kie.dmn.core.util.KieHelper;
@@ -70,9 +73,11 @@ import org.kie.dmn.feel.marshaller.FEELStringMarshaller;
 import org.kie.dmn.feel.util.NumberEvalHelper;
 import org.kie.dmn.model.api.Decision;
 import org.kie.dmn.model.api.Definitions;
+import org.kie.dmn.model.api.InformationItem;
 import org.kie.dmn.model.api.ItemDefinition;
 import org.kie.dmn.model.v1_1.TDecision;
 import org.kie.dmn.model.v1_1.TDefinitions;
+import org.kie.dmn.model.v1_1.TInformationItem;
 import org.mockito.ArgumentCaptor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -1592,6 +1597,9 @@ public class DMNRuntimeTest extends BaseDMN1_1VariantTest 
{
         for (final String d : decisions) {
             final Decision dec = new TDecision();
             dec.setName(d);
+            InformationItem variable = new TInformationItem();
+            variable.setName("variable-" + d);
+            dec.setVariable(variable);
             def.getDrgElement().add(dec);
             def.addChildren(dec);
             dec.setParent(def);
@@ -1600,7 +1608,12 @@ public class DMNRuntimeTest extends 
BaseDMN1_1VariantTest {
     }
 
     private DecisionNodeImpl buildSimplifiedDecisionNode(final Definitions 
def, final String name) {
-        return new DecisionNodeImpl(def.getDrgElement().stream().filter(drg -> 
drg.getName().equals(name)).filter(Decision.class::isInstance).map(Decision.class::cast).findFirst().get());
+        DecisionNodeImpl toReturn = new 
DecisionNodeImpl(def.getDrgElement().stream().filter(drg -> 
drg.getName().equals(name)).filter(Decision.class::isInstance)
+                                                                 
.map(Decision.class::cast)
+                                                                 
.findFirst().get());
+        toReturn.setEvaluator((eventManager, result) -> new 
EvaluatorResultImpl(name, EvaluatorResult.ResultType.SUCCESS));
+        toReturn.setResultType(SimpleTypeImpl.UNKNOWN_DMNTYPE(""));
+        return toReturn;
     }
 
     @ParameterizedTest(name = "{0}")
diff --git 
a/kie-dmn/kie-dmn-model/src/main/java/org/kie/dmn/model/api/DMNElement.java 
b/kie-dmn/kie-dmn-model/src/main/java/org/kie/dmn/model/api/DMNElement.java
index 5d32a16846..17c91a40e4 100644
--- a/kie-dmn/kie-dmn-model/src/main/java/org/kie/dmn/model/api/DMNElement.java
+++ b/kie-dmn/kie-dmn-model/src/main/java/org/kie/dmn/model/api/DMNElement.java
@@ -22,7 +22,7 @@ import java.util.List;
 
 public interface DMNElement extends DMNModelInstrumentedBase {
 
-    public static interface ExtensionElements {
+    interface ExtensionElements {
 
         List<Object> getAny();
 


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

Reply via email to