From 83f41e04b17f3b072c791bd4d1511ee90dbe168d Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Tue, 25 Sep 2018 00:52:09 +0200 Subject: [PATCH] data: start adding node name hierarchy from bottom and stop when a name was already added --- src/lib/data/parser/ParserClientImpl.cpp | 25 ++++++++++++++------ src/lib/data/storage/IntermediateStorage.cpp | 6 ++--- src/lib/data/storage/IntermediateStorage.h | 2 +- src/lib/data/storage/PersistentStorage.cpp | 4 ++-- src/lib/data/storage/PersistentStorage.h | 2 +- src/lib/data/storage/Storage.cpp | 2 +- src/lib/data/storage/Storage.h | 2 +- src/test/RefreshInfoGeneratorTestSuite.h | 2 +- src/test/StorageTestSuite.h | 6 ++--- 9 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/lib/data/parser/ParserClientImpl.cpp b/src/lib/data/parser/ParserClientImpl.cpp index a6f13704..fa6ec1a6 100644 --- a/src/lib/data/parser/ParserClientImpl.cpp +++ b/src/lib/data/parser/ParserClientImpl.cpp @@ -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 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) diff --git a/src/lib/data/storage/IntermediateStorage.cpp b/src/lib/data/storage/IntermediateStorage.cpp index 2f377340..061ab7dd 100644 --- a/src/lib/data/storage/IntermediateStorage.cpp +++ b/src/lib/data/storage/IntermediateStorage.cpp @@ -102,7 +102,7 @@ void IntermediateStorage::setFilesWithErrorsIncomplete() } } -Id IntermediateStorage::addNode(const StorageNodeData& nodeData) +std::pair 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) diff --git a/src/lib/data/storage/IntermediateStorage.h b/src/lib/data/storage/IntermediateStorage.h index 4ec83e56..c56df745 100644 --- a/src/lib/data/storage/IntermediateStorage.h +++ b/src/lib/data/storage/IntermediateStorage.h @@ -30,7 +30,7 @@ public: void setAllFilesIncomplete(); void setFilesWithErrorsIncomplete(); - Id addNode(const StorageNodeData& nodeData) override; + std::pair addNode(const StorageNodeData& nodeData) override; void addSymbol(const StorageSymbol& symbol) override; void addFile(const StorageFile& file) override; Id addEdge(const StorageEdgeData& edgeData) override; diff --git a/src/lib/data/storage/PersistentStorage.cpp b/src/lib/data/storage/PersistentStorage.cpp index 67b4fcac..0b9813e9 100644 --- a/src/lib/data/storage/PersistentStorage.cpp +++ b/src/lib/data/storage/PersistentStorage.cpp @@ -46,9 +46,9 @@ PersistentStorage::PersistentStorage(const FilePath& dbPath, const FilePath& boo m_commandIndex.finishSetup(); } -Id PersistentStorage::addNode(const StorageNodeData& data) +std::pair 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) diff --git a/src/lib/data/storage/PersistentStorage.h b/src/lib/data/storage/PersistentStorage.h index d027607c..c33d237c 100644 --- a/src/lib/data/storage/PersistentStorage.h +++ b/src/lib/data/storage/PersistentStorage.h @@ -19,7 +19,7 @@ class PersistentStorage public: PersistentStorage(const FilePath& dbPath, const FilePath& bookmarkPath); - Id addNode(const StorageNodeData& data) override; + std::pair addNode(const StorageNodeData& data) override; void addSymbol(const StorageSymbol& data) override; void addFile(const StorageFile& data) override; Id addEdge(const StorageEdgeData& data) override; diff --git a/src/lib/data/storage/Storage.cpp b/src/lib/data/storage/Storage.cpp index b2a7b271..7a36d8eb 100644 --- a/src/lib/data/storage/Storage.cpp +++ b/src/lib/data/storage/Storage.cpp @@ -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; diff --git a/src/lib/data/storage/Storage.h b/src/lib/data/storage/Storage.h index 13236fb2..8632080e 100644 --- a/src/lib/data/storage/Storage.h +++ b/src/lib/data/storage/Storage.h @@ -23,7 +23,7 @@ public: Storage(); virtual ~Storage() = default; - virtual Id addNode(const StorageNodeData& data) = 0; + virtual std::pair 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; diff --git a/src/test/RefreshInfoGeneratorTestSuite.h b/src/test/RefreshInfoGeneratorTestSuite.h index 6574f370..624d6c5d 100644 --- a/src/test/RefreshInfoGeneratorTestSuite.h +++ b/src/test/RefreshInfoGeneratorTestSuite.h @@ -906,7 +906,7 @@ private: Id addFileToStorage(const FilePath& filePath, const std::string& modificationTime, bool indexed, bool complete, std::shared_ptr storage) { - const Id id = storage->addNode(StorageNodeData(NodeType::NODE_FILE, NameHierarchy::serialize(NameHierarchy(filePath.wstr(), NAME_DELIMITER_FILE)))); + const Id id = storage->addNode(StorageNodeData(NodeType::NODE_FILE, NameHierarchy::serialize(NameHierarchy(filePath.wstr(), NAME_DELIMITER_FILE)))).first; storage->addFile(StorageFile(id, filePath.wstr(), modificationTime, indexed, complete)); return id; } diff --git a/src/test/StorageTestSuite.h b/src/test/StorageTestSuite.h index 54e21cbf..bbc9522b 100644 --- a/src/test/StorageTestSuite.h +++ b/src/test/StorageTestSuite.h @@ -21,7 +21,7 @@ public: std::wstring filePath = L"path/to/test.h"; std::shared_ptr intermetiateStorage = std::make_shared(); - Id id = intermetiateStorage->addNode(StorageNodeData(NodeType::typeToInt(NodeType::NODE_FILE), NameHierarchy::serialize(NameHierarchy(filePath, NAME_DELIMITER_FILE)))); + Id id = intermetiateStorage->addNode(StorageNodeData(NodeType::typeToInt(NodeType::NODE_FILE), NameHierarchy::serialize(NameHierarchy(filePath, NAME_DELIMITER_FILE)))).first; intermetiateStorage->addFile(StorageFile(id, filePath, "someTime", true, true)); storage.inject(intermetiateStorage.get()); @@ -57,10 +57,10 @@ public: std::shared_ptr intermetiateStorage = std::make_shared(); - Id aId = intermetiateStorage->addNode(StorageNodeData(NodeType::typeToInt(NodeType::NODE_STRUCT), NameHierarchy::serialize(a))); + Id aId = intermetiateStorage->addNode(StorageNodeData(NodeType::typeToInt(NodeType::NODE_STRUCT), NameHierarchy::serialize(a))).first; intermetiateStorage->addSymbol(StorageSymbol(aId, DEFINITION_EXPLICIT)); - Id bId = intermetiateStorage->addNode(StorageNodeData(NodeType::typeToInt(NodeType::NODE_FIELD), NameHierarchy::serialize(b))); + Id bId = intermetiateStorage->addNode(StorageNodeData(NodeType::typeToInt(NodeType::NODE_FIELD), NameHierarchy::serialize(b))).first; intermetiateStorage->addSymbol(StorageSymbol(bId, DEFINITION_EXPLICIT)); intermetiateStorage->addEdge(StorageEdgeData(Edge::typeToInt(Edge::EDGE_MEMBER), aId, bId));