logic: improved performance of storing index to the database
* batch inject occurrences * removed unnecessary destructor and keywords from storages
This commit is contained in:
@@ -7,10 +7,6 @@ IntermediateStorage::IntermediateStorage()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
IntermediateStorage::~IntermediateStorage()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void IntermediateStorage::clear()
|
void IntermediateStorage::clear()
|
||||||
{
|
{
|
||||||
m_nodes.clear();
|
m_nodes.clear();
|
||||||
@@ -205,6 +201,14 @@ void IntermediateStorage::addOccurrence(const StorageOccurrence& occurrence)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IntermediateStorage::addOccurrences(const std::vector<StorageOccurrence>& occurrences)
|
||||||
|
{
|
||||||
|
for (const StorageOccurrence& occurrence : occurrences)
|
||||||
|
{
|
||||||
|
addOccurrence(occurrence);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void IntermediateStorage::addComponentAccess(const StorageComponentAccessData& componentAccessData)
|
void IntermediateStorage::addComponentAccess(const StorageComponentAccessData& componentAccessData)
|
||||||
{
|
{
|
||||||
const std::wstring serialized = serialize(componentAccessData);
|
const std::wstring serialized = serialize(componentAccessData);
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ class IntermediateStorage: public Storage
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
IntermediateStorage();
|
IntermediateStorage();
|
||||||
virtual ~IntermediateStorage();
|
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
@@ -32,28 +31,28 @@ public:
|
|||||||
void setAllFilesIncomplete();
|
void setAllFilesIncomplete();
|
||||||
void setFilesWithErrorsIncomplete();
|
void setFilesWithErrorsIncomplete();
|
||||||
|
|
||||||
virtual Id addNode(const StorageNodeData& nodeData) override;
|
Id addNode(const StorageNodeData& nodeData) override;
|
||||||
virtual void addSymbol(const StorageSymbol& symbol) override;
|
void addSymbol(const StorageSymbol& symbol) override;
|
||||||
virtual void addFile(const StorageFile& file) override;
|
void addFile(const StorageFile& file) override;
|
||||||
virtual Id addEdge(const StorageEdgeData& edgeData) override;
|
Id addEdge(const StorageEdgeData& edgeData) override;
|
||||||
virtual Id addLocalSymbol(const StorageLocalSymbolData& localSymbolData) override;
|
Id addLocalSymbol(const StorageLocalSymbolData& localSymbolData) override;
|
||||||
virtual Id addSourceLocation(const StorageSourceLocationData& sourceLocationData) override;
|
Id addSourceLocation(const StorageSourceLocationData& sourceLocationData) override;
|
||||||
virtual void addOccurrence(const StorageOccurrence& occurrence) override;
|
void addOccurrence(const StorageOccurrence& occurrence) override;
|
||||||
virtual void addComponentAccess(const StorageComponentAccessData& componentAccessData) override;
|
void addOccurrences(const std::vector<StorageOccurrence>& occurrences) override;
|
||||||
virtual void addCommentLocation(const StorageCommentLocationData& commentLocationData) override;
|
void addComponentAccess(const StorageComponentAccessData& componentAccessData) override;
|
||||||
virtual void addError(const StorageErrorData& errorData) override;
|
void addCommentLocation(const StorageCommentLocationData& commentLocationData) override;
|
||||||
|
void addError(const StorageErrorData& errorData) override;
|
||||||
virtual void forEachNode(std::function<void(const StorageNode& /*data*/)> callback) const override;
|
|
||||||
virtual void forEachFile(std::function<void(const StorageFile& /*data*/)> callback) const override;
|
|
||||||
virtual void forEachSymbol(std::function<void(const StorageSymbol& /*data*/)> callback) const override;
|
|
||||||
virtual void forEachEdge(std::function<void(const StorageEdge& /*data*/)> callback) const override;
|
|
||||||
virtual void forEachLocalSymbol(std::function<void(const StorageLocalSymbol& /*data*/)> callback) const override;
|
|
||||||
virtual void forEachSourceLocation(std::function<void(const StorageSourceLocation& /*data*/)> callback) const override;
|
|
||||||
virtual void forEachOccurrence(std::function<void(const StorageOccurrence& /*data*/)> callback) const override;
|
|
||||||
virtual void forEachComponentAccess(std::function<void(const StorageComponentAccessData& /*data*/)> callback) const override;
|
|
||||||
virtual void forEachCommentLocation(std::function<void(const StorageCommentLocationData& /*data*/)> callback) const override;
|
|
||||||
virtual void forEachError(std::function<void(const StorageErrorData& /*data*/)> callback) const override;
|
|
||||||
|
|
||||||
|
void forEachNode(std::function<void(const StorageNode& /*data*/)> callback) const override;
|
||||||
|
void forEachFile(std::function<void(const StorageFile& /*data*/)> callback) const override;
|
||||||
|
void forEachSymbol(std::function<void(const StorageSymbol& /*data*/)> callback) const override;
|
||||||
|
void forEachEdge(std::function<void(const StorageEdge& /*data*/)> callback) const override;
|
||||||
|
void forEachLocalSymbol(std::function<void(const StorageLocalSymbol& /*data*/)> callback) const override;
|
||||||
|
void forEachSourceLocation(std::function<void(const StorageSourceLocation& /*data*/)> callback) const override;
|
||||||
|
void forEachOccurrence(std::function<void(const StorageOccurrence& /*data*/)> callback) const override;
|
||||||
|
void forEachComponentAccess(std::function<void(const StorageComponentAccessData& /*data*/)> callback) const override;
|
||||||
|
void forEachCommentLocation(std::function<void(const StorageCommentLocationData& /*data*/)> callback) const override;
|
||||||
|
void forEachError(std::function<void(const StorageErrorData& /*data*/)> callback) const override;
|
||||||
|
|
||||||
// for conversion to and from 'SharedIntermediateStorage'
|
// for conversion to and from 'SharedIntermediateStorage'
|
||||||
|
|
||||||
|
|||||||
@@ -46,10 +46,6 @@ PersistentStorage::PersistentStorage(const FilePath& dbPath, const FilePath& boo
|
|||||||
m_commandIndex.finishSetup();
|
m_commandIndex.finishSetup();
|
||||||
}
|
}
|
||||||
|
|
||||||
PersistentStorage::~PersistentStorage()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
Id PersistentStorage::addNode(const StorageNodeData& data)
|
Id PersistentStorage::addNode(const StorageNodeData& data)
|
||||||
{
|
{
|
||||||
const StorageNode storedNode = m_sqliteIndexStorage.getNodeBySerializedName(data.serializedName);
|
const StorageNode storedNode = m_sqliteIndexStorage.getNodeBySerializedName(data.serializedName);
|
||||||
@@ -128,6 +124,11 @@ void PersistentStorage::addOccurrence(const StorageOccurrence& data)
|
|||||||
m_sqliteIndexStorage.addOccurrence(data);
|
m_sqliteIndexStorage.addOccurrence(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PersistentStorage::addOccurrences(const std::vector<StorageOccurrence>& occurrences)
|
||||||
|
{
|
||||||
|
m_sqliteIndexStorage.addOccurrences(occurrences);
|
||||||
|
}
|
||||||
|
|
||||||
void PersistentStorage::addComponentAccess(const StorageComponentAccessData& data)
|
void PersistentStorage::addComponentAccess(const StorageComponentAccessData& data)
|
||||||
{
|
{
|
||||||
m_sqliteIndexStorage.addComponentAccess(data);
|
m_sqliteIndexStorage.addComponentAccess(data);
|
||||||
|
|||||||
@@ -18,32 +18,32 @@ class PersistentStorage
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PersistentStorage(const FilePath& dbPath, const FilePath& bookmarkPath);
|
PersistentStorage(const FilePath& dbPath, const FilePath& bookmarkPath);
|
||||||
virtual ~PersistentStorage();
|
|
||||||
|
|
||||||
virtual Id addNode(const StorageNodeData& data) override;
|
Id addNode(const StorageNodeData& data) override;
|
||||||
virtual void addSymbol(const StorageSymbol& data) override;
|
void addSymbol(const StorageSymbol& data) override;
|
||||||
virtual void addFile(const StorageFile& data) override;
|
void addFile(const StorageFile& data) override;
|
||||||
virtual Id addEdge(const StorageEdgeData& data) override;
|
Id addEdge(const StorageEdgeData& data) override;
|
||||||
virtual Id addLocalSymbol(const StorageLocalSymbolData& data) override;
|
Id addLocalSymbol(const StorageLocalSymbolData& data) override;
|
||||||
virtual Id addSourceLocation(const StorageSourceLocationData& data) override;
|
Id addSourceLocation(const StorageSourceLocationData& data) override;
|
||||||
virtual void addOccurrence(const StorageOccurrence& data) override;
|
void addOccurrence(const StorageOccurrence& data) override;
|
||||||
virtual void addComponentAccess(const StorageComponentAccessData& data) override;
|
void addOccurrences(const std::vector<StorageOccurrence>& occurrences) override;
|
||||||
virtual void addCommentLocation(const StorageCommentLocationData& data) override;
|
void addComponentAccess(const StorageComponentAccessData& data) override;
|
||||||
virtual void addError(const StorageErrorData& data) override;
|
void addCommentLocation(const StorageCommentLocationData& data) override;
|
||||||
|
void addError(const StorageErrorData& data) override;
|
||||||
|
|
||||||
virtual void forEachNode(std::function<void(const StorageNode& /*data*/)> callback) const override;
|
void forEachNode(std::function<void(const StorageNode& /*data*/)> callback) const override;
|
||||||
virtual void forEachFile(std::function<void(const StorageFile& /*data*/)> callback) const override;
|
void forEachFile(std::function<void(const StorageFile& /*data*/)> callback) const override;
|
||||||
virtual void forEachSymbol(std::function<void(const StorageSymbol& /*data*/)> callback) const override;
|
void forEachSymbol(std::function<void(const StorageSymbol& /*data*/)> callback) const override;
|
||||||
virtual void forEachEdge(std::function<void(const StorageEdge& /*data*/)> callback) const override;
|
void forEachEdge(std::function<void(const StorageEdge& /*data*/)> callback) const override;
|
||||||
virtual void forEachLocalSymbol(std::function<void(const StorageLocalSymbol& /*data*/)> callback) const override;
|
void forEachLocalSymbol(std::function<void(const StorageLocalSymbol& /*data*/)> callback) const override;
|
||||||
virtual void forEachSourceLocation(std::function<void(const StorageSourceLocation& /*data*/)> callback) const override;
|
void forEachSourceLocation(std::function<void(const StorageSourceLocation& /*data*/)> callback) const override;
|
||||||
virtual void forEachOccurrence(std::function<void(const StorageOccurrence& /*data*/)> callback) const override;
|
void forEachOccurrence(std::function<void(const StorageOccurrence& /*data*/)> callback) const override;
|
||||||
virtual void forEachComponentAccess(std::function<void(const StorageComponentAccessData& /*data*/)> callback) const override;
|
void forEachComponentAccess(std::function<void(const StorageComponentAccessData& /*data*/)> callback) const override;
|
||||||
virtual void forEachCommentLocation(std::function<void(const StorageCommentLocationData& /*data*/)> callback) const override;
|
void forEachCommentLocation(std::function<void(const StorageCommentLocationData& /*data*/)> callback) const override;
|
||||||
virtual void forEachError(std::function<void(const StorageErrorData& /*data*/)> callback) const override;
|
void forEachError(std::function<void(const StorageErrorData& /*data*/)> callback) const override;
|
||||||
|
|
||||||
virtual void startInjection() override;
|
void startInjection() override;
|
||||||
virtual void finishInjection() override;
|
void finishInjection() override;
|
||||||
|
|
||||||
void setMode(const SqliteIndexStorage::StorageModeType mode);
|
void setMode(const SqliteIndexStorage::StorageModeType mode);
|
||||||
|
|
||||||
@@ -75,82 +75,82 @@ public:
|
|||||||
void optimizeMemory();
|
void optimizeMemory();
|
||||||
|
|
||||||
// StorageAccess implementation
|
// StorageAccess implementation
|
||||||
virtual Id getNodeIdForFileNode(const FilePath& filePath) const override;
|
Id getNodeIdForFileNode(const FilePath& filePath) const override;
|
||||||
virtual Id getNodeIdForNameHierarchy(const NameHierarchy& nameHierarchy) const override;
|
Id getNodeIdForNameHierarchy(const NameHierarchy& nameHierarchy) const override;
|
||||||
virtual std::vector<Id> getNodeIdsForNameHierarchies(const std::vector<NameHierarchy> nameHierarchies) const override;
|
std::vector<Id> getNodeIdsForNameHierarchies(const std::vector<NameHierarchy> nameHierarchies) const override;
|
||||||
|
|
||||||
virtual NameHierarchy getNameHierarchyForNodeId(Id nodeId) const override;
|
NameHierarchy getNameHierarchyForNodeId(Id nodeId) const override;
|
||||||
virtual std::vector<NameHierarchy> getNameHierarchiesForNodeIds(const std::vector<Id>& nodeIds) const override;
|
std::vector<NameHierarchy> getNameHierarchiesForNodeIds(const std::vector<Id>& nodeIds) const override;
|
||||||
virtual std::map<Id, std::pair<Id, NameHierarchy>> getNodeIdToParentFileMap(const std::vector<Id>& nodeIds) const override;
|
std::map<Id, std::pair<Id, NameHierarchy>> getNodeIdToParentFileMap(const std::vector<Id>& nodeIds) const override;
|
||||||
|
|
||||||
virtual NodeType getNodeTypeForNodeWithId(Id nodeId) const override;
|
NodeType getNodeTypeForNodeWithId(Id nodeId) const override;
|
||||||
|
|
||||||
virtual Id getIdForEdge(
|
Id getIdForEdge(
|
||||||
Edge::EdgeType type, const NameHierarchy& fromNameHierarchy, const NameHierarchy& toNameHierarchy) const override;
|
Edge::EdgeType type, const NameHierarchy& fromNameHierarchy, const NameHierarchy& toNameHierarchy) const override;
|
||||||
virtual StorageEdge getEdgeById(Id edgeId) const override;
|
StorageEdge getEdgeById(Id edgeId) const override;
|
||||||
|
|
||||||
virtual std::shared_ptr<SourceLocationCollection> getFullTextSearchLocations(
|
std::shared_ptr<SourceLocationCollection> getFullTextSearchLocations(
|
||||||
const std::wstring& searchTerm, bool caseSensitive) const override;
|
const std::wstring& searchTerm, bool caseSensitive) const override;
|
||||||
|
|
||||||
virtual std::vector<SearchMatch> getAutocompletionMatches(const std::wstring& query, NodeTypeSet acceptedNodeTypes) const override;
|
std::vector<SearchMatch> getAutocompletionMatches(const std::wstring& query, NodeTypeSet acceptedNodeTypes) const override;
|
||||||
std::vector<SearchMatch> getAutocompletionSymbolMatches(
|
std::vector<SearchMatch> getAutocompletionSymbolMatches(
|
||||||
const std::wstring& query, const NodeTypeSet& acceptedNodeTypes, size_t maxResultsCount, size_t maxBestScoredResultsLength) const;
|
const std::wstring& query, const NodeTypeSet& acceptedNodeTypes, size_t maxResultsCount, size_t maxBestScoredResultsLength) const;
|
||||||
std::vector<SearchMatch> getAutocompletionFileMatches(const std::wstring& query, size_t maxResultsCount) const;
|
std::vector<SearchMatch> getAutocompletionFileMatches(const std::wstring& query, size_t maxResultsCount) const;
|
||||||
std::vector<SearchMatch> getAutocompletionCommandMatches(const std::wstring& query, NodeTypeSet acceptedNodeTypes) const;
|
std::vector<SearchMatch> getAutocompletionCommandMatches(const std::wstring& query, NodeTypeSet acceptedNodeTypes) const;
|
||||||
virtual std::vector<SearchMatch> getSearchMatchesForTokenIds(const std::vector<Id>& elementIds) const override;
|
std::vector<SearchMatch> getSearchMatchesForTokenIds(const std::vector<Id>& elementIds) const override;
|
||||||
|
|
||||||
virtual std::shared_ptr<Graph> getGraphForAll() const override;
|
std::shared_ptr<Graph> getGraphForAll() const override;
|
||||||
virtual std::shared_ptr<Graph> getGraphForNodeTypes(NodeTypeSet nodeTypes) const override;
|
std::shared_ptr<Graph> getGraphForNodeTypes(NodeTypeSet nodeTypes) const override;
|
||||||
virtual std::shared_ptr<Graph> getGraphForActiveTokenIds(
|
std::shared_ptr<Graph> getGraphForActiveTokenIds(
|
||||||
const std::vector<Id>& tokenIds, const std::vector<Id>& expandedNodeIds, bool* isActiveNamespace = nullptr) const override;
|
const std::vector<Id>& tokenIds, const std::vector<Id>& expandedNodeIds, bool* isActiveNamespace = nullptr) const override;
|
||||||
virtual std::shared_ptr<Graph> getGraphForChildrenOfNodeId(Id nodeId) const override;
|
std::shared_ptr<Graph> getGraphForChildrenOfNodeId(Id nodeId) const override;
|
||||||
virtual std::shared_ptr<Graph> getGraphForTrail(Id originId, Id targetId, Edge::TypeMask trailType, size_t depth) const override;
|
std::shared_ptr<Graph> getGraphForTrail(Id originId, Id targetId, Edge::TypeMask trailType, size_t depth) const override;
|
||||||
|
|
||||||
virtual std::vector<Id> getActiveTokenIdsForId(Id tokenId, Id* declarationId) const override;
|
std::vector<Id> getActiveTokenIdsForId(Id tokenId, Id* declarationId) const override;
|
||||||
virtual std::vector<Id> getNodeIdsForLocationIds(const std::vector<Id>& locationIds) const override;
|
std::vector<Id> getNodeIdsForLocationIds(const std::vector<Id>& locationIds) const override;
|
||||||
|
|
||||||
virtual std::shared_ptr<SourceLocationCollection> getSourceLocationsForTokenIds(const std::vector<Id>& tokenIds) const override;
|
std::shared_ptr<SourceLocationCollection> getSourceLocationsForTokenIds(const std::vector<Id>& tokenIds) const override;
|
||||||
virtual std::shared_ptr<SourceLocationCollection> getSourceLocationsForLocationIds(const std::vector<Id>& locationIds) const override;
|
std::shared_ptr<SourceLocationCollection> getSourceLocationsForLocationIds(const std::vector<Id>& locationIds) const override;
|
||||||
|
|
||||||
virtual std::shared_ptr<SourceLocationFile> getSourceLocationsForFile(const FilePath& filePath) const override;
|
std::shared_ptr<SourceLocationFile> getSourceLocationsForFile(const FilePath& filePath) const override;
|
||||||
virtual std::shared_ptr<SourceLocationFile> getSourceLocationsForLinesInFile(
|
std::shared_ptr<SourceLocationFile> getSourceLocationsForLinesInFile(
|
||||||
const FilePath& filePath, size_t startLine, size_t endLine) const override;
|
const FilePath& filePath, size_t startLine, size_t endLine) const override;
|
||||||
virtual std::shared_ptr<SourceLocationFile> getSourceLocationsOfTypeInFile(
|
std::shared_ptr<SourceLocationFile> getSourceLocationsOfTypeInFile(
|
||||||
const FilePath& filePath, LocationType type) const override;
|
const FilePath& filePath, LocationType type) const override;
|
||||||
|
|
||||||
virtual std::shared_ptr<SourceLocationFile> getCommentLocationsInFile(const FilePath& filePath) const override;
|
std::shared_ptr<SourceLocationFile> getCommentLocationsInFile(const FilePath& filePath) const override;
|
||||||
|
|
||||||
virtual std::shared_ptr<TextAccess> getFileContent(const FilePath& filePath) const override;
|
std::shared_ptr<TextAccess> getFileContent(const FilePath& filePath) const override;
|
||||||
|
|
||||||
virtual FileInfo getFileInfoForFileId(Id id) const override;
|
FileInfo getFileInfoForFileId(Id id) const override;
|
||||||
|
|
||||||
virtual FileInfo getFileInfoForFilePath(const FilePath& filePath) const override;
|
FileInfo getFileInfoForFilePath(const FilePath& filePath) const override;
|
||||||
virtual std::vector<FileInfo> getFileInfosForFilePaths(const std::vector<FilePath>& filePaths) const override;
|
std::vector<FileInfo> getFileInfosForFilePaths(const std::vector<FilePath>& filePaths) const override;
|
||||||
|
|
||||||
virtual StorageStats getStorageStats() const override;
|
StorageStats getStorageStats() const override;
|
||||||
|
|
||||||
virtual ErrorCountInfo getErrorCount() const override;
|
ErrorCountInfo getErrorCount() const override;
|
||||||
virtual std::vector<ErrorInfo> getErrorsLimited(const ErrorFilter& filter) const override;
|
std::vector<ErrorInfo> getErrorsLimited(const ErrorFilter& filter) const override;
|
||||||
virtual std::vector<ErrorInfo> getErrorsForFileLimited(
|
std::vector<ErrorInfo> getErrorsForFileLimited(
|
||||||
const ErrorFilter& filter, const FilePath& filePath) const override;
|
const ErrorFilter& filter, const FilePath& filePath) const override;
|
||||||
virtual std::shared_ptr<SourceLocationCollection> getErrorSourceLocations(
|
std::shared_ptr<SourceLocationCollection> getErrorSourceLocations(
|
||||||
const std::vector<ErrorInfo>& errors) const override;
|
const std::vector<ErrorInfo>& errors) const override;
|
||||||
|
|
||||||
virtual Id addNodeBookmark(const NodeBookmark& bookmark) override;
|
Id addNodeBookmark(const NodeBookmark& bookmark) override;
|
||||||
virtual Id addEdgeBookmark(const EdgeBookmark& bookmark) override;
|
Id addEdgeBookmark(const EdgeBookmark& bookmark) override;
|
||||||
virtual Id addBookmarkCategory(const std::wstring& categoryName) override;
|
Id addBookmarkCategory(const std::wstring& categoryName) override;
|
||||||
|
|
||||||
virtual void updateBookmark(const Id bookmarkId, const std::wstring& name, const std::wstring& comment, const std::wstring& categoryName) override;
|
void updateBookmark(const Id bookmarkId, const std::wstring& name, const std::wstring& comment, const std::wstring& categoryName) override;
|
||||||
virtual void removeBookmark(const Id id) override;
|
void removeBookmark(const Id id) override;
|
||||||
virtual void removeBookmarkCategory(const Id id) override;
|
void removeBookmarkCategory(const Id id) override;
|
||||||
|
|
||||||
virtual std::vector<NodeBookmark> getAllNodeBookmarks() const override;
|
std::vector<NodeBookmark> getAllNodeBookmarks() const override;
|
||||||
virtual std::vector<EdgeBookmark> getAllEdgeBookmarks() const override;
|
std::vector<EdgeBookmark> getAllEdgeBookmarks() const override;
|
||||||
virtual std::vector<BookmarkCategory> getAllBookmarkCategories() const override;
|
std::vector<BookmarkCategory> getAllBookmarkCategories() const override;
|
||||||
|
|
||||||
virtual TooltipInfo getTooltipInfoForTokenIds(const std::vector<Id>& tokenIds, TooltipOrigin origin) const override;
|
TooltipInfo getTooltipInfoForTokenIds(const std::vector<Id>& tokenIds, TooltipOrigin origin) const override;
|
||||||
TooltipSnippet getTooltipSnippetForNode(const StorageNode& node) const;
|
TooltipSnippet getTooltipSnippetForNode(const StorageNode& node) const;
|
||||||
virtual TooltipInfo getTooltipInfoForSourceLocationIdsAndLocalSymbolIds(
|
TooltipInfo getTooltipInfoForSourceLocationIdsAndLocalSymbolIds(
|
||||||
const std::vector<Id>& locationIds, const std::vector<Id>& localSymbolIds) const override;
|
const std::vector<Id>& locationIds, const std::vector<Id>& localSymbolIds) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -18,10 +18,6 @@ Storage::Storage()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Storage::~Storage()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void Storage::inject(Storage* injected)
|
void Storage::inject(Storage* injected)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(m_dataMutex);
|
std::lock_guard<std::mutex> lock(m_dataMutex);
|
||||||
@@ -36,7 +32,7 @@ void Storage::inject(Storage* injected)
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
std::unordered_map<Id, Id> injectedIdToOwnId;
|
std::unordered_map<Id, Id> injectedIdToOwnElementId;
|
||||||
|
|
||||||
injected->forEachNode(
|
injected->forEachNode(
|
||||||
[&](const StorageNode& injectedData)
|
[&](const StorageNode& injectedData)
|
||||||
@@ -44,7 +40,7 @@ void Storage::inject(Storage* injected)
|
|||||||
const Id ownId = addNode(injectedData);
|
const Id ownId = addNode(injectedData);
|
||||||
if (ownId != 0)
|
if (ownId != 0)
|
||||||
{
|
{
|
||||||
injectedIdToOwnId[injectedData.id] = ownId;
|
injectedIdToOwnElementId[injectedData.id] = ownId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -53,8 +49,8 @@ void Storage::inject(Storage* injected)
|
|||||||
[&](const StorageFile& injectedData)
|
[&](const StorageFile& injectedData)
|
||||||
{
|
{
|
||||||
std::unordered_map<Id, Id>::const_iterator it;
|
std::unordered_map<Id, Id>::const_iterator it;
|
||||||
it = injectedIdToOwnId.find(injectedData.id);
|
it = injectedIdToOwnElementId.find(injectedData.id);
|
||||||
if (it != injectedIdToOwnId.end())
|
if (it != injectedIdToOwnElementId.end())
|
||||||
{
|
{
|
||||||
const Id ownId = it->second;
|
const Id ownId = it->second;
|
||||||
addFile(StorageFile(ownId, injectedData.filePath, injectedData.modificationTime, injectedData.indexed, injectedData.complete));
|
addFile(StorageFile(ownId, injectedData.filePath, injectedData.modificationTime, injectedData.indexed, injectedData.complete));
|
||||||
@@ -66,8 +62,8 @@ void Storage::inject(Storage* injected)
|
|||||||
[&](const StorageSymbol& injectedData)
|
[&](const StorageSymbol& injectedData)
|
||||||
{
|
{
|
||||||
std::unordered_map<Id, Id>::const_iterator it;
|
std::unordered_map<Id, Id>::const_iterator it;
|
||||||
it = injectedIdToOwnId.find(injectedData.id);
|
it = injectedIdToOwnElementId.find(injectedData.id);
|
||||||
if (it != injectedIdToOwnId.end())
|
if (it != injectedIdToOwnElementId.end())
|
||||||
{
|
{
|
||||||
const Id ownId = it->second;
|
const Id ownId = it->second;
|
||||||
addSymbol(StorageSymbol(ownId, injectedData.definitionKind));
|
addSymbol(StorageSymbol(ownId, injectedData.definitionKind));
|
||||||
@@ -79,15 +75,15 @@ void Storage::inject(Storage* injected)
|
|||||||
[&](const StorageEdge& injectedData)
|
[&](const StorageEdge& injectedData)
|
||||||
{
|
{
|
||||||
std::unordered_map<Id, Id>::const_iterator it;
|
std::unordered_map<Id, Id>::const_iterator it;
|
||||||
it = injectedIdToOwnId.find(injectedData.sourceNodeId);
|
it = injectedIdToOwnElementId.find(injectedData.sourceNodeId);
|
||||||
if (it == injectedIdToOwnId.end())
|
if (it == injectedIdToOwnElementId.end())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const Id ownSourceId = it->second;
|
const Id ownSourceId = it->second;
|
||||||
|
|
||||||
it = injectedIdToOwnId.find(injectedData.targetNodeId);
|
it = injectedIdToOwnElementId.find(injectedData.targetNodeId);
|
||||||
if (it == injectedIdToOwnId.end())
|
if (it == injectedIdToOwnElementId.end())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -97,7 +93,7 @@ void Storage::inject(Storage* injected)
|
|||||||
|
|
||||||
if (ownId != 0)
|
if (ownId != 0)
|
||||||
{
|
{
|
||||||
injectedIdToOwnId[injectedData.id] = ownId;
|
injectedIdToOwnElementId[injectedData.id] = ownId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -108,17 +104,19 @@ void Storage::inject(Storage* injected)
|
|||||||
const Id ownId = addLocalSymbol(injectedData);
|
const Id ownId = addLocalSymbol(injectedData);
|
||||||
if (ownId != 0)
|
if (ownId != 0)
|
||||||
{
|
{
|
||||||
injectedIdToOwnId[injectedData.id] = ownId;
|
injectedIdToOwnElementId[injectedData.id] = ownId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
std::unordered_map<Id, Id> injectedIdToOwnSourceLocationId;
|
||||||
|
|
||||||
injected->forEachSourceLocation(
|
injected->forEachSourceLocation(
|
||||||
[&](const StorageSourceLocation& injectedData)
|
[&](const StorageSourceLocation& injectedData)
|
||||||
{
|
{
|
||||||
std::unordered_map<Id, Id>::const_iterator it;
|
std::unordered_map<Id, Id>::const_iterator it;
|
||||||
it = injectedIdToOwnId.find(injectedData.fileNodeId);
|
it = injectedIdToOwnElementId.find(injectedData.fileNodeId);
|
||||||
if (it != injectedIdToOwnId.end())
|
if (it != injectedIdToOwnElementId.end())
|
||||||
{
|
{
|
||||||
const Id ownFileNodeId = it->second;
|
const Id ownFileNodeId = it->second;
|
||||||
|
|
||||||
@@ -132,40 +130,49 @@ void Storage::inject(Storage* injected)
|
|||||||
));
|
));
|
||||||
if (ownId != 0)
|
if (ownId != 0)
|
||||||
{
|
{
|
||||||
injectedIdToOwnId[injectedData.id] = ownId;
|
injectedIdToOwnSourceLocationId[injectedData.id] = ownId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
injected->forEachOccurrence(
|
{
|
||||||
[&](const StorageOccurrence& injectedData)
|
std::vector<StorageOccurrence> occurrences;
|
||||||
{
|
injected->forEachOccurrence(
|
||||||
std::unordered_map<Id, Id>::const_iterator it;
|
[&](const StorageOccurrence& injectedData)
|
||||||
it = injectedIdToOwnId.find(injectedData.elementId);
|
|
||||||
if (it == injectedIdToOwnId.end())
|
|
||||||
{
|
{
|
||||||
return;
|
std::unordered_map<Id, Id>::const_iterator it;
|
||||||
}
|
it = injectedIdToOwnElementId.find(injectedData.elementId);
|
||||||
const Id ownElementId = it->second;
|
if (it == injectedIdToOwnElementId.end())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const Id ownElementId = it->second;
|
||||||
|
|
||||||
it = injectedIdToOwnId.find(injectedData.sourceLocationId);
|
it = injectedIdToOwnSourceLocationId.find(injectedData.sourceLocationId);
|
||||||
if (it == injectedIdToOwnId.end())
|
if (it == injectedIdToOwnSourceLocationId.end())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const Id ownSourceLocationId = it->second;
|
const Id ownSourceLocationId = it->second;
|
||||||
|
|
||||||
addOccurrence(StorageOccurrence(ownElementId, ownSourceLocationId));
|
occurrences.push_back(StorageOccurrence(ownElementId, ownSourceLocationId));
|
||||||
}
|
if (occurrences.size() >= 100)
|
||||||
);
|
{
|
||||||
|
addOccurrences(occurrences);
|
||||||
|
occurrences.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
addOccurrences(occurrences);
|
||||||
|
}
|
||||||
|
|
||||||
injected->forEachComponentAccess(
|
injected->forEachComponentAccess(
|
||||||
[&](const StorageComponentAccessData& injectedData)
|
[&](const StorageComponentAccessData& injectedData)
|
||||||
{
|
{
|
||||||
std::unordered_map<Id, Id>::const_iterator it;
|
std::unordered_map<Id, Id>::const_iterator it;
|
||||||
it = injectedIdToOwnId.find(injectedData.nodeId);
|
it = injectedIdToOwnElementId.find(injectedData.nodeId);
|
||||||
if (it == injectedIdToOwnId.end())
|
if (it == injectedIdToOwnElementId.end())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -179,8 +186,8 @@ void Storage::inject(Storage* injected)
|
|||||||
[&](const StorageCommentLocationData& injectedData)
|
[&](const StorageCommentLocationData& injectedData)
|
||||||
{
|
{
|
||||||
std::unordered_map<Id, Id>::const_iterator it;
|
std::unordered_map<Id, Id>::const_iterator it;
|
||||||
it = injectedIdToOwnId.find(injectedData.fileNodeId);
|
it = injectedIdToOwnElementId.find(injectedData.fileNodeId);
|
||||||
if (it == injectedIdToOwnId.end())
|
if (it == injectedIdToOwnElementId.end())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class Storage
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Storage();
|
Storage();
|
||||||
virtual ~Storage();
|
virtual ~Storage() = default;
|
||||||
|
|
||||||
virtual Id addNode(const StorageNodeData& data) = 0;
|
virtual Id addNode(const StorageNodeData& data) = 0;
|
||||||
virtual void addSymbol(const StorageSymbol& data) = 0;
|
virtual void addSymbol(const StorageSymbol& data) = 0;
|
||||||
@@ -30,6 +30,7 @@ public:
|
|||||||
virtual Id addLocalSymbol(const StorageLocalSymbolData& data) = 0;
|
virtual Id addLocalSymbol(const StorageLocalSymbolData& data) = 0;
|
||||||
virtual Id addSourceLocation(const StorageSourceLocationData& data) = 0;
|
virtual Id addSourceLocation(const StorageSourceLocationData& data) = 0;
|
||||||
virtual void addOccurrence(const StorageOccurrence& data) = 0;
|
virtual void addOccurrence(const StorageOccurrence& data) = 0;
|
||||||
|
virtual void addOccurrences(const std::vector<StorageOccurrence>& occurrences) = 0;
|
||||||
virtual void addComponentAccess(const StorageComponentAccessData& data) = 0;
|
virtual void addComponentAccess(const StorageComponentAccessData& data) = 0;
|
||||||
virtual void addCommentLocation(const StorageCommentLocationData& data) = 0;
|
virtual void addCommentLocation(const StorageCommentLocationData& data) = 0;
|
||||||
virtual void addError(const StorageErrorData& data) = 0;
|
virtual void addError(const StorageErrorData& data) = 0;
|
||||||
|
|||||||
@@ -172,17 +172,6 @@ StorageSourceLocation SqliteIndexStorage::addSourceLocation(const StorageSourceL
|
|||||||
|
|
||||||
bool SqliteIndexStorage::addOccurrence(const StorageOccurrence& data)
|
bool SqliteIndexStorage::addOccurrence(const StorageOccurrence& data)
|
||||||
{
|
{
|
||||||
{
|
|
||||||
m_checkOccurrenceExistsStmt.bind(1, int(data.elementId));
|
|
||||||
m_checkOccurrenceExistsStmt.bind(2, int(data.sourceLocationId));
|
|
||||||
|
|
||||||
const int checkResult = executeStatementScalar(m_checkOccurrenceExistsStmt, 0);
|
|
||||||
m_checkOccurrenceExistsStmt.reset();
|
|
||||||
if (checkResult != 0)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
{
|
{
|
||||||
m_insertOccurrenceStmt.bind(1, int(data.elementId));
|
m_insertOccurrenceStmt.bind(1, int(data.elementId));
|
||||||
m_insertOccurrenceStmt.bind(2, int(data.sourceLocationId));
|
m_insertOccurrenceStmt.bind(2, int(data.sourceLocationId));
|
||||||
@@ -192,6 +181,29 @@ bool SqliteIndexStorage::addOccurrence(const StorageOccurrence& data)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SqliteIndexStorage::addOccurrences(const std::vector<StorageOccurrence>& occurrences)
|
||||||
|
{
|
||||||
|
if (!occurrences.empty())
|
||||||
|
{
|
||||||
|
std::string stmt = "INSERT OR IGNORE INTO occurrence(element_id, source_location_id) VALUES";
|
||||||
|
{
|
||||||
|
bool isFirst = true;
|
||||||
|
for (const StorageOccurrence& occurrence : occurrences)
|
||||||
|
{
|
||||||
|
if (!isFirst)
|
||||||
|
{
|
||||||
|
stmt += ",";
|
||||||
|
}
|
||||||
|
isFirst = false;
|
||||||
|
stmt += "(" + std::to_string(occurrence.elementId) + "," + std::to_string(occurrence.sourceLocationId) + ")";
|
||||||
|
}
|
||||||
|
stmt += ";";
|
||||||
|
}
|
||||||
|
return executeStatement(stmt);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
StorageComponentAccess SqliteIndexStorage::addComponentAccess(const StorageComponentAccessData& data)
|
StorageComponentAccess SqliteIndexStorage::addComponentAccess(const StorageComponentAccessData& data)
|
||||||
{
|
{
|
||||||
Id id = getComponentAccessByNodeId(data.nodeId).id;
|
Id id = getComponentAccessByNodeId(data.nodeId).id;
|
||||||
@@ -1107,11 +1119,8 @@ void SqliteIndexStorage::setupPrecompiledStatements()
|
|||||||
m_insertSourceLocationStmt = m_database.compileStatement(
|
m_insertSourceLocationStmt = m_database.compileStatement(
|
||||||
"INSERT INTO source_location(id, file_node_id, start_line, start_column, end_line, end_column, type) VALUES(NULL, ?, ?, ?, ?, ?, ?);"
|
"INSERT INTO source_location(id, file_node_id, start_line, start_column, end_line, end_column, type) VALUES(NULL, ?, ?, ?, ?, ?, ?);"
|
||||||
);
|
);
|
||||||
m_checkOccurrenceExistsStmt = m_database.compileStatement(
|
|
||||||
"SELECT EXISTS(SELECT * FROM occurrence WHERE element_id = ? AND source_location_id = ? LIMIT 1);"
|
|
||||||
);
|
|
||||||
m_insertOccurrenceStmt = m_database.compileStatement(
|
m_insertOccurrenceStmt = m_database.compileStatement(
|
||||||
"INSERT INTO occurrence(element_id, source_location_id) VALUES(?, ?);"
|
"INSERT OR IGNORE INTO occurrence(element_id, source_location_id) VALUES(?, ?);"
|
||||||
);
|
);
|
||||||
m_insertComponentAccessStmt = m_database.compileStatement(
|
m_insertComponentAccessStmt = m_database.compileStatement(
|
||||||
"INSERT INTO component_access(id, node_id, type) VALUES(NULL, ?, ?);"
|
"INSERT INTO component_access(id, node_id, type) VALUES(NULL, ?, ?);"
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ public:
|
|||||||
StorageLocalSymbol addLocalSymbol(const StorageLocalSymbolData& data);
|
StorageLocalSymbol addLocalSymbol(const StorageLocalSymbolData& data);
|
||||||
StorageSourceLocation addSourceLocation(const StorageSourceLocationData& data);
|
StorageSourceLocation addSourceLocation(const StorageSourceLocationData& data);
|
||||||
bool addOccurrence(const StorageOccurrence& data);
|
bool addOccurrence(const StorageOccurrence& data);
|
||||||
|
bool addOccurrences(const std::vector<StorageOccurrence>& occurrences);
|
||||||
StorageComponentAccess addComponentAccess(const StorageComponentAccessData& data);
|
StorageComponentAccess addComponentAccess(const StorageComponentAccessData& data);
|
||||||
StorageCommentLocation addCommentLocation(const StorageCommentLocationData& data);
|
StorageCommentLocation addCommentLocation(const StorageCommentLocationData& data);
|
||||||
StorageError addError(const StorageErrorData& data);
|
StorageError addError(const StorageErrorData& data);
|
||||||
|
|||||||
Reference in New Issue
Block a user