From fdc291b7c2d67dc2cc3a03786d0116e77b3419ba Mon Sep 17 00:00:00 2001 From: Matthieu Gautier Date: Mon, 9 Sep 2019 14:38:47 +0200 Subject: [PATCH 1/4] [HTML Rendering] Do not do division by zero. We must correctly handle the case if resultStart is equal to resultEnd. --- src/search_renderer.cpp | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/search_renderer.cpp b/src/search_renderer.cpp index 769bb6a21..e834e78b6 100644 --- a/src/search_renderer.cpp +++ b/src/search_renderer.cpp @@ -96,27 +96,29 @@ std::string SearchRenderer::getHtml() auto resultEnd = mp_searcher->getResultEnd(); auto resultCountPerPage = resultEnd - resultStart; auto estimatedResultCount = mp_searcher->getEstimatedResultCount(); - - unsigned int pageStart - = resultStart / resultCountPerPage >= 5 - ? resultStart / resultCountPerPage - 4 - : 0; - unsigned int pageCount - = estimatedResultCount / resultCountPerPage + 1 - pageStart; - - if (pageCount > 10) { - pageCount = 10; - } else if (pageCount == 1) { - pageCount = 0; + auto currentPage = 0U; + auto pageStart = 0U; + auto pageEnd = 0U; + auto lastPageStart = 0U; + if (resultCountPerPage) { + currentPage = resultStart/resultCountPerPage; + pageStart = currentPage > 4 ? currentPage-4 : 0; + pageEnd = currentPage + 5; + if (pageEnd > estimatedResultCount / resultCountPerPage) { + pageEnd = estimatedResultCount / resultCountPerPage; + } + if (estimatedResultCount > resultCountPerPage) { + lastPageStart = round(estimatedResultCount/resultCountPerPage) * resultCountPerPage; + } } - for (unsigned int i = pageStart; i < pageStart + pageCount; i++) { + 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 * resultCountPerPage)); page.set("end", to_string((i + 1) * resultCountPerPage)); - if (i * resultCountPerPage == resultStart) { + if (i == currentPage) { page.set("selected", true); } pages.push_back(page); @@ -135,9 +137,7 @@ std::string SearchRenderer::getHtml() allData.set("resultStart", to_string(resultStart + 1)); allData.set("resultEnd", to_string(min(resultEnd, estimatedResultCount))); allData.set("resultRange", to_string(resultCountPerPage)); - allData.set("resultLastPageStart", to_string(estimatedResultCount > resultCountPerPage - ? round(estimatedResultCount / resultCountPerPage) * resultCountPerPage - : 0)); + allData.set("resultLastPageStart", to_string(lastPageStart)); allData.set("lastResult", to_string(estimatedResultCount)); allData.set("protocolPrefix", this->protocolPrefix); allData.set("searchProtocolPrefix", this->searchProtocolPrefix); From 78dbd6652271d9d0b450c77bc030cc3fbfb06bc8 Mon Sep 17 00:00:00 2001 From: Matthieu Gautier Date: Mon, 9 Sep 2019 14:41:57 +0200 Subject: [PATCH 2/4] [HTML Rendering] Do not render page navigation buttons if only one page. --- src/search_renderer.cpp | 1 + static/templates/search_result.html | 50 +++++++++++++++-------------- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/search_renderer.cpp b/src/search_renderer.cpp index e834e78b6..63619429e 100644 --- a/src/search_renderer.cpp +++ b/src/search_renderer.cpp @@ -131,6 +131,7 @@ std::string SearchRenderer::getHtml() allData.set("results", results); allData.set("pages", pages); allData.set("hasResult", 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)); diff --git a/static/templates/search_result.html b/static/templates/search_result.html index ce49b2df5..e277657c1 100644 --- a/static/templates/search_result.html +++ b/static/templates/search_result.html @@ -129,30 +129,32 @@ From a13244dc0e5b63f4e090dcafbbe4d8be04b52833 Mon Sep 17 00:00:00 2001 From: Matthieu Gautier Date: Mon, 9 Sep 2019 14:42:30 +0200 Subject: [PATCH 3/4] Rename `hasResult` to `hasResults` --- src/search_renderer.cpp | 2 +- static/templates/search_result.html | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/search_renderer.cpp b/src/search_renderer.cpp index 63619429e..6a21e1a4e 100644 --- a/src/search_renderer.cpp +++ b/src/search_renderer.cpp @@ -130,7 +130,7 @@ std::string SearchRenderer::getHtml() kainjow::mustache::data allData; allData.set("results", results); allData.set("pages", pages); - allData.set("hasResult", estimatedResultCount != 0); + allData.set("hasResults", estimatedResultCount != 0); allData.set("hasPages", pageStart != pageEnd); allData.set("count", kiwix::beautifyInteger(estimatedResultCount)); allData.set("searchPattern", kiwix::encodeDiples(this->searchPattern)); diff --git a/static/templates/search_result.html b/static/templates/search_result.html index e277657c1..ddab4961e 100644 --- a/static/templates/search_result.html +++ b/static/templates/search_result.html @@ -95,7 +95,7 @@
- {{#hasResult}} + {{#hasResults}} Results {{resultStart}}-{{resultEnd}} @@ -104,10 +104,10 @@ for {{searchPattern}} - {{/hasResult}} - {{^hasResult}} + {{/hasResults}} + {{^hasResults}} No results were found for {{searchPattern}} - {{/hasResult}} + {{/hasResults}}
From 87dc145dc7950496fb3421f396752a3e6564b216 Mon Sep 17 00:00:00 2001 From: Matthieu Gautier Date: Mon, 9 Sep 2019 14:43:01 +0200 Subject: [PATCH 4/4] Correctly set searcher information even if resultStart equals resultEnd. --- src/searcher.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/searcher.cpp b/src/searcher.cpp index 4d603d1d6..6802d6635 100644 --- a/src/searcher.cpp +++ b/src/searcher.cpp @@ -108,12 +108,12 @@ void Searcher::search(std::string& search, cout << "Performing query `" << search << "'" << endl; } + this->searchPattern = search; + this->resultStart = resultStart; + this->resultEnd = resultEnd; /* Try to find results */ if (resultStart != resultEnd) { /* Perform the search */ - this->searchPattern = search; - this->resultStart = resultStart; - this->resultEnd = resultEnd; string unaccentedSearch = removeAccents(search); std::vector zims; for (auto current = this->readers.begin(); current != this->readers.end(); @@ -146,11 +146,6 @@ void Searcher::geo_search(float latitude, float longitude, float distance, cout << "Performing geo query `" << distance << "&(" << latitude << ";" << longitude << ")'" << endl; } - /* Try to find results */ - if (resultStart == resultEnd) { - return; - } - /* Perform the search */ std::ostringstream oss; oss << "Articles located less than " << distance << " meters of " << latitude << ";" << longitude; @@ -158,6 +153,11 @@ void Searcher::geo_search(float latitude, float longitude, float distance, this->resultStart = resultStart; this->resultEnd = resultEnd; + /* Try to find results */ + if (resultStart == resultEnd) { + return; + } + std::vector zims; for (auto current = this->readers.begin(); current != this->readers.end(); current++) {