diff --git a/include/search_renderer.h b/include/search_renderer.h index 7aa2888f6..5951ff8a7 100644 --- a/include/search_renderer.h +++ b/include/search_renderer.h @@ -41,7 +41,8 @@ class SearchRenderer * Used to generate pagination links. */ SearchRenderer(Searcher* searcher, NameMapper* mapper); - SearchRenderer(zim::Search* search, NameMapper* mapper); + SearchRenderer(zim::SearchResultSet srs, NameMapper* mapper, + unsigned int start, unsigned int estimatedResultCount); ~SearchRenderer(); @@ -74,15 +75,9 @@ class SearchRenderer */ std::string getHtml(); - /** - * Generate the html page with the resutls of the search. - */ - std::string getHtml(int start, int end); - protected: std::string beautifyInteger(const unsigned int number); - Searcher* mp_searcher; - zim::Search* mp_search; + 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 c73c7528f..66bb3b429 100644 --- a/src/search_renderer.cpp +++ b/src/search_renderer.cpp @@ -37,19 +37,22 @@ namespace kiwix /* Constructor */ SearchRenderer::SearchRenderer(Searcher* searcher, NameMapper* mapper) - : mp_searcher(searcher), - mp_search(nullptr), + : m_srs(searcher->getSearchResultSet()), mp_nameMapper(mapper), protocolPrefix("zim://"), - searchProtocolPrefix("search://?") + searchProtocolPrefix("search://?"), + estimatedResultCount(searcher->getEstimatedResultCount()), + resultStart(searcher->getResultStart()) {} -SearchRenderer::SearchRenderer(zim::Search* search, NameMapper* mapper) - : mp_searcher(nullptr), - mp_search(search), +SearchRenderer::SearchRenderer(zim::SearchResultSet srs, NameMapper* mapper, + unsigned int start, unsigned int estimatedResultCount) + : m_srs(srs), mp_nameMapper(mapper), protocolPrefix("zim://"), - searchProtocolPrefix("search://?") + searchProtocolPrefix("search://?"), + estimatedResultCount(estimatedResultCount), + resultStart(start) {} /* Destructor */ @@ -79,89 +82,7 @@ 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())) { - 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())); - - if (p_result->get_wordCount() >= 0) { - result.set("wordCount", kiwix::beautifyInteger(p_result->get_wordCount())); - } - - 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; - auto lastPageStart = 0U; - if (pageLength) { - currentPage = resultStart/pageLength; - pageStart = currentPage > 4 ? currentPage-4 : 0; - pageEnd = currentPage + 5; - if (pageEnd > estimatedResultCount / pageLength) { - pageEnd = (estimatedResultCount + pageLength - 1) / pageLength; - } - if (estimatedResultCount > pageLength) { - lastPageStart = ((estimatedResultCount-1)/pageLength)*pageLength; - } - } - - resultEnd = resultStart+pageLength; //setting result end - - for (unsigned int i = pageStart; i < pageEnd; i++) { - kainjow::mustache::data page; - page.set("label", to_string(i + 1)); - page.set("start", to_string(i * pageLength)); - - if (i == currentPage) { - page.set("selected", true); - } - pages.push_back(page); - } - - std::string template_str = RESOURCE::templates::search_result_html; - kainjow::mustache::mustache tmpl(template_str); - - kainjow::mustache::data allData; - allData.set("results", results); - allData.set("pages", pages); - allData.set("hasResults", estimatedResultCount != 0); - allData.set("hasPages", pageStart != pageEnd); - allData.set("count", kiwix::beautifyInteger(estimatedResultCount)); - allData.set("searchPattern", kiwix::encodeDiples(this->searchPattern)); - allData.set("searchPatternEncoded", urlEncode(this->searchPattern)); - allData.set("resultStart", to_string(resultStart + 1)); - allData.set("resultEnd", to_string(min(resultEnd, estimatedResultCount))); - allData.set("pageLength", to_string(pageLength)); - allData.set("resultLastPageStart", to_string(lastPageStart)); - allData.set("protocolPrefix", this->protocolPrefix); - allData.set("searchProtocolPrefix", this->searchProtocolPrefix); - allData.set("contentId", this->searchContent); - - std::stringstream ss; - tmpl.render(allData, [&ss](const std::string& str) { ss << str; }); - return ss.str(); -} - -std::string SearchRenderer::getHtml(int start, int end) -{ - kainjow::mustache::data results{kainjow::mustache::data::type::list}; - - zim::SearchResultSet srs = mp_search->getResults(start, end); - - for (auto it = srs.begin(); it != srs.end(); it++) { + for (auto it = m_srs.begin(); it != m_srs.end(); it++) { kainjow::mustache::data result; result.set("title", it.getTitle()); result.set("url", it.getPath()); @@ -180,9 +101,7 @@ std::string SearchRenderer::getHtml(int start, int end) // pages kainjow::mustache::data pages{kainjow::mustache::data::type::list}; - auto resultStart = start; auto resultEnd = 0U; - unsigned int estimatedResultCount = mp_search->getEstimatedMatches(); 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) {