data: fixes for clearing on refresh

* reduce aggregation count when clearing
* added TokenLocation to method override edge
* added TokenLocations to template related edges
This commit is contained in:
Eberhard Graether
2015-05-18 16:22:39 +02:00
parent f0e101e994
commit 1f3be0e60d
13 changed files with 134 additions and 48 deletions
+35 -7
View File
@@ -93,13 +93,28 @@ Edge* StorageGraph::createEdge(Edge::EdgeType type, Node* from, Node* to)
if (from->getLastParentNode() != to->getLastParentNode())
{
Id edgeId = edge->getId();
updateAggregationEdges(from->getParentNode(), to, edgeId);
updateAggregationEdges(from, to->getParentNode(), edgeId);
updateAggregationEdges(from->getParentNode(), to, edgeId, 0);
updateAggregationEdges(from, to->getParentNode(), edgeId, 0);
}
return edge;
}
void StorageGraph::removeEdge(Edge* edge)
{
Node* from = edge->getFrom();
Node* to = edge->getTo();
if (from->getLastParentNode() != to->getLastParentNode())
{
Id edgeId = edge->getId();
updateAggregationEdges(from->getParentNode(), to, 0, edgeId);
updateAggregationEdges(from, to->getParentNode(), 0, edgeId);
}
Graph::removeEdge(edge);
}
Node* StorageGraph::insertNodeHierarchy(Node::NodeType type, SearchNode* searchNode)
{
std::deque<SearchNode*> searchNodes = searchNode->getParentsWithoutTokenId();
@@ -151,7 +166,7 @@ Edge* StorageGraph::insertEdge(Edge::EdgeType type, Node* from, Node* to)
return edgePtr.get();
}
void StorageGraph::updateAggregationEdges(Node* from, Node* to, Id edgeId)
void StorageGraph::updateAggregationEdges(Node* from, Node* to, Id addEdgeId, Id removeEdgeId)
{
if (!from || !to || from == to)
{
@@ -174,15 +189,28 @@ void StorageGraph::updateAggregationEdges(Node* from, Node* to, Id edgeId)
}
);
if (!edge)
if (!edge && addEdgeId)
{
edge = insertEdge(Edge::EDGE_AGGREGATION, from, to);
edge->addComponentAggregation(std::make_shared<TokenComponentAggregation>());
}
edge->getComponent<TokenComponentAggregation>()->addAggregationId(edgeId);
if (addEdgeId)
{
edge->getComponent<TokenComponentAggregation>()->addAggregationId(addEdgeId);
}
if (edge && removeEdgeId)
{
edge->getComponent<TokenComponentAggregation>()->removeAggregationId(removeEdgeId);
}
if (edge && edge->getComponent<TokenComponentAggregation>()->getAggregationCount() == 0)
{
Graph::removeEdge(edge);
}
}
updateAggregationEdges(from->getParentNode(), to, edgeId);
updateAggregationEdges(from, to->getParentNode(), edgeId);
updateAggregationEdges(from->getParentNode(), to, addEdgeId, removeEdgeId);
updateAggregationEdges(from, to->getParentNode(), addEdgeId, removeEdgeId);
}