data: start adding node name hierarchy from bottom and stop when a name was already added

This commit is contained in:
Eberhard Graether
2018-09-25 00:52:09 +02:00
parent a870858bb6
commit 83f41e04b1
9 changed files with 31 additions and 20 deletions
+18 -7
View File
@@ -201,22 +201,33 @@ Edge::EdgeType ParserClientImpl::referenceKindToEdgeType(ReferenceKind reference
Id ParserClientImpl::addNodeHierarchy(const NameHierarchy& nameHierarchy, NodeType nodeType)
{
Id parentNodeId = 0;
for (size_t i = 1; i <= nameHierarchy.size(); i++)
Id childNodeId = 0;
Id firstNodeId = 0;
for (size_t i = nameHierarchy.size(); i > 0; i--)
{
const NodeType currentType = (i == nameHierarchy.size() ? nodeType : NodeType::NODE_SYMBOL); // TODO: rename to unknown!
Id nodeId = m_storage->addNode(StorageNodeData(
std::pair<Id, bool> ret = m_storage->addNode(StorageNodeData(
NodeType::typeToInt(currentType.getType()), NameHierarchy::serializeRange(nameHierarchy, 0, i)));
if (parentNodeId != 0)
if (!firstNodeId)
{
addEdge(Edge::EDGE_MEMBER, parentNodeId, nodeId);
firstNodeId = ret.first;
}
parentNodeId = nodeId;
if (childNodeId != 0)
{
addEdge(Edge::EDGE_MEMBER, ret.first, childNodeId);
}
if (!ret.second)
{
return firstNodeId;
}
childNodeId = ret.first;
}
return parentNodeId;
return firstNodeId;
}
Id ParserClientImpl::addFileName(const FilePath& filePath)
+3 -3
View File
@@ -102,7 +102,7 @@ void IntermediateStorage::setFilesWithErrorsIncomplete()
}
}
Id IntermediateStorage::addNode(const StorageNodeData& nodeData)
std::pair<Id, bool> IntermediateStorage::addNode(const StorageNodeData& nodeData)
{
auto it = m_nodesIndex.find(nodeData);
if (it != m_nodesIndex.end())
@@ -112,13 +112,13 @@ Id IntermediateStorage::addNode(const StorageNodeData& nodeData)
{
storedNode.type = nodeData.type;
}
return storedNode.id;
return std::make_pair(storedNode.id, false);
}
Id nodeId = m_nextId++;
m_nodes.emplace_back(nodeId, nodeData);
m_nodesIndex.emplace(nodeData, m_nodes.size() - 1);
return nodeId;
return std::make_pair(nodeId, true);
}
void IntermediateStorage::addSymbol(const StorageSymbol& symbol)
+1 -1
View File
@@ -30,7 +30,7 @@ public:
void setAllFilesIncomplete();
void setFilesWithErrorsIncomplete();
Id addNode(const StorageNodeData& nodeData) override;
std::pair<Id, bool> addNode(const StorageNodeData& nodeData) override;
void addSymbol(const StorageSymbol& symbol) override;
void addFile(const StorageFile& file) override;
Id addEdge(const StorageEdgeData& edgeData) override;
+2 -2
View File
@@ -46,9 +46,9 @@ PersistentStorage::PersistentStorage(const FilePath& dbPath, const FilePath& boo
m_commandIndex.finishSetup();
}
Id PersistentStorage::addNode(const StorageNodeData& data)
std::pair<Id, bool> PersistentStorage::addNode(const StorageNodeData& data)
{
return m_sqliteIndexStorage.addNode(data).id;
return std::make_pair(m_sqliteIndexStorage.addNode(data).id, true);
}
void PersistentStorage::addSymbol(const StorageSymbol& data)
+1 -1
View File
@@ -19,7 +19,7 @@ class PersistentStorage
public:
PersistentStorage(const FilePath& dbPath, const FilePath& bookmarkPath);
Id addNode(const StorageNodeData& data) override;
std::pair<Id, bool> addNode(const StorageNodeData& data) override;
void addSymbol(const StorageSymbol& data) override;
void addFile(const StorageFile& data) override;
Id addEdge(const StorageEdgeData& data) override;
+1 -1
View File
@@ -37,7 +37,7 @@ void Storage::inject(Storage* injected)
injected->forEachNode(
[&](const StorageNode& injectedData)
{
const Id ownId = addNode(injectedData);
const Id ownId = addNode(injectedData).first;
if (ownId != 0)
{
injectedIdToOwnElementId[injectedData.id] = ownId;
+1 -1
View File
@@ -23,7 +23,7 @@ public:
Storage();
virtual ~Storage() = default;
virtual Id addNode(const StorageNodeData& data) = 0;
virtual std::pair<Id, bool> addNode(const StorageNodeData& data) = 0;
virtual void addSymbol(const StorageSymbol& data) = 0;
virtual void addFile(const StorageFile& data) = 0;
virtual Id addEdge(const StorageEdgeData& data) = 0;