@@ -401,6 +401,8 @@ def _deserialize(self, graphData: dict):
401401 self .header = graphData .get (GraphIO .Keys .Header , {})
402402 fileVersion = Version (self .header .get (GraphIO .Keys .FileVersion , "0.0" ))
403403 graphContent = self ._normalizeGraphContent (graphData , fileVersion )
404+ graphConverters = graphData .get (GraphIO .Keys .Converters , {})
405+ converterMap = {tuple (v ): k for k , v in graphConverters .items ()}
404406 isTemplate = self .header .get (GraphIO .Keys .Template , False )
405407 explicitCachePaths = self .header .get (GraphIO .Keys .CacheDir )
406408 if explicitCachePaths :
@@ -414,7 +416,7 @@ def _deserialize(self, graphData: dict):
414416 self ._deserializeNode (nodeData , nodeName , self )
415417
416418 # Create graph edges by resolving attributes expressions
417- self ._applyExpr ()
419+ self ._applyExpr (converterMap )
418420
419421 # Templates are specific: they contain only the minimal amount of
420422 # serialized data to describe the graph structure.
@@ -571,15 +573,30 @@ def importGraphContent(self, graph: "Graph") -> list[Node]:
571573 Returns:
572574 The list of newly created Nodes.
573575 """
576+
577+ edgesWithConverters = [e for e in graph .edges if e ._converter ]
578+ converterMap = {
579+ (e .src .fullName , e .dst .fullName ): e ._converter .getName ()
580+ for e in edgesWithConverters
581+ }
574582
575- def _renameClashingNodes ():
583+ def replaceKey (src , dst , oldName , newName ):
584+ return (src .replace (oldName , newName , 1 ), dst .replace (oldName , newName , 1 ))
585+
586+ def _renameClashingNodes (converterMap ):
576587 if not self .nodes :
577588 return
578589 unavailableNames = set (self .nodes .keys ())
579590 for node in graph .nodes :
580- if node ._name in unavailableNames :
591+ oldName = node ._name
592+ if oldName in unavailableNames :
581593 node ._name = self ._createUniqueNodeName (node .nodeType , unavailableNames )
594+ converterMap = {
595+ replaceKey (src , dst , oldName , node ._name ): value
596+ for (src , dst ), value in converterMap .items ()
597+ }
582598 unavailableNames .add (node ._name )
599+ return converterMap
583600
584601 def _importNodesAndEdges () -> list [Node ]:
585602 importedNodes = []
@@ -590,10 +607,10 @@ def _importNodesAndEdges() -> list[Node]:
590607 for srcNode in nodes :
591608 node = self ._deserializeNode (srcNode .toDict (), srcNode .name , graph )
592609 importedNodes .append (node )
593- self ._applyExpr ()
610+ self ._applyExpr (converterMap )
594611 return importedNodes
595612
596- _renameClashingNodes ()
613+ converterMap = _renameClashingNodes (converterMap )
597614 importedNodes = _importNodesAndEdges ()
598615 return importedNodes
599616
@@ -1489,10 +1506,10 @@ def discoverVertex(self, vertex, graph):
14891506 self .dfs (visitor = visitor , startNodes = [startNode ])
14901507 return visitor .canCompute + (2 * visitor .canSubmit )
14911508
1492- def _applyExpr (self ):
1509+ def _applyExpr (self , converterMap : dict = None ):
14931510 with GraphModification (self ):
14941511 for node in self ._nodes :
1495- node ._applyExpr ()
1512+ node ._applyExpr (converterMap )
14961513
14971514 def toDict (self ):
14981515 nodes = {k : node .toDict () for k , node in self ._nodes .objects .items ()}
0 commit comments