data: start adding node name hierarchy from bottom and stop when a name was already added
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user