[graph] delete all Node edges in removeNode

Delete all edges arriving to and starting from this node. This includes edges connected to sub-attributes (children of List/GroupAttributes).
This commit is contained in:
Yann Lanthony 2017-11-07 20:22:34 +01:00
parent e38f112c55
commit eccef6bed8

View file

@ -838,25 +838,35 @@ class Graph(BaseObject):
# type: (Attribute,) -> [Edge] # type: (Attribute,) -> [Edge]
return [edge for edge in self.edges if edge.src == attribute] return [edge for edge in self.edges if edge.src == attribute]
def nodeInEdges(self, node):
# type: (Node) -> [Edge]
""" Return the list of edges arriving to this node """
return [edge for edge in self.edges if edge.dst.node == node]
def nodeOutEdges(self, node):
# type: (Node) -> [Edge]
""" Return the list of edges starting from this node """
return [edge for edge in self.edges if edge.src.node == node]
def removeNode(self, nodeName): def removeNode(self, nodeName):
""" """
Remove the node identified by 'nodeName' from the graph Remove the node identified by 'nodeName' from the graph
and return in and out edges removed by this operation in two dicts {dstAttr.fullName(), srcAttr.fullName()} and return in and out edges removed by this operation in two dicts {dstAttr.fullName(), srcAttr.fullName()}
""" """
node = self.node(nodeName) node = self.node(nodeName)
self._nodes.pop(nodeName)
inEdges = {} inEdges = {}
outEdges = {} outEdges = {}
with GraphModification(self):
for attr in node._attributes:
for edge in self.outEdges(attr):
self.edges.remove(edge)
outEdges[edge.dst.fullName()] = edge.src.fullName()
if attr in self.edges.keys():
edge = self.edges.pop(attr)
inEdges[edge.dst.fullName()] = edge.src.fullName()
# Remove all edges arriving to and starting from this node
with GraphModification(self):
for edge in self.nodeOutEdges(node):
self.edges.remove(edge)
outEdges[edge.dst.fullName()] = edge.src.fullName()
for edge in self.nodeInEdges(node):
self.edges.remove(edge)
inEdges[edge.dst.fullName()] = edge.src.fullName()
self._nodes.remove(node)
return inEdges, outEdges return inEdges, outEdges
@Slot(str, result=Node) @Slot(str, result=Node)