@@ -48,27 +48,47 @@ def render_match(self) -> str:
4848
4949 @staticmethod
5050 def _render_sub_query_per_rel_type (
51- rel_name : str , rel_type : str , rel_def : FieldInfo , direction : GraphRelDirection
51+ rel_name : str ,
52+ rel_type : str ,
53+ rel_def : FieldInfo ,
5254 ) -> str :
5355 subquery = [
5456 f"WITH peer_node, { rel_name } , active_node, new_node" ,
5557 f"WITH peer_node, { rel_name } , active_node, new_node" ,
5658 f'WHERE type({ rel_name } ) = "{ rel_type } "' ,
5759 ]
58- 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)" )
61- 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)" )
60+ if rel_def .default .direction in [GraphRelDirection .OUTBOUND , GraphRelDirection .EITHER ]:
61+ subquery .append (f"""
62+ CREATE (new_node)-[new_active_edge:{ rel_type } $rel_props_new ]->(peer_node)
63+ SET new_active_edge.branch = CASE WHEN { rel_name } .branch = "-global-" THEN "-global-" ELSE $branch END
64+ SET new_active_edge.branch_level = CASE WHEN { rel_name } .branch = "-global-" THEN { rel_name } .branch_level ELSE $branch_level END
65+ """ )
66+ subquery .append (f"""
67+ CREATE (active_node)-[deleted_edge:{ rel_type } $rel_props_prev ]->(peer_node)
68+ SET deleted_edge.branch = CASE WHEN { rel_name } .branch = "-global-" THEN "-global-" ELSE $branch END
69+ SET deleted_edge.branch_level = CASE WHEN { rel_name } .branch = "-global-" THEN { rel_name } .branch_level ELSE $branch_level END
70+ """ )
71+ elif rel_def .default .direction in [GraphRelDirection .INBOUND , GraphRelDirection .EITHER ]:
72+ subquery .append (f"""
73+ CREATE (new_node)<-[new_active_edge:{ rel_type } $rel_props_new ]-(peer_node)
74+ SET new_active_edge.branch = CASE WHEN { rel_name } .branch = "-global-" THEN "-global-" ELSE $branch END
75+ SET new_active_edge.branch_level = CASE WHEN { rel_name } .branch = "-global-" THEN { rel_name } .branch_level ELSE $branch_level END
76+ """ )
77+ subquery .append (f"""
78+ CREATE (active_node)<-[deleted_edge:{ rel_type } $rel_props_prev ]-(peer_node)
79+ SET new_active_edge.branch = CASE WHEN { rel_name } .branch = "-global-" THEN "-global-" ELSE $branch END
80+ SET new_active_edge.branch_level = CASE WHEN { rel_name } .branch = "-global-" THEN { rel_name } .branch_level ELSE $branch_level END
81+ """ )
6482 subquery .append ("RETURN peer_node as p2" )
6583 return "\n " .join (subquery )
6684
6785 @classmethod
6886 def _render_sub_query_out (cls ) -> str :
6987 sub_queries_out = [
7088 cls ._render_sub_query_per_rel_type (
71- rel_name = "rel_outband" , rel_type = rel_type , rel_def = rel_def , direction = GraphRelDirection .OUTBOUND
89+ rel_name = "rel_outband" ,
90+ rel_type = rel_type ,
91+ rel_def = rel_def ,
7292 )
7393 for rel_type , rel_def in GraphNodeRelationships .model_fields .items ()
7494 ]
@@ -79,7 +99,9 @@ def _render_sub_query_out(cls) -> str:
7999 def _render_sub_query_in (cls ) -> str :
80100 sub_queries_in = [
81101 cls ._render_sub_query_per_rel_type (
82- rel_name = "rel_inband" , rel_type = rel_type , rel_def = rel_def , direction = GraphRelDirection .INBOUND
102+ rel_name = "rel_inband" ,
103+ rel_type = rel_type ,
104+ rel_def = rel_def ,
83105 )
84106 for rel_type , rel_def in GraphNodeRelationships .model_fields .items ()
85107 ]
@@ -94,19 +116,16 @@ async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> No
94116 self .params ["previous_node" ] = self .previous_node .model_dump ()
95117
96118 self .params ["current_time" ] = self .at .to_string ()
97- self .params ["branch_name" ] = self .branch .name
119+ self .params ["branch" ] = self .branch .name
120+ self .params ["branch_level" ] = self .branch .hierarchy_level
98121 self .params ["branch_support" ] = self .new_node .branch_support
99122
100123 self .params ["rel_props_new" ] = {
101- "branch" : self .branch .name ,
102- "branch_level" : self .branch .hierarchy_level ,
103124 "status" : RelationshipStatus .ACTIVE .value ,
104125 "from" : self .at .to_string (),
105126 }
106127
107128 self .params ["rel_props_prev" ] = {
108- "branch" : self .branch .name ,
109- "branch_level" : self .branch .hierarchy_level ,
110129 "status" : RelationshipStatus .DELETED .value ,
111130 "from" : self .at .to_string (),
112131 }
@@ -141,12 +160,12 @@ async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> No
141160 LIMIT 1
142161 }
143162 WITH n1 as active_node, rel_outband1 as rel_outband, p1 as peer_node, new_node
144- WHERE rel_outband.status = "active"
163+ WHERE rel_outband.status = "active" AND rel_outband.to IS NULL
145164 CALL {
146165 %(sub_query_out)s
147166 }
148167 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 |
168+ FOREACH (i in CASE WHEN rel_outband.branch IN ["-global-", $branch] THEN [1] ELSE [] END |
150169 SET rel_outband.to = $current_time
151170 )
152171 WITH active_node, new_node
@@ -160,14 +179,15 @@ async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> No
160179 LIMIT 1
161180 }
162181 WITH n1 as active_node, rel_inband1 as rel_inband, p1 as peer_node, new_node
163- WHERE rel_inband.status = "active"
182+ WHERE rel_inband.status = "active" AND rel_inband.to IS NULL
164183 CALL {
165184 %(sub_query_in)s
166185 }
167186 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 |
187+ FOREACH (i in CASE WHEN rel_inband.branch IN ["-global-", $branch] THEN [1] ELSE [] END |
169188 SET rel_inband.to = $current_time
170189 )
190+
171191 RETURN DISTINCT new_node
172192 """ % {
173193 "branch_filter" : branch_filter ,
0 commit comments