77from infrahub .core .query .relationship import RelationshipGetPeerQuery , RelationshipPeerData
88from infrahub .core .schema import ProfileSchema , TemplateSchema
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 ,
@@ -30,6 +35,8 @@ async def enrich(
3035 # - A node has a relationship of kind parent
3136 # - A node is part of a hierarchy
3237
38+ log .info ("Beginning hierarchical diff enrichment..." )
39+ self .parent_adder .initialize (enriched_diff_root = enriched_diff_root )
3340 node_rel_parent_map : dict [str , list [str ]] = defaultdict (list )
3441 node_hierarchy_map : dict [str , list [str ]] = defaultdict (list )
3542
@@ -55,6 +62,7 @@ async def enrich(
5562
5663 await self ._enrich_nodes_with_parent (enriched_diff_root = enriched_diff_root , node_map = node_rel_parent_map )
5764 await self ._enrich_hierarchical_nodes (enriched_diff_root = enriched_diff_root , node_map = node_hierarchy_map )
65+ log .info ("Hierarchical diff enrichment complete." )
5866
5967 async def _enrich_hierarchical_nodes (
6068 self ,
@@ -65,6 +73,7 @@ async def _enrich_hierarchical_nodes(
6573
6674 # Retrieve the ID of all ancestors
6775 for kind , node_ids in node_map .items ():
76+ log .info (f"Beginning hierarchy enrichment for { kind } node, num_nodes={ len (node_ids )} ..." )
6877 hierarchy_schema = self .db .schema .get (
6978 name = kind , branch = enriched_diff_root .diff_branch_name , duplicate = False
7079 )
@@ -89,7 +98,7 @@ async def _enrich_hierarchical_nodes(
8998
9099 current_node = node
91100 for ancestor in ancestors :
92- parent = enriched_diff_root . add_parent (
101+ parent_request = ParentNodeAddRequest (
93102 node_id = current_node .uuid ,
94103 parent_id = str (ancestor .uuid ),
95104 parent_kind = ancestor .kind ,
@@ -99,6 +108,7 @@ async def _enrich_hierarchical_nodes(
99108 parent_rel_cardinality = parent_rel .cardinality ,
100109 parent_rel_label = parent_rel .label or "" ,
101110 )
111+ parent = self .parent_adder .add_parent (parent_request = parent_request )
102112
103113 current_node = parent
104114
@@ -116,6 +126,7 @@ async def _enrich_nodes_with_parent(
116126
117127 # Query the UUID of the parent
118128 for kind , ids in node_map .items ():
129+ log .info (f"Beginning parent enrichment for { kind } node, num_nodes={ len (ids )} ..." )
119130 schema_node = self .db .schema .get (name = kind , branch = enriched_diff_root .diff_branch_name , duplicate = False )
120131
121132 parent_rel = [rel for rel in schema_node .relationships if rel .kind == RelationshipKind .PARENT ][0 ]
@@ -140,15 +151,16 @@ async def _enrich_nodes_with_parent(
140151 # Check if the parent are already present
141152 # If parent is already in the list of node we need to add a relationship
142153 # If parent is not in the list of node, we need to add it
154+ diff_node_map = enriched_diff_root .get_node_map (node_uuids = set (parent_peers .keys ()))
143155 for node_id , peer_parent in parent_peers .items ():
144156 # TODO check if we can optimize this part to avoid querying this multiple times
145- node = enriched_diff_root . get_node ( node_uuid = node_id )
157+ node = diff_node_map [ node_id ]
146158 schema_node = self .db .schema .get (
147159 name = node .kind , branch = enriched_diff_root .diff_branch_name , duplicate = False
148160 )
149161 parent_rel = [rel for rel in schema_node .relationships if rel .kind == RelationshipKind .PARENT ][0 ]
150162
151- enriched_diff_root . add_parent (
163+ parent_request = ParentNodeAddRequest (
152164 node_id = node .uuid ,
153165 parent_id = str (peer_parent .peer_id ),
154166 parent_kind = peer_parent .peer_kind ,
@@ -158,6 +170,7 @@ async def _enrich_nodes_with_parent(
158170 parent_rel_cardinality = parent_rel .cardinality ,
159171 parent_rel_label = parent_rel .label or "" ,
160172 )
173+ self .parent_adder .add_parent (parent_request = parent_request )
161174
162175 if node_parent_with_parent_map :
163176 await self ._enrich_nodes_with_parent (
0 commit comments