From f82da323b322596c6b05e8187b2a8061bc2d09ec Mon Sep 17 00:00:00 2001 From: malte_langkabel Date: Mon, 14 Mar 2016 12:32:01 +0100 Subject: [PATCH] data: increased project load and codeview performance * rewrote searchnode to use map * added local cache for parent node ids when creating the Hierarchy Cache. * added indices to SqliteStorage to increase code view performance. --- src/lib/CMakeLists.txt | 2 + .../component/controller/CodeController.cpp | 4 +- src/lib/data/SqliteIndex.cpp | 25 +++++++++ src/lib/data/SqliteIndex.h | 21 ++++++++ src/lib/data/SqliteStorage.cpp | 4 ++ src/lib/data/Storage.cpp | 6 ++- src/lib/data/search/SearchNode.cpp | 51 +++++++++---------- src/lib/data/search/SearchNode.h | 4 +- 8 files changed, 85 insertions(+), 32 deletions(-) create mode 100644 src/lib/data/SqliteIndex.cpp create mode 100644 src/lib/data/SqliteIndex.h diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 37e80e20..8f7f47eb 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -159,6 +159,8 @@ add_files( data/HierarchyCache.h data/IntermediateStorage.cpp data/IntermediateStorage.h + data/SqliteIndex.cpp + data/SqliteIndex.h data/SqliteStorage.cpp data/SqliteStorage.h data/Storage.cpp diff --git a/src/lib/component/controller/CodeController.cpp b/src/lib/component/controller/CodeController.cpp index d07847ae..660301f6 100644 --- a/src/lib/component/controller/CodeController.cpp +++ b/src/lib/component/controller/CodeController.cpp @@ -556,8 +556,8 @@ std::shared_ptr CodeController::getTokenLocationOfParentScope } std::vector CodeController::getSnippetsForErrorLocations( - std::vector* errorMessages) -const { + std::vector* errorMessages) const +{ TokenLocationCollection errorCollection = m_storageAccess->getErrorTokenLocations(errorMessages); std::vector snippets; diff --git a/src/lib/data/SqliteIndex.cpp b/src/lib/data/SqliteIndex.cpp new file mode 100644 index 00000000..d95e3ef7 --- /dev/null +++ b/src/lib/data/SqliteIndex.cpp @@ -0,0 +1,25 @@ +#include "data/SqliteIndex.h" + +SqliteIndex::SqliteIndex(const std::string& indexName, const std::string& indexTarget) + : m_indexName(indexName) + , m_indexTarget(indexTarget) +{ +} + +SqliteIndex::~SqliteIndex() +{ +} + +void SqliteIndex::createOnDatabase(CppSQLite3DB& database) +{ + database.execDML(( + "CREATE INDEX IF NOT EXISTS " + m_indexName + " ON " + m_indexTarget + ";" + ).c_str()); +} + +void SqliteIndex::removeFromDatabase(CppSQLite3DB& database) +{ + database.execDML(( + "DROP INDEX IF EXISTS main." + m_indexName + ";" + ).c_str()); +} diff --git a/src/lib/data/SqliteIndex.h b/src/lib/data/SqliteIndex.h new file mode 100644 index 00000000..68dac7c9 --- /dev/null +++ b/src/lib/data/SqliteIndex.h @@ -0,0 +1,21 @@ +#ifndef SQLITE_INDEX_H +#define SQLITE_INDEX_H + +#include +#include "sqlite/CppSQLite3.h" + +class SqliteIndex +{ +public: + SqliteIndex(const std::string& indexName, const std::string& indexTarget); + ~SqliteIndex(); + + void createOnDatabase(CppSQLite3DB& database); + void removeFromDatabase(CppSQLite3DB& database); + +private: + std::string m_indexName; + std::string m_indexTarget; +}; + +#endif // SQLITE_INDEX_H diff --git a/src/lib/data/SqliteStorage.cpp b/src/lib/data/SqliteStorage.cpp index 2b202570..31ab3ffc 100644 --- a/src/lib/data/SqliteStorage.cpp +++ b/src/lib/data/SqliteStorage.cpp @@ -2,6 +2,7 @@ #include "data/graph/Node.h" #include "data/location/TokenLocation.h" +#include "data/SqliteIndex.h" #include "utility/logging/logging.h" #include "utility/text/TextAccess.h" #include "utility/utility.h" @@ -783,6 +784,9 @@ void SqliteStorage::setupTables() "FOREIGN KEY(file_node_id) REFERENCES node(id) ON DELETE CASCADE);" ); + SqliteIndex("source_location_element_id_index", "source_location(element_id)").createOnDatabase(m_database); + SqliteIndex("source_location_file_node_id_index", "source_location(file_node_id)").createOnDatabase(m_database); + m_database.execDML( "CREATE TABLE IF NOT EXISTS component_access(" "id INTEGER NOT NULL, " diff --git a/src/lib/data/Storage.cpp b/src/lib/data/Storage.cpp index e9b6b9d2..7e22d5d1 100644 --- a/src/lib/data/Storage.cpp +++ b/src/lib/data/Storage.cpp @@ -1083,9 +1083,13 @@ void Storage::buildHierarchyCache() { std::vector memberEdges = m_sqliteStorage.getEdgesByType(Edge::typeToInt(Edge::EDGE_MEMBER)); + Cache nodeTypeCache([this](Id id){ + return Node::intToType(m_sqliteStorage.getNodeById(id).type); + }); + for (const StorageEdge& edge : memberEdges) { - bool isVisible = !(Node::intToType(m_sqliteStorage.getNodeById(edge.sourceNodeId).type) & Node::NODE_NOT_VISIBLE); + bool isVisible = !(nodeTypeCache.getValue(edge.sourceNodeId) & Node::NODE_NOT_VISIBLE); m_hierarchyCache.createConnection(edge.id, edge.sourceNodeId, edge.targetNodeId, isVisible); } } diff --git a/src/lib/data/search/SearchNode.cpp b/src/lib/data/search/SearchNode.cpp index 2b396d5c..21357d87 100644 --- a/src/lib/data/search/SearchNode.cpp +++ b/src/lib/data/search/SearchNode.cpp @@ -24,9 +24,9 @@ size_t SearchNode::getNodeCount() const { size_t count = 1; - for (std::shared_ptr n: m_nodes) + for (const std::pair>& p : m_nodes) { - count += n->getNodeCount(); + count += p.second->getNodeCount(); } return count; @@ -104,9 +104,9 @@ bool SearchNode::hasTokenIdsRecursive() const return true; } - for (std::shared_ptr n: m_nodes) + for (const std::pair>& p : m_nodes) { - if (n->hasTokenIdsRecursive()) + if (p.second->hasTokenIdsRecursive()) { return true; } @@ -148,7 +148,7 @@ std::deque SearchNode::getParentsWithoutTokenId() return nodes; } -const std::set>& SearchNode::getChildren() const +const std::map>& SearchNode::getChildren() const { return m_nodes; } @@ -157,12 +157,12 @@ SearchResults SearchNode::runFuzzySearch(const std::string& query) const { SearchResults result; - for (std::shared_ptr n: m_nodes) + for (const std::pair>& p : m_nodes) { - FuzzyMap m = n->fuzzyMatchRecursive(query, 0, 0, 0); - for (const std::pair& p : m) + FuzzyMap m = p.second->fuzzyMatchRecursive(query, 0, 0, 0); + for (const std::pair& p2 : m) { - addResultsRecursive(&result, p.first, p.second, n.get()); + addResultsRecursive(&result, p2.first, p2.second, p.second.get()); } } @@ -208,9 +208,9 @@ void SearchNode::addResultsRecursive( ) const { results->insert(SearchResult(weight, node, parent)); - for (std::shared_ptr n: node->m_nodes) + for (const std::pair>& p : node->m_nodes) { - addResultsRecursive(results, weight, n.get(), parent); + addResultsRecursive(results, weight, p.second.get(), parent); } } @@ -224,7 +224,7 @@ std::shared_ptr SearchNode::addNodeRecursive( if (!node) { node = std::make_shared(this, dictionary.getWord(nameId), nameId); - m_nodes.insert(node); + m_nodes.emplace(nameId, node); } if (nameIds->size() > 0) @@ -256,13 +256,11 @@ std::shared_ptr SearchNode::getNodeRecursive(std::deque* nameIds void SearchNode::removeSearchNode(SearchNode* node) { - for (std::set>::iterator it = m_nodes.begin(); it != m_nodes.end(); it++) + std::map>::iterator it = m_nodes.find(node->getNameId()); + + if (it != m_nodes.end()) { - if ((*it)->m_nameId == node->m_nameId) - { - m_nodes.erase(it); - return; - } + m_nodes.erase(it); } } @@ -315,9 +313,9 @@ SearchNode::FuzzyMap SearchNode::fuzzyMatchRecursive( return result; } - for (std::shared_ptr n: m_nodes) + for (const std::pair>& p : m_nodes) { - FuzzyMap m = n->fuzzyMatchRecursive(query, pos, weight, size + m_name.size() + SearchIndex::DELIMITER.size()); + FuzzyMap m = p.second->fuzzyMatchRecursive(query, pos, weight, size + m_name.size() + SearchIndex::DELIMITER.size()); result.insert(m.begin(), m.end()); } @@ -413,12 +411,11 @@ std::pair SearchNode::fuzzyMatch( std::shared_ptr SearchNode::getChildWithNameId(Id nameId) const { - for (std::shared_ptr n: m_nodes) + std::map>::const_iterator it = m_nodes.find(nameId); + + if (it != m_nodes.end()) { - if (n->m_nameId == nameId) - { - return n; - } + return it->second; } return nullptr; @@ -449,9 +446,9 @@ std::ostream& operator<<(std::ostream& ostream, const SearchNode* node) ostream << '\n'; - for (const std::shared_ptr n : node->m_nodes) + for (const std::pair> p : node->m_nodes) { - ostream << n.get(); + ostream << p.second.get(); } return ostream; diff --git a/src/lib/data/search/SearchNode.h b/src/lib/data/search/SearchNode.h index 8ada0ce1..25f37f65 100644 --- a/src/lib/data/search/SearchNode.h +++ b/src/lib/data/search/SearchNode.h @@ -42,7 +42,7 @@ public: SearchNode* getParent() const; std::deque getParentsWithoutTokenId(); - const std::set>& getChildren() const; + const std::map>& getChildren() const; SearchResults runFuzzySearch(const std::string& query) const; SearchResults runFuzzySearchCached(const std::string& query, const SearchResults& searchResults) const; @@ -71,7 +71,7 @@ private: std::shared_ptr getChildWithNameId(Id nameId) const; std::deque getNodesToParent(const SearchNode* parent) const; - std::set> m_nodes; + std::map> m_nodes; SearchNode* m_parent; std::set m_tokenIds;