diff --git a/include/search_renderer.h b/include/search_renderer.h index 4f491961f..5951ff8a7 100644 --- a/include/search_renderer.h +++ b/include/search_renderer.h @@ -21,6 +21,7 @@ #define KIWIX_SEARCH_RENDERER_H #include +#include namespace kiwix { @@ -40,6 +41,8 @@ class SearchRenderer * Used to generate pagination links. */ SearchRenderer(Searcher* searcher, NameMapper* mapper); + SearchRenderer(zim::SearchResultSet srs, NameMapper* mapper, + unsigned int start, unsigned int estimatedResultCount); ~SearchRenderer(); @@ -74,7 +77,7 @@ class SearchRenderer protected: std::string beautifyInteger(const unsigned int number); - Searcher* mp_searcher; + zim::SearchResultSet m_srs; NameMapper* mp_nameMapper; std::string searchContent; std::string searchPattern; diff --git a/include/searcher.h b/include/searcher.h index 8acf929ce..8c72953b4 100644 --- a/include/searcher.h +++ b/include/searcher.h @@ -32,6 +32,8 @@ #include "tools/pathTools.h" #include "tools/stringTools.h" +#include + using namespace std; namespace kiwix @@ -142,6 +144,11 @@ class Searcher */ unsigned int getEstimatedResultCount(); + /** + * Get a SearchResultSet object for current search + */ + zim::SearchResultSet getSearchResultSet(); + unsigned int getResultStart() { return resultStart; } unsigned int getResultEnd() { return resultEnd; } diff --git a/src/search_renderer.cpp b/src/search_renderer.cpp index 0e503e330..66bb3b429 100644 --- a/src/search_renderer.cpp +++ b/src/search_renderer.cpp @@ -37,10 +37,22 @@ namespace kiwix /* Constructor */ SearchRenderer::SearchRenderer(Searcher* searcher, NameMapper* mapper) - : mp_searcher(searcher), + : m_srs(searcher->getSearchResultSet()), mp_nameMapper(mapper), protocolPrefix("zim://"), - searchProtocolPrefix("search://?") + searchProtocolPrefix("search://?"), + estimatedResultCount(searcher->getEstimatedResultCount()), + resultStart(searcher->getResultStart()) +{} + +SearchRenderer::SearchRenderer(zim::SearchResultSet srs, NameMapper* mapper, + unsigned int start, unsigned int estimatedResultCount) + : m_srs(srs), + mp_nameMapper(mapper), + protocolPrefix("zim://"), + searchProtocolPrefix("search://?"), + estimatedResultCount(estimatedResultCount), + resultStart(start) {} /* Destructor */ @@ -70,29 +82,26 @@ std::string SearchRenderer::getHtml() { kainjow::mustache::data results{kainjow::mustache::data::type::list}; - mp_searcher->restart_search(); - Result* p_result = NULL; - while ((p_result = mp_searcher->getNextResult())) { + for (auto it = m_srs.begin(); it != m_srs.end(); it++) { kainjow::mustache::data result; - result.set("title", p_result->get_title()); - result.set("url", p_result->get_url()); - result.set("snippet", p_result->get_snippet()); - result.set("resultContentId", mp_nameMapper->getNameForId(p_result->get_zimId())); + result.set("title", it.getTitle()); + result.set("url", it.getPath()); + result.set("snippet", it.getSnippet()); + std::ostringstream s; + s << it.getZimId(); + result.set("resultContentId", mp_nameMapper->getNameForId(s.str())); - if (p_result->get_wordCount() >= 0) { - result.set("wordCount", kiwix::beautifyInteger(p_result->get_wordCount())); + if (it.getWordCount() >= 0) { + result.set("wordCount", kiwix::beautifyInteger(it.getWordCount())); } results.push_back(result); - delete p_result; } // pages kainjow::mustache::data pages{kainjow::mustache::data::type::list}; - auto resultStart = mp_searcher->getResultStart(); auto resultEnd = 0U; - auto estimatedResultCount = mp_searcher->getEstimatedResultCount(); auto currentPage = 0U; auto pageStart = 0U; auto pageEnd = 0U; diff --git a/src/searcher.cpp b/src/searcher.cpp index 6f3b54257..e8b41caa1 100644 --- a/src/searcher.cpp +++ b/src/searcher.cpp @@ -228,6 +228,11 @@ unsigned int Searcher::getEstimatedResultCount() return this->estimatedResultCount; } +zim::SearchResultSet Searcher::getSearchResultSet() +{ + return *(this->internal); +} + _Result::_Result(zim::SearchResultSet::iterator iterator) : iterator(iterator) {