1414    EnrichedDiffRoot ,
1515    EnrichedDiffs ,
1616    EnrichedDiffSingleRelationship ,
17+     NodeIdentifier ,
1718)
1819
1920
@@ -26,30 +27,35 @@ class NodePair:
2627class  DiffCombiner :
2728    def  __init__ (self ) ->  None :
2829        # {child_uuid: (parent_uuid, parent_rel_name)} 
29-         self ._child_parent_uuid_map : dict [str , tuple [str , str ]] =  {}
30-         self ._parent_node_uuids : set [str ] =  set ()
31-         self ._earlier_nodes_by_uuid : dict [str , EnrichedDiffNode ] =  {}
32-         self ._later_nodes_by_uuid : dict [str , EnrichedDiffNode ] =  {}
33-         self ._common_node_uuids : set [str ] =  set ()
30+         self ._child_parent_identifier_map : dict [NodeIdentifier , tuple [NodeIdentifier , str ]] =  {}
31+         self ._parent_node_identifiers : set [NodeIdentifier ] =  set ()
32+         self ._earlier_nodes_by_identifier : dict [NodeIdentifier , EnrichedDiffNode ] =  {}
33+         self ._later_nodes_by_identifier : dict [NodeIdentifier , EnrichedDiffNode ] =  {}
34+         self ._common_node_identifiers : set [NodeIdentifier ] =  set ()
3435        self ._diff_branch_name : str  |  None  =  None 
3536
3637    def  _initialize (self , earlier_diff : EnrichedDiffRoot , later_diff : EnrichedDiffRoot ) ->  None :
3738        self ._diff_branch_name  =  earlier_diff .diff_branch_name 
38-         self ._child_parent_uuid_map  =  {}
39-         self ._earlier_nodes_by_uuid  =  {}
40-         self ._later_nodes_by_uuid  =  {}
41-         self ._common_node_uuids  =  set ()
39+         self ._child_parent_identifier_map  =  {}
40+         self ._earlier_nodes_by_identifier  =  {}
41+         self ._later_nodes_by_identifier  =  {}
42+         self ._common_node_identifiers  =  set ()
4243        # map the parent of each node (if it exists), preference to the later diff 
4344        for  diff_root  in  (earlier_diff , later_diff ):
4445            for  child_node  in  diff_root .nodes :
4546                for  parent_rel  in  child_node .relationships :
4647                    for  parent_node  in  parent_rel .nodes :
47-                         self ._child_parent_uuid_map [child_node .uuid ] =  (parent_node .uuid , parent_rel .name )
48+                         self ._child_parent_identifier_map [child_node .identifier ] =  (
49+                             parent_node .identifier ,
50+                             parent_rel .name ,
51+                         )
4852        # UUIDs of all the parents, removing the stale parents from the earlier diff 
49-         self ._parent_node_uuids  =  {parent_tuple [0 ] for  parent_tuple  in  self ._child_parent_uuid_map .values ()}
50-         self ._earlier_nodes_by_uuid  =  {n .uuid : n  for  n  in  earlier_diff .nodes }
51-         self ._later_nodes_by_uuid  =  {n .uuid : n  for  n  in  later_diff .nodes }
52-         self ._common_node_uuids  =  set (self ._earlier_nodes_by_uuid .keys ()) &  set (self ._later_nodes_by_uuid .keys ())
53+         self ._parent_node_identifiers  =  {parent_tuple [0 ] for  parent_tuple  in  self ._child_parent_identifier_map .values ()}
54+         self ._earlier_nodes_by_identifier  =  {n .identifier : n  for  n  in  earlier_diff .nodes }
55+         self ._later_nodes_by_identifier  =  {n .identifier : n  for  n  in  later_diff .nodes }
56+         self ._common_node_identifiers  =  set (self ._earlier_nodes_by_identifier .keys ()) &  set (
57+             self ._later_nodes_by_identifier .keys ()
58+         )
5359
5460    @property  
5561    def  diff_branch_name (self ) ->  str :
@@ -61,13 +67,13 @@ def _filter_nodes_to_keep(self, earlier_diff: EnrichedDiffRoot, later_diff: Enri
6167        filtered_node_pairs : list [NodePair ] =  []
6268        for  earlier_node  in  earlier_diff .nodes :
6369            later_node : EnrichedDiffNode  |  None  =  None 
64-             if  earlier_node .uuid  in  self ._common_node_uuids :
65-                 later_node  =  self ._later_nodes_by_uuid [earlier_node .uuid ]
70+             if  earlier_node .identifier  in  self ._common_node_identifiers :
71+                 later_node  =  self ._later_nodes_by_identifier [earlier_node .identifier ]
6672            # this is an out-of-date parent 
6773            if  (
6874                earlier_node .action  is  DiffAction .UNCHANGED 
6975                and  (later_node  is  None  or  later_node .action  is  DiffAction .UNCHANGED )
70-                 and  earlier_node .uuid  not  in   self ._parent_node_uuids 
76+                 and  earlier_node .identifier  not  in   self ._parent_node_identifiers 
7177            ):
7278                continue 
7379            if  later_node  is  None :
@@ -79,15 +85,15 @@ def _filter_nodes_to_keep(self, earlier_diff: EnrichedDiffRoot, later_diff: Enri
7985            filtered_node_pairs .append (NodePair (earlier = earlier_node , later = later_node ))
8086        for  later_node  in  later_diff .nodes :
8187            # these have already been handled 
82-             if  later_node .uuid  in  self ._common_node_uuids :
88+             if  later_node .identifier  in  self ._common_node_identifiers :
8389                continue 
8490            filtered_node_pairs .append (NodePair (later = later_node ))
8591        return  filtered_node_pairs 
8692
87-     def  _get_parent_relationship_name (self , node_id : str ) ->  str  |  None :
88-         if  node_id  not  in   self ._child_parent_uuid_map :
93+     def  _get_parent_relationship_name (self , node_id : NodeIdentifier ) ->  str  |  None :
94+         if  node_id  not  in   self ._child_parent_identifier_map :
8995            return  None 
90-         return  self ._child_parent_uuid_map [node_id ][1 ]
96+         return  self ._child_parent_identifier_map [node_id ][1 ]
9197
9298    def  _should_include (self , earlier : DiffAction , later : DiffAction ) ->  bool :
9399        actions  =  {earlier , later }
@@ -284,7 +290,7 @@ def _combine_relationships(
284290        self ,
285291        earlier_relationships : set [EnrichedDiffRelationship ],
286292        later_relationships : set [EnrichedDiffRelationship ],
287-         node_id : str ,
293+         node_id : NodeIdentifier ,
288294    ) ->  set [EnrichedDiffRelationship ]:
289295        earlier_rels_by_name  =  {rel .name : rel  for  rel  in  earlier_relationships }
290296        later_rels_by_name  =  {rel .name : rel  for  rel  in  later_relationships }
@@ -365,7 +371,7 @@ def _combine_nodes(self, node_pairs: list[NodePair]) -> set[EnrichedDiffNode]:
365371            combined_relationships  =  self ._combine_relationships (
366372                earlier_relationships = node_pair .earlier .relationships ,
367373                later_relationships = node_pair .later .relationships ,
368-                 node_id = node_pair .later .uuid ,
374+                 node_id = node_pair .later .identifier ,
369375            )
370376            if  all (ca .action  is  DiffAction .UNCHANGED  for  ca  in  combined_attributes ) and  all (
371377                cr .action  is  DiffAction .UNCHANGED  for  cr  in  combined_relationships 
@@ -380,14 +386,16 @@ def _combine_nodes(self, node_pairs: list[NodePair]) -> set[EnrichedDiffNode]:
380386                combined_attributes 
381387                or  combined_relationships 
382388                or  combined_conflict 
383-                 or  node_pair .later .uuid  in  self ._parent_node_uuids 
389+                 or  node_pair .later .identifier  in  self ._parent_node_identifiers 
384390            ):
385391                combined_nodes .add (
386392                    EnrichedDiffNode (
387393                        identifier = node_pair .later .identifier ,
388394                        label = node_pair .later .label ,
389395                        changed_at = node_pair .later .changed_at  or  node_pair .earlier .changed_at ,
390396                        action = combined_action ,
397+                         is_node_kind_migration = node_pair .earlier .is_node_kind_migration 
398+                         or  node_pair .later .is_node_kind_migration ,
391399                        path_identifier = node_pair .later .path_identifier ,
392400                        attributes = combined_attributes ,
393401                        relationships = combined_relationships ,
@@ -397,12 +405,12 @@ def _combine_nodes(self, node_pairs: list[NodePair]) -> set[EnrichedDiffNode]:
397405        return  combined_nodes 
398406
399407    def  _link_child_nodes (self , nodes : Iterable [EnrichedDiffNode ]) ->  None :
400-         nodes_by_uuid : dict [str , EnrichedDiffNode ] =  {n .uuid : n  for  n  in  nodes }
401-         for  child_node  in  nodes_by_uuid .values ():
402-             if  child_node .uuid  not  in   self ._child_parent_uuid_map :
408+         nodes_by_identifier : dict [NodeIdentifier , EnrichedDiffNode ] =  {n .identifier : n  for  n  in  nodes }
409+         for  child_node  in  nodes_by_identifier .values ():
410+             if  child_node .identifier  not  in   self ._child_parent_identifier_map :
403411                continue 
404-             parent_uuid , parent_rel_name  =  self ._child_parent_uuid_map [child_node .uuid ]
405-             parent_node  =  nodes_by_uuid [ parent_uuid ]
412+             parent_identifier , parent_rel_name  =  self ._child_parent_identifier_map [child_node .identifier ]
413+             parent_node  =  nodes_by_identifier [ parent_identifier ]
406414            parent_rel  =  child_node .get_relationship (name = parent_rel_name )
407415            parent_rel .nodes .add (parent_node )
408416
0 commit comments