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);
}
+2 -1
View File
@@ -16,13 +16,14 @@ public:
Node* createNodeHierarchyWithDistinctSignature(
Node::NodeType type, SearchNode* searchNode, std::shared_ptr<TokenComponentSignature> signature);
Edge* createEdge(Edge::EdgeType type, Node* from, Node* to);
void removeEdge(Edge* edge);
private:
Node* insertNodeHierarchy(Node::NodeType type, SearchNode* searchNode);
Node* insertNode(Node::NodeType type, Node* parentNode, SearchNode* searchNode);
Edge* insertEdge(Edge::EdgeType type, Node* from, Node* to);
void updateAggregationEdges(Node* from, Node* to, Id edgeId);
void updateAggregationEdges(Node* from, Node* to, Id addEdgeId, Id removeEdgeId);
};
#endif // STORAGE_GRAPH_H