From 526b634da62d4f00242273c1a9f37dfc6e4a67a8 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Fri, 24 Nov 2023 11:27:46 +0100
Subject: [PATCH] FIX: get_deep: multiple use of properties

---
 src/caosadvancedtools/models/data_model.py | 15 +++++++++++----
 unittests/test_data_model.py               | 18 ++++++++++++++++++
 2 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/src/caosadvancedtools/models/data_model.py b/src/caosadvancedtools/models/data_model.py
index 27f60b5e..26641489 100644
--- a/src/caosadvancedtools/models/data_model.py
+++ b/src/caosadvancedtools/models/data_model.py
@@ -31,7 +31,7 @@ from typing import List
 
 import linkahead as db
 import linkahead.common.models as models
-from linkahead.apiutils import compare_entities, describe_diff
+from linkahead.apiutils import compare_entities, describe_diff, merge_entities
 
 
 CAOSDB_INTERNAL_PROPERTIES = [
@@ -264,7 +264,7 @@ class DataModel(dict):
 
         return list(all_ents.values())
 
-    def get_deep(self, name: str, visited_props: set = None, visited_parents: set = None):
+    def get_deep(self, name: str, visited_props: dict = None, visited_parents: set = None):
         """Attempt to resolve references for the given ``name``.
 
         The returned entity has all the properties it inherits from its ancestry and all properties
@@ -279,7 +279,7 @@ class DataModel(dict):
         if not entity:
             return entity
         if not visited_props:
-            visited_props = set()
+            visited_props = {}
         if not visited_parents:
             visited_parents = set()
 
@@ -309,8 +309,14 @@ class DataModel(dict):
 
         for prop in list(entity.get_properties()):  # Make a change-resistant list copy.
             if prop.name in visited_props:
+                if visited_props[prop.name]:
+                    deep_prop = visited_props[prop.name]
+                    merge_entities(prop, deep_prop)
+                    prop.datatype = deep_prop.datatype
+                    prop.value = deep_prop.value
+                    prop.unit = deep_prop.unit
                 continue
-            visited_props.add(prop.name)
+            visited_props[prop.name] = None
             if prop.name in self:
                 deep_prop = self.get_deep(prop.name, visited_props=visited_props,
                                           visited_parents=visited_parents)
@@ -322,6 +328,7 @@ class DataModel(dict):
                         linked_prop.datatype = deep_prop
                 if deep_prop.description:
                     linked_prop.description = deep_prop.description
+                visited_props[prop.name] = deep_prop
             else:
                 print(f"Referenced property \"{prop.name}\" not found in data model.")
 
diff --git a/unittests/test_data_model.py b/unittests/test_data_model.py
index 5aa151b2..cafeb6ca 100644
--- a/unittests/test_data_model.py
+++ b/unittests/test_data_model.py
@@ -62,3 +62,21 @@ RT1:
         rt1_deep = model_unresolved.get_deep("RT1")
         assert rt1_deep == rt1_unresolved
         assert rt1_deep is rt1_unresolved
+
+        model_double_property = """
+p1:
+  description: Hello world
+  datatype: TEXT
+RT1:
+  recommended_properties:
+    p1:
+RT2:
+  recommended_properties:
+    RT1:
+    p1:
+"""
+        model_unresolved = parse_model_from_string(model_double_property)
+        rt2_deep = model_unresolved.get_deep("RT2")
+        p1 = rt2_deep.get_property("p1")
+        assert p1.datatype == "TEXT"
+        assert p1.description == "Hello world"
-- 
GitLab