From 8c6ded28a850be2af4d2071e015fef330455abab Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Tue, 21 May 2019 17:56:50 +0200 Subject: [PATCH] data: Add StorageElementComponent to Storage injection --- .../indexer/TaskExecuteCustomCommands.cpp | 2 +- src/lib/data/storage/IntermediateStorage.cpp | 22 +++++++++- src/lib/data/storage/IntermediateStorage.h | 7 +++- src/lib/data/storage/PersistentStorage.cpp | 14 ++++++- src/lib/data/storage/PersistentStorage.h | 5 ++- src/lib/data/storage/Storage.cpp | 19 +++++++++ src/lib/data/storage/Storage.h | 4 ++ .../storage/sqlite/SqliteIndexStorage.cpp | 31 ++++++++------ .../data/storage/sqlite/SqliteIndexStorage.h | 3 +- .../storage/type/StorageElementComponent.h | 42 +++++++++---------- 10 files changed, 106 insertions(+), 43 deletions(-) diff --git a/src/lib/data/indexer/TaskExecuteCustomCommands.cpp b/src/lib/data/indexer/TaskExecuteCustomCommands.cpp index 8c2c00d6..245678e5 100644 --- a/src/lib/data/indexer/TaskExecuteCustomCommands.cpp +++ b/src/lib/data/indexer/TaskExecuteCustomCommands.cpp @@ -364,7 +364,7 @@ void TaskExecuteCustomCommands::runPythonPostProcessing(PersistentStorage& stora { for (size_t i = 0; i < ambiguousEdgeIds.size(); i++) { - storage.addElementComponent(StorageElementComponentData(ambiguousEdgeIds[i], elementComponentKindToInt(ElementComponentKind::IS_AMBIGUOUS), L"")); + storage.addElementComponent(StorageElementComponent(ambiguousEdgeIds[i], elementComponentKindToInt(ElementComponentKind::IS_AMBIGUOUS), L"")); storage.addOccurrence(StorageOccurrence(ambiguousEdgeIds[i], dataToInsert[i].sourceLocationId)); } diff --git a/src/lib/data/storage/IntermediateStorage.cpp b/src/lib/data/storage/IntermediateStorage.cpp index 328e960a..b6ce593f 100644 --- a/src/lib/data/storage/IntermediateStorage.cpp +++ b/src/lib/data/storage/IntermediateStorage.cpp @@ -197,7 +197,7 @@ void IntermediateStorage::addFile(const StorageFile& file) m_filesIdIndex.emplace(file.id, m_files.size()); m_files.emplace_back(file); } - + } void IntermediateStorage::setFileLanguage(Id fileId, const std::wstring& languageIdentifier) @@ -302,6 +302,16 @@ void IntermediateStorage::addComponentAccesses(const std::vector& components) +{ + m_elementComponents.insert(components.begin(), components.end()); +} + Id IntermediateStorage::addError(const StorageErrorData& errorData) { auto it = m_errorsIndex.find(errorData); @@ -356,6 +366,11 @@ const std::set& IntermediateStorage::getComponentAccesse return m_componentAccesses; } +const std::set& IntermediateStorage::getElementComponents() const +{ + return m_elementComponents; +} + const std::vector& IntermediateStorage::getErrors() const { return m_errors; @@ -423,6 +438,11 @@ void IntermediateStorage::setComponentAccesses(std::set m_componentAccesses = std::move(componentAccesses); } +void IntermediateStorage::setElementComponents(std::set components) +{ + m_elementComponents = std::move(components); +} + void IntermediateStorage::setErrors(std::vector errors) { m_errors = std::move(errors); diff --git a/src/lib/data/storage/IntermediateStorage.h b/src/lib/data/storage/IntermediateStorage.h index 1a882039..446d5bc2 100644 --- a/src/lib/data/storage/IntermediateStorage.h +++ b/src/lib/data/storage/IntermediateStorage.h @@ -39,6 +39,8 @@ public: void addOccurrences(const std::vector& occurrences) override; void addComponentAccess(const StorageComponentAccess& componentAccess) override; void addComponentAccesses(const std::vector& componentAccesses) override; + void addElementComponent(const StorageElementComponent& component) override; + void addElementComponents(const std::vector& components) override; Id addError(const StorageErrorData& errorData) override; const std::vector& getStorageNodes() const override; @@ -49,6 +51,7 @@ public: const std::set& getStorageSourceLocations() const override; const std::set& getStorageOccurrences() const override; const std::set& getComponentAccesses() const override; + const std::set& getElementComponents() const override; const std::vector& getErrors() const override; void setStorageNodes(std::vector storageNodes); @@ -59,6 +62,7 @@ public: void setStorageSourceLocations(std::set storageSourceLocations); void setStorageOccurrences(std::set storageOccurrences); void setComponentAccesses(std::set componentAccesses); + void setElementComponents(std::set components); void setErrors(std::vector errors); Id getNextId() const; @@ -72,7 +76,7 @@ private: std::map m_filesIndex; // this is used to prevent duplicates (unique) std::map m_filesIdIndex; std::vector m_files; - + std::vector m_symbols; std::map m_edgesIndex; @@ -85,6 +89,7 @@ private: std::set m_occurrences; std::set m_componentAccesses; + std::set m_elementComponents; std::map m_errorsIndex; // this is used to prevent duplicates (unique) std::vector m_errors; diff --git a/src/lib/data/storage/PersistentStorage.cpp b/src/lib/data/storage/PersistentStorage.cpp index e5f5b1dc..e7120dcc 100644 --- a/src/lib/data/storage/PersistentStorage.cpp +++ b/src/lib/data/storage/PersistentStorage.cpp @@ -140,9 +140,14 @@ void PersistentStorage::addComponentAccesses(const std::vector& components) +{ + m_sqliteIndexStorage.addElementComponents(components); } Id PersistentStorage::addError(const StorageErrorData& data) @@ -200,6 +205,11 @@ const std::set& PersistentStorage::getComponentAccesses( return m_storageData.accesses = utility::toSet(m_sqliteIndexStorage.getAll()); } +const std::set& PersistentStorage::getElementComponents() const +{ + return m_storageData.components = utility::toSet(m_sqliteIndexStorage.getAll()); +} + const std::vector& PersistentStorage::getErrors() const { std::vector errors; diff --git a/src/lib/data/storage/PersistentStorage.h b/src/lib/data/storage/PersistentStorage.h index dc6e344d..b8b88889 100644 --- a/src/lib/data/storage/PersistentStorage.h +++ b/src/lib/data/storage/PersistentStorage.h @@ -34,7 +34,8 @@ public: void addOccurrences(const std::vector& occurrences) override; void addComponentAccess(const StorageComponentAccess& componentAccess) override; void addComponentAccesses(const std::vector& componentAccesses) override; - void addElementComponent(const StorageElementComponentData& data) /*override*/; + void addElementComponent(const StorageElementComponent& component) override; + void addElementComponents(const std::vector& components) override; Id addError(const StorageErrorData& data) override; void removeElement(const Id id); @@ -48,6 +49,7 @@ public: const std::set& getStorageSourceLocations() const override; const std::set& getStorageOccurrences() const override; const std::set& getComponentAccesses() const override; + const std::set& getElementComponents() const override; const std::vector& getErrors() const override; void startInjection() override; @@ -172,6 +174,7 @@ private: std::set locations; std::set occurrences; std::set accesses; + std::set components; std::vector errors; } m_storageData; diff --git a/src/lib/data/storage/Storage.cpp b/src/lib/data/storage/Storage.cpp index 081d787f..4c3eb50b 100644 --- a/src/lib/data/storage/Storage.cpp +++ b/src/lib/data/storage/Storage.cpp @@ -236,6 +236,25 @@ void Storage::inject(Storage* injected) addOccurrences(occurrences); } + { + // TRACE("inject element components"); + + const std::set& oldComponents = injected->getElementComponents(); + std::vector components; + components.reserve(oldComponents.size()); + + for (const StorageElementComponent& component : oldComponents) + { + auto it = injectedIdToOwnElementId.find(component.elementId); + if (it != injectedIdToOwnElementId.end()) + { + components.emplace_back(it->second, component.type, component.data); + } + } + + addElementComponents(components); + } + { // TRACE("inject accesses"); diff --git a/src/lib/data/storage/Storage.h b/src/lib/data/storage/Storage.h index b14fc55d..20108c1d 100644 --- a/src/lib/data/storage/Storage.h +++ b/src/lib/data/storage/Storage.h @@ -9,6 +9,7 @@ #include "StorageComponentAccess.h" #include "StorageEdge.h" #include "StorageError.h" +#include "StorageElementComponent.h" #include "StorageFile.h" #include "StorageLocalSymbol.h" #include "StorageNode.h" @@ -38,6 +39,8 @@ public: virtual void addOccurrences(const std::vector& occurrences) = 0; virtual void addComponentAccess(const StorageComponentAccess& componentAccess) = 0; virtual void addComponentAccesses(const std::vector& componentAccesses) = 0; + virtual void addElementComponent(const StorageElementComponent& component) = 0; + virtual void addElementComponents(const std::vector& components) = 0; virtual Id addError(const StorageErrorData& data) = 0; virtual const std::vector& getStorageNodes() const = 0; @@ -48,6 +51,7 @@ public: virtual const std::set& getStorageSourceLocations() const = 0; virtual const std::set& getStorageOccurrences() const = 0; virtual const std::set& getComponentAccesses() const = 0; + virtual const std::set& getElementComponents() const = 0; virtual const std::vector& getErrors() const = 0; void inject(Storage* injected); diff --git a/src/lib/data/storage/sqlite/SqliteIndexStorage.cpp b/src/lib/data/storage/sqlite/SqliteIndexStorage.cpp index b176500c..a4283cde 100644 --- a/src/lib/data/storage/sqlite/SqliteIndexStorage.cpp +++ b/src/lib/data/storage/sqlite/SqliteIndexStorage.cpp @@ -408,15 +408,21 @@ bool SqliteIndexStorage::addComponentAccesses(const std::vector& components) +{ + for (const StorageElementComponent& component : components) + { + addElementComponent(component); + } } StorageError SqliteIndexStorage::addError(const StorageErrorData& data) @@ -1545,20 +1551,19 @@ template <> void SqliteIndexStorage::forEach(const std::string& query, std::function func) const { CppSQLite3Query q = executeQuery( - "SELECT id, element_id, type, data FROM element_component " + query + ";" + "SELECT element_id, type, data FROM element_component " + query + ";" ); while (!q.eof()) { - const Id id = q.getIntField(0, 0); - const Id elementId = q.getIntField(1, 0); - const int type = q.getIntField(2, -1); - const std::string data = q.getStringField(3, ""); + const Id elementId = q.getIntField(0, 0); + const int type = q.getIntField(1, -1); + const std::string data = q.getStringField(2, ""); - if (id != 0 && elementId != 0 && type != -1) + if (elementId != 0 && type != -1) { func(StorageElementComponent( - id, elementId, type, utility::decodeFromUtf8(data) + elementId, type, utility::decodeFromUtf8(data) )); } diff --git a/src/lib/data/storage/sqlite/SqliteIndexStorage.h b/src/lib/data/storage/sqlite/SqliteIndexStorage.h index ee747776..8b5c7053 100644 --- a/src/lib/data/storage/sqlite/SqliteIndexStorage.h +++ b/src/lib/data/storage/sqlite/SqliteIndexStorage.h @@ -66,7 +66,8 @@ public: bool addOccurrences(const std::vector& occurrences); bool addComponentAccess(const StorageComponentAccess& componentAccess); bool addComponentAccesses(const std::vector& componentAccesses); - int addElementComponent(const StorageElementComponentData& storageElementComponentData); + void addElementComponent(const StorageElementComponent& component); + void addElementComponents(const std::vector& components); StorageError addError(const StorageErrorData& data); void removeElement(Id id); diff --git a/src/lib/data/storage/type/StorageElementComponent.h b/src/lib/data/storage/type/StorageElementComponent.h index aed6bfff..f3ea4491 100644 --- a/src/lib/data/storage/type/StorageElementComponent.h +++ b/src/lib/data/storage/type/StorageElementComponent.h @@ -5,43 +5,39 @@ #include "types.h" -struct StorageElementComponentData +struct StorageElementComponent { - StorageElementComponentData() + StorageElementComponent() : elementId(0) , type(0) , data(L"") {} - StorageElementComponentData(Id elementId, int type, std::wstring data) + StorageElementComponent(Id elementId, int type, std::wstring data) : elementId(elementId) , type(type) , data(std::move(data)) {} + bool operator<(const StorageElementComponent& other) const + { + if (elementId != other.elementId) + { + return elementId < other.elementId; + } + else if (type != other.type) + { + return type < other.type; + } + else + { + return data < other.data; + } + } + Id elementId; int type; std::wstring data; }; -struct StorageElementComponent : public StorageElementComponentData -{ - StorageElementComponent() - : StorageElementComponentData() - , id(0) - {} - - StorageElementComponent(Id id, const StorageElementComponentData& data) - : StorageElementComponentData(data) - , id(id) - {} - - StorageElementComponent(Id id, Id elementId, int type, std::wstring data) - : StorageElementComponentData(elementId, type, data) - , id(id) - {} - - Id id; -}; - #endif // STORAGE_ELEMENT_COMPONENT_H