@@ -56,11 +56,27 @@ def _render_sub_query_per_rel_type(
5656 f'WHERE type({ rel_name } ) = "{ rel_type } "' ,
5757 ]
5858 if rel_def .default .direction in [direction , GraphRelDirection .EITHER ]:
59- subquery .append (f"CREATE (new_node)-[:{ rel_type } $rel_props_new ]->(peer_node)" )
60- subquery .append (f"CREATE (active_node)-[:{ rel_type } $rel_props_prev ]->(peer_node)" )
59+ subquery .append (f"""
60+ CREATE (new_node)-[new_active_edge:{ rel_type } $rel_props_new ]->(peer_node)
61+ SET new_active_edge.branch = CASE WHEN { rel_name } .branch = "-global-" THEN "-global-" ELSE $branch END
62+ SET new_active_edge.branch_level = CASE WHEN { rel_name } .branch = "-global-" THEN { rel_name } .branch_level ELSE $branch_level END
63+ """ )
64+ subquery .append (f"""
65+ CREATE (active_node)-[deleted_edge:{ rel_type } $rel_props_prev ]->(peer_node)
66+ SET deleted_edge.branch = CASE WHEN { rel_name } .branch = "-global-" THEN "-global-" ELSE $branch END
67+ SET deleted_edge.branch_level = CASE WHEN { rel_name } .branch = "-global-" THEN { rel_name } .branch_level ELSE $branch_level END
68+ """ )
6169 elif rel_def .default .direction in [direction , GraphRelDirection .EITHER ]:
62- subquery .append (f"CREATE (new_node)<-[:{ rel_type } $rel_props_new ]-(peer_node)" )
63- subquery .append (f"CREATE (active_node)<-[:{ rel_type } $rel_props_prev ]-(peer_node)" )
70+ subquery .append (f"""
71+ CREATE (new_node)<-[new_active_edge:{ rel_type } $rel_props_new ]-(peer_node)
72+ SET new_active_edge.branch = CASE WHEN { rel_name } .branch = "-global-" THEN "-global-" ELSE $branch END
73+ SET new_active_edge.branch_level = CASE WHEN { rel_name } .branch = "-global-" THEN { rel_name } .branch_level ELSE $branch_level END
74+ """ )
75+ subquery .append (f"""
76+ CREATE (active_node)<-[deleted_edge:{ rel_type } $rel_props_prev ]-(peer_node)
77+ SET new_active_edge.branch = CASE WHEN { rel_name } .branch = "-global-" THEN "-global-" ELSE $branch END
78+ SET new_active_edge.branch_level = CASE WHEN { rel_name } .branch = "-global-" THEN { rel_name } .branch_level ELSE $branch_level END
79+ """ )
6480 subquery .append ("RETURN peer_node as p2" )
6581 return "\n " .join (subquery )
6682
@@ -94,19 +110,16 @@ async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> No
94110 self .params ["previous_node" ] = self .previous_node .model_dump ()
95111
96112 self .params ["current_time" ] = self .at .to_string ()
97- self .params ["branch_name" ] = self .branch .name
113+ self .params ["branch" ] = self .branch .name
114+ self .params ["branch_level" ] = self .branch .hierarchy_level
98115 self .params ["branch_support" ] = self .new_node .branch_support
99116
100117 self .params ["rel_props_new" ] = {
101- "branch" : self .branch .name ,
102- "branch_level" : self .branch .hierarchy_level ,
103118 "status" : RelationshipStatus .ACTIVE .value ,
104119 "from" : self .at .to_string (),
105120 }
106121
107122 self .params ["rel_props_prev" ] = {
108- "branch" : self .branch .name ,
109- "branch_level" : self .branch .hierarchy_level ,
110123 "status" : RelationshipStatus .DELETED .value ,
111124 "from" : self .at .to_string (),
112125 }
@@ -127,7 +140,7 @@ async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> No
127140 LIMIT 1
128141 }
129142 WITH n1 as active_node, r1 as rb
130- WHERE rb.status = "active"
143+ WHERE rb.status = "active" AND rb.to IS NULL
131144 CREATE (new_node:Node:%(labels)s { uuid: active_node.uuid, kind: $new_node.kind, namespace: $new_node.namespace, branch_support: $new_node.branch_support })
132145 WITH active_node, new_node
133146 // Process Outbound Relationship
@@ -141,15 +154,15 @@ async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> No
141154 LIMIT 1
142155 }
143156 WITH n1 as active_node, rel_outband1 as rel_outband, p1 as peer_node, new_node
144- WHERE rel_outband.status = "active"
157+ WHERE rel_outband.status = "active" AND rel_outband.to IS NULL
145158 CALL {
146159 %(sub_query_out)s
147160 }
148161 WITH p2 as peer_node, rel_outband, active_node, new_node
149- FOREACH (i in CASE WHEN rel_outband.branch = $branch_name THEN [1] ELSE [] END |
162+ FOREACH (i in CASE WHEN rel_outband.branch = "-global-" or rel_outband.branch = $branch THEN [1] ELSE [] END |
150163 SET rel_outband.to = $current_time
151164 )
152- WITH active_node, new_node
165+ WITH peer_node, rel_outband, active_node, new_node
153166 MATCH (active_node)<-[]-(peer)
154167 CALL {
155168 WITH active_node, peer
@@ -160,14 +173,16 @@ async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> No
160173 LIMIT 1
161174 }
162175 WITH n1 as active_node, rel_inband1 as rel_inband, p1 as peer_node, new_node
163- WHERE rel_inband.status = "active"
176+ WHERE rel_inband.status = "active" AND rel_inband.to IS NULL
164177 CALL {
165178 %(sub_query_in)s
166179 }
167180 WITH p2 as peer_node, rel_inband, active_node, new_node
168- FOREACH (i in CASE WHEN rel_inband.branch = $branch_name THEN [1] ELSE [] END |
181+ FOREACH (i in CASE WHEN rel_inband.branch = "-global-" or rel_inband.branch = $branch THEN [1] ELSE [] END |
169182 SET rel_inband.to = $current_time
170183 )
184+
185+ WITH peer_node, rel_inband, active_node, new_node
171186 RETURN DISTINCT new_node
172187 """ % {
173188 "branch_filter" : branch_filter ,
0 commit comments