From cd02b4de3b122733f0a6523d26453855c3395690 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Sat, 15 May 2021 23:24:58 +0400 Subject: [PATCH] Dummy application of new libzim search API Didn't take any advantage of the new libzim search API. Just fixed the libkiwix build in the most straightforward way. --- include/searcher.h | 4 +-- src/reader.cpp | 16 +++++----- src/searcher.cpp | 78 +++++++++++++++++++++------------------------- 3 files changed, 47 insertions(+), 51 deletions(-) diff --git a/include/searcher.h b/include/searcher.h index d2629a118..d3c0315e8 100644 --- a/include/searcher.h +++ b/include/searcher.h @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include #include "tools/pathTools.h" #include "tools/stringTools.h" @@ -154,7 +154,7 @@ class Searcher const bool verbose = false); std::vector readers; - SearcherInternal* internal; + std::unique_ptr internal; std::string searchPattern; unsigned int estimatedResultCount; unsigned int resultStart; diff --git a/src/reader.cpp b/src/reader.cpp index bf95607f7..07c2b32cb 100644 --- a/src/reader.cpp +++ b/src/reader.cpp @@ -495,14 +495,16 @@ bool Reader::searchSuggestionsSmart(const string& prefix, bool retVal = false; /* Try to search in the title using fulltext search database */ - auto suggestionSearch = zim::Search(*zimArchive); - suggestionSearch.set_query(prefix); - suggestionSearch.set_range(0, suggestionsCount); - suggestionSearch.set_suggestion_mode(true); - if (suggestionSearch.get_matches_estimated()) { - for (auto current = suggestionSearch.begin(); - current != suggestionSearch.end(); + auto suggestionSearcher = zim::Searcher(*zimArchive); + zim::Query suggestionQuery; + suggestionQuery.setQuery(prefix, true); + auto suggestionSearch = suggestionSearcher.search(suggestionQuery); + + if (suggestionSearch.getEstimatedMatches()) { + const auto suggestions = suggestionSearch.getResults(0, suggestionsCount); + for (auto current = suggestions.begin(); + current != suggestions.end(); current++) { std::vector suggestion; suggestion.push_back(current->getTitle()); diff --git a/src/searcher.cpp b/src/searcher.cpp index 65c57ff43..6fa861d6a 100644 --- a/src/searcher.cpp +++ b/src/searcher.cpp @@ -35,7 +35,7 @@ namespace kiwix class _Result : public Result { public: - _Result(zim::Search::iterator& iterator); + _Result(zim::SearchResultSet::iterator iterator); virtual ~_Result(){}; virtual std::string get_url(); @@ -48,26 +48,22 @@ class _Result : public Result virtual int get_readerIndex(); private: - zim::Search::iterator iterator; + zim::SearchResultSet::iterator iterator; }; -struct SearcherInternal { - const zim::Search* _search; - zim::Search::iterator current_iterator; - - SearcherInternal() : _search(NULL) {} - ~SearcherInternal() +struct SearcherInternal : zim::SearchResultSet { + explicit SearcherInternal(const zim::SearchResultSet& srs) + : zim::SearchResultSet(srs) + , current_iterator(srs.begin()) { - if (_search != NULL) { - delete _search; - } } + + zim::SearchResultSet::iterator current_iterator; }; /* Constructor */ Searcher::Searcher() - : internal(new SearcherInternal()), - searchPattern(""), + : searchPattern(""), estimatedResultCount(0), resultStart(0), resultEnd(0) @@ -78,7 +74,6 @@ Searcher::Searcher() /* Destructor */ Searcher::~Searcher() { - delete internal; } bool Searcher::add_reader(Reader* reader) @@ -122,13 +117,13 @@ void Searcher::search(const std::string& search, archives.push_back(*(*current)->getZimArchive()); } } - zim::Search* search = new zim::Search(archives); - search->set_verbose(verbose); - search->set_query(unaccentedSearch); - search->set_range(resultStart, resultEnd); - internal->_search = search; - internal->current_iterator = internal->_search->begin(); - this->estimatedResultCount = internal->_search->get_matches_estimated(); + zim::Searcher searcher(archives); + zim::Query query; + query.setQuery(unaccentedSearch, false); + query.setVerbose(verbose); + zim::Search search = searcher.search(query); + internal.reset(new SearcherInternal(search.getResults(resultStart, resultEnd))); + this->estimatedResultCount = search.getEstimatedMatches(); } return; @@ -163,28 +158,28 @@ void Searcher::geo_search(float latitude, float longitude, float distance, current++) { archives.push_back(*(*current)->getZimArchive()); } - zim::Search* search = new zim::Search(archives); - search->set_verbose(verbose); - search->set_query(""); - search->set_georange(latitude, longitude, distance); - search->set_range(resultStart, resultEnd); - internal->_search = search; - internal->current_iterator = internal->_search->begin(); - this->estimatedResultCount = internal->_search->get_matches_estimated(); + zim::Searcher searcher(archives); + zim::Query query; + query.setVerbose(verbose); + query.setQuery("", false); + query.setGeorange(latitude, longitude, distance); + zim::Search search = searcher.search(query); + internal.reset(new SearcherInternal(search.getResults(resultStart, resultEnd))); + this->estimatedResultCount = search.getEstimatedMatches(); } void Searcher::restart_search() { - if (internal->_search) { - internal->current_iterator = internal->_search->begin(); + if (internal.get()) { + internal->current_iterator = internal->begin(); } } Result* Searcher::getNextResult() { - if (internal->_search && - internal->current_iterator != internal->_search->end()) { + if (internal.get() && + internal->current_iterator != internal->end()) { Result* result = new _Result(internal->current_iterator); internal->current_iterator++; return result; @@ -218,14 +213,13 @@ void Searcher::suggestions(std::string& searchPattern, const bool verbose) current++) { archives.push_back(*(*current)->getZimArchive()); } - zim::Search* search = new zim::Search(archives); - search->set_verbose(verbose); - search->set_query(unaccentedSearch); - search->set_range(resultStart, resultEnd); - search->set_suggestion_mode(true); - internal->_search = search; - internal->current_iterator = internal->_search->begin(); - this->estimatedResultCount = internal->_search->get_matches_estimated(); + zim::Searcher searcher(archives); + zim::Query query; + query.setVerbose(verbose); + query.setQuery(unaccentedSearch, true); + zim::Search search = searcher.search(query); + internal.reset(new SearcherInternal(search.getResults(resultStart, resultEnd))); + this->estimatedResultCount = search.getEstimatedMatches(); } /* Return the result count estimation */ @@ -234,7 +228,7 @@ unsigned int Searcher::getEstimatedResultCount() return this->estimatedResultCount; } -_Result::_Result(zim::Search::iterator& iterator) +_Result::_Result(zim::SearchResultSet::iterator iterator) : iterator(iterator) { }