#ifndef SEARCH_NODE_H #define SEARCH_NODE_H #include #include #include #include #include #include #include "utility/types.h" #include "data/search/SearchResult.h" class Dictionary; class NameHierarchy; class SearchIndex; struct SearchMatch; class SearchNode { public: SearchNode(SearchNode* parent, const std::string& name, Id nameId); ~SearchNode(); size_t getNodeCount() const; const std::string& getName() const; NameHierarchy getNameHierarchy() const; std::string getFullName() const; Id getNameId() const; std::deque getNameIdsRecursive() const; Id getFirstTokenId() const; const std::set& getTokenIds() const; bool hasTokenIdsRecursive() const; void addTokenId(Id tokenId); void removeTokenId(Id tokenId); SearchNode* getParent() const; std::deque getParentsWithoutTokenId(); const std::set>& getChildren() const; SearchResults runFuzzySearch(const std::string& query) const; SearchResults runFuzzySearchOnSelf(const std::string& query) const; void addResults(SearchResults* results, size_t weight, const SearchNode* node) const; void addResultsRecursive(SearchResults* results, size_t weight, const SearchNode* node) const; private: typedef std::multimap FuzzyMap; typedef FuzzyMap::const_iterator FuzzyMapIterator; // Accessed by SearchIndex std::shared_ptr addNodeRecursive(std::deque* nameIds, const Dictionary& dictionary); std::shared_ptr getNodeRecursive(std::deque* nameIds) const; void removeSearchNode(SearchNode* node); SearchMatch fuzzyMatchData(const std::string& query, const SearchNode* parent) const; friend class SearchIndex; FuzzyMap fuzzyMatchRecursive(const std::string& query, size_t pos, size_t weight, size_t size) const; std::pair fuzzyMatch( const std::string query, size_t start, size_t size, std::vector* indices = nullptr) const; std::shared_ptr getChildWithNameId(Id nameId) const; std::deque getNodesToParent(const SearchNode* parent) const; std::set> m_nodes; SearchNode* m_parent; std::set m_tokenIds; const std::string& m_name; const Id m_nameId; friend std::ostream& operator<<(std::ostream& ostream, const SearchNode* node); }; std::ostream& operator<<(std::ostream& ostream, const SearchNode* node); #endif // SEARCH_NODE_H