@@ -83,33 +83,55 @@ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa
8383 query = """
8484UNWIND $node_details_list AS node_details
8585WITH node_details.root_uuid AS root_uuid, node_details.node_map AS node_map
86+ MATCH (diff_root:DiffRoot {uuid: root_uuid})
87+ MERGE (diff_root)-[:DIFF_HAS_NODE]->(diff_node:DiffNode {uuid: node_map.node_properties.uuid})
88+ WITH root_uuid, node_map, diff_node, (node_map.conflict_params IS NOT NULL) AS has_node_conflict
89+ SET
90+ diff_node.kind = node_map.node_properties.kind,
91+ diff_node.label = node_map.node_properties.label,
92+ diff_node.changed_at = node_map.node_properties.changed_at,
93+ diff_node.action = node_map.node_properties.action,
94+ diff_node.path_identifier = node_map.node_properties.path_identifier
95+ WITH root_uuid, node_map, diff_node, has_node_conflict
8696CALL {
87- WITH root_uuid, node_map
88- MATCH (diff_root {uuid: root_uuid})
89- MERGE (diff_root)-[:DIFF_HAS_NODE]->(diff_node:DiffNode {uuid: node_map.node_properties.uuid})
90- SET
91- diff_node.kind = node_map.node_properties.kind,
92- diff_node.label = node_map.node_properties.label,
93- diff_node.changed_at = node_map.node_properties.changed_at,
94- diff_node.action = node_map.node_properties.action,
95- diff_node.path_identifier = node_map.node_properties.path_identifier
9697 // -------------------------
97- // add/remove node-level conflict
98+ // delete parent-child relationships for included nodes, they will be added in EnrichedNodesLinkQuery
9899 // -------------------------
99- WITH diff_node, node_map
100- OPTIONAL MATCH (diff_node)-[:DIFF_HAS_CONFLICT]->(current_diff_node_conflict:DiffConflict)
101- WITH diff_node, node_map, current_diff_node_conflict, (node_map.conflict_params IS NOT NULL) AS has_node_conflict
102- FOREACH (i in CASE WHEN has_node_conflict = FALSE THEN [1] ELSE [] END |
103- DETACH DELETE current_diff_node_conflict
104- )
105- FOREACH (i in CASE WHEN has_node_conflict = TRUE THEN [1] ELSE [] END |
106- MERGE (diff_node)-[:DIFF_HAS_CONFLICT]->(diff_node_conflict:DiffConflict)
107- SET diff_node_conflict = node_map.conflict_params
108- )
100+ WITH diff_node
101+ MATCH (diff_node)-[:DIFF_HAS_RELATIONSHIP]->(:DiffRelationship)-[parent_rel:DIFF_HAS_NODE]->(:DiffNode)
102+ DELETE parent_rel
103+ }
104+ OPTIONAL MATCH (diff_node)-[:DIFF_HAS_CONFLICT]->(current_node_conflict:DiffConflict)
105+ CALL {
106+ // -------------------------
107+ // create a node-level conflict, if necessary
108+ // -------------------------
109+ WITH diff_node, current_node_conflict, has_node_conflict
110+ WITH diff_node, current_node_conflict, has_node_conflict
111+ WHERE current_node_conflict IS NULL AND has_node_conflict = TRUE
112+ CREATE (diff_node)-[:DIFF_HAS_CONFLICT]->(:DiffConflict)
113+ }
114+ CALL {
115+ // -------------------------
116+ // delete a node-level conflict, if necessary
117+ // -------------------------
118+ WITH current_node_conflict, has_node_conflict
119+ WITH current_node_conflict, has_node_conflict
120+ WHERE current_node_conflict IS NOT NULL AND has_node_conflict = FALSE
121+ DETACH DELETE current_node_conflict
122+ }
123+ WITH root_uuid, node_map, diff_node, has_node_conflict, node_map.conflict_params AS node_conflict_params
124+ CALL {
125+ // -------------------------
126+ // set the properties of the node-level conflict, if necessary
127+ // -------------------------
128+ WITH diff_node, has_node_conflict, node_conflict_params
129+ WITH diff_node, has_node_conflict, node_conflict_params
130+ WHERE has_node_conflict = TRUE
131+ OPTIONAL MATCH (diff_node)-[:DIFF_HAS_CONFLICT]->(node_conflict:DiffConflict)
132+ SET node_conflict = node_conflict_params
109133}
110134CALL {
111- WITH root_uuid, node_map
112- MATCH (diff_root {uuid: root_uuid})-[:DIFF_HAS_NODE]->(diff_node:DiffNode {uuid: node_map.node_properties.uuid})
113135 // -------------------------
114136 // remove stale attributes for this node
115137 // -------------------------
@@ -426,14 +448,14 @@ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa
426448 node_link_details.root_uuid AS root_uuid,
427449 node_link_details.parent_uuid AS parent_uuid,
428450 node_link_details.child_uuid AS child_uuid,
429- node_link_details.relationship_name AS relationship_name
451+ node_link_details.child_relationship_name AS relationship_name
430452CALL {
431453 WITH root_uuid, parent_uuid, child_uuid, relationship_name
432454 MATCH (diff_root {uuid: root_uuid})
433- MATCH (diff_root)-[:DIFF_HAS_NODE]->(parent_node:DiffNode {uuid: parent_uuid})
434- -[:DIFF_HAS_RELATIONSHIP]->(diff_rel_group:DiffRelationship {name: relationship_name})
435455 MATCH (diff_root)-[:DIFF_HAS_NODE]->(child_node:DiffNode {uuid: child_uuid})
436- MERGE (diff_rel_group)-[:DIFF_HAS_NODE]->(child_node)
456+ -[:DIFF_HAS_RELATIONSHIP]->(diff_rel_group:DiffRelationship {name: relationship_name})
457+ MATCH (diff_root)-[:DIFF_HAS_NODE]->(parent_node:DiffNode {uuid: parent_uuid})
458+ MERGE (diff_rel_group)-[:DIFF_HAS_NODE]->(parent_node)
437459}
438460 """
439461 self .add_to_query (query )
@@ -443,14 +465,14 @@ def _build_node_parent_links(self, enriched_node: EnrichedDiffNode, root_uuid: s
443465 return []
444466 parent_links = []
445467 for relationship in enriched_node .relationships :
446- for child_node in relationship .nodes :
468+ for parent_node in relationship .nodes :
447469 parent_links .append (
448470 {
449- "parent_uuid " : enriched_node .uuid ,
450- "relationship_name " : relationship .name ,
451- "child_uuid " : child_node .uuid ,
471+ "child_uuid " : enriched_node .uuid ,
472+ "child_relationship_name " : relationship .name ,
473+ "parent_uuid " : parent_node .uuid ,
452474 "root_uuid" : root_uuid ,
453475 }
454476 )
455- parent_links .extend (self ._build_node_parent_links (enriched_node = child_node , root_uuid = root_uuid ))
477+ parent_links .extend (self ._build_node_parent_links (enriched_node = parent_node , root_uuid = root_uuid ))
456478 return parent_links
0 commit comments