Skip to content

Commit

Permalink
fixup! Add SearchRenderer handles for libzim structures
Browse files Browse the repository at this point in the history
  • Loading branch information
maneeshpm committed Jun 3, 2021
1 parent ef8ad1a commit 78a6408
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 100 deletions.
11 changes: 3 additions & 8 deletions include/search_renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down Expand Up @@ -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;
Expand Down
7 changes: 7 additions & 0 deletions include/searcher.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
#include "tools/pathTools.h"
#include "tools/stringTools.h"

#include <zim/search.h>

using namespace std;

namespace kiwix
Expand Down Expand Up @@ -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; }

Expand Down
103 changes: 11 additions & 92 deletions src/search_renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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());
Expand All @@ -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;
Expand Down
5 changes: 5 additions & 0 deletions src/searcher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down

0 comments on commit 78a6408

Please sign in to comment.