77from infrahub .core .query .relationship import RelationshipGetPeerQuery , RelationshipPeerData
88from infrahub .core .schema import ProfileSchema
99from infrahub .database import InfrahubDatabase
10+ from infrahub .log import get_logger
1011
1112from ..model .path import (
1213 CalculatedDiffs ,
1314 EnrichedDiffRoot ,
1415)
16+ from ..parent_node_adder import DiffParentNodeAdder , ParentNodeAddRequest
1517from .interface import DiffEnricherInterface
1618
19+ log = get_logger ()
20+
1721
1822class DiffHierarchyEnricher (DiffEnricherInterface ):
1923 """Add hierarchy and parent/component nodes to diff even if the higher-level nodes are unchanged"""
2024
21- def __init__ (self , db : InfrahubDatabase ):
25+ def __init__ (self , db : InfrahubDatabase , parent_adder : DiffParentNodeAdder ):
2226 self .db = db
27+ self .parent_adder = parent_adder
2328
2429 async def enrich (
2530 self , enriched_diff_root : EnrichedDiffRoot , calculated_diffs : CalculatedDiffs | None = None
@@ -28,6 +33,8 @@ async def enrich(
2833 # - A node has a relationship of kind parent
2934 # - A node is part of a hierarchy
3035
36+ log .info ("Beginning hierarchical diff enrichment..." )
37+ self .parent_adder .initialize (enriched_diff_root = enriched_diff_root )
3138 node_rel_parent_map : dict [str , list [str ]] = defaultdict (list )
3239 node_hierarchy_map : dict [str , list [str ]] = defaultdict (list )
3340
@@ -53,6 +60,7 @@ async def enrich(
5360
5461 await self ._enrich_nodes_with_parent (enriched_diff_root = enriched_diff_root , node_map = node_rel_parent_map )
5562 await self ._enrich_hierarchical_nodes (enriched_diff_root = enriched_diff_root , node_map = node_hierarchy_map )
63+ log .info ("Hierarchical diff enrichment complete." )
5664
5765 async def _enrich_hierarchical_nodes (
5866 self ,
@@ -63,6 +71,7 @@ async def _enrich_hierarchical_nodes(
6371
6472 # Retrieve the ID of all ancestors
6573 for kind , node_ids in node_map .items ():
74+ log .info (f"Beginning hierarchy enrichment for { kind } node, num_nodes={ len (node_ids )} ..." )
6675 hierarchy_schema = self .db .schema .get (
6776 name = kind , branch = enriched_diff_root .diff_branch_name , duplicate = False
6877 )
@@ -87,7 +96,7 @@ async def _enrich_hierarchical_nodes(
8796
8897 current_node = node
8998 for ancestor in ancestors :
90- parent = enriched_diff_root . add_parent (
99+ parent_request = ParentNodeAddRequest (
91100 node_id = current_node .uuid ,
92101 parent_id = str (ancestor .uuid ),
93102 parent_kind = ancestor .kind ,
@@ -97,6 +106,7 @@ async def _enrich_hierarchical_nodes(
97106 parent_rel_cardinality = parent_rel .cardinality ,
98107 parent_rel_label = parent_rel .label or "" ,
99108 )
109+ parent = self .parent_adder .add_parent (parent_request = parent_request )
100110
101111 current_node = parent
102112
@@ -114,6 +124,7 @@ async def _enrich_nodes_with_parent(
114124
115125 # Query the UUID of the parent
116126 for kind , ids in node_map .items ():
127+ log .info (f"Beginning parent enrichment for { kind } node, num_nodes={ len (ids )} ..." )
117128 schema_node = self .db .schema .get (name = kind , branch = enriched_diff_root .diff_branch_name , duplicate = False )
118129
119130 parent_rel = [rel for rel in schema_node .relationships if rel .kind == RelationshipKind .PARENT ][0 ]
@@ -138,15 +149,16 @@ async def _enrich_nodes_with_parent(
138149 # Check if the parent are already present
139150 # If parent is already in the list of node we need to add a relationship
140151 # If parent is not in the list of node, we need to add it
152+ diff_node_map = enriched_diff_root .get_node_map (node_uuids = set (parent_peers .keys ()))
141153 for node_id , peer_parent in parent_peers .items ():
142154 # TODO check if we can optimize this part to avoid querying this multiple times
143- node = enriched_diff_root . get_node ( node_uuid = node_id )
155+ node = diff_node_map [ node_id ]
144156 schema_node = self .db .schema .get (
145157 name = node .kind , branch = enriched_diff_root .diff_branch_name , duplicate = False
146158 )
147159 parent_rel = [rel for rel in schema_node .relationships if rel .kind == RelationshipKind .PARENT ][0 ]
148160
149- enriched_diff_root . add_parent (
161+ parent_request = ParentNodeAddRequest (
150162 node_id = node .uuid ,
151163 parent_id = str (peer_parent .peer_id ),
152164 parent_kind = peer_parent .peer_kind ,
@@ -156,6 +168,7 @@ async def _enrich_nodes_with_parent(
156168 parent_rel_cardinality = parent_rel .cardinality ,
157169 parent_rel_label = parent_rel .label or "" ,
158170 )
171+ self .parent_adder .add_parent (parent_request = parent_request )
159172
160173 if node_parent_with_parent_map :
161174 await self ._enrich_nodes_with_parent (
0 commit comments