Merge pull request #399 from MananJethwani/search_pagination

This commit is contained in:
Matthieu Gautier 2020-08-12 11:11:40 +02:00 committed by GitHub
commit a126482d69
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 40 additions and 30 deletions

2
.gitignore vendored
View File

@ -2,3 +2,5 @@
*.swp *.swp
subprojects/googletest-release* subprojects/googletest-release*
*.class *.class
build/
.vscode/

View File

@ -60,6 +60,13 @@ class SearchRenderer
*/ */
void setSearchProtocolPrefix(const std::string& prefix); void setSearchProtocolPrefix(const std::string& prefix);
/**
* set result count per page
*/
void setPageLength(unsigned int pageLength){
this->pageLength = pageLength;
}
/** /**
* Generate the html page with the resutls of the search. * Generate the html page with the resutls of the search.
*/ */
@ -73,10 +80,9 @@ class SearchRenderer
std::string searchPattern; std::string searchPattern;
std::string protocolPrefix; std::string protocolPrefix;
std::string searchProtocolPrefix; std::string searchProtocolPrefix;
unsigned int resultCountPerPage; unsigned int pageLength;
unsigned int estimatedResultCount; unsigned int estimatedResultCount;
unsigned int resultStart; unsigned int resultStart;
unsigned int resultEnd;
}; };

View File

@ -93,30 +93,30 @@ std::string SearchRenderer::getHtml()
kainjow::mustache::data pages{kainjow::mustache::data::type::list}; kainjow::mustache::data pages{kainjow::mustache::data::type::list};
auto resultStart = mp_searcher->getResultStart(); auto resultStart = mp_searcher->getResultStart();
auto resultEnd = mp_searcher->getResultEnd(); auto resultEnd = 0U;
auto resultCountPerPage = resultEnd - resultStart;
auto estimatedResultCount = mp_searcher->getEstimatedResultCount(); auto estimatedResultCount = mp_searcher->getEstimatedResultCount();
auto currentPage = 0U; auto currentPage = 0U;
auto pageStart = 0U; auto pageStart = 0U;
auto pageEnd = 0U; auto pageEnd = 0U;
auto lastPageStart = 0U; auto lastPageStart = 0U;
if (resultCountPerPage) { if (pageLength) {
currentPage = resultStart/resultCountPerPage; currentPage = resultStart/pageLength;
pageStart = currentPage > 4 ? currentPage-4 : 0; pageStart = currentPage > 4 ? currentPage-4 : 0;
pageEnd = currentPage + 5; pageEnd = currentPage + 5;
if (pageEnd > estimatedResultCount / resultCountPerPage) { if (pageEnd > estimatedResultCount / pageLength) {
pageEnd = estimatedResultCount / resultCountPerPage; pageEnd = (estimatedResultCount + pageLength - 1) / pageLength;
} }
if (estimatedResultCount > resultCountPerPage) { if (estimatedResultCount > pageLength) {
lastPageStart = static_cast<int>(round(estimatedResultCount/resultCountPerPage)) * resultCountPerPage; lastPageStart = ((estimatedResultCount-1)/pageLength)*pageLength;
} }
} }
resultEnd = resultStart+pageLength; //setting result end
for (unsigned int i = pageStart; i < pageEnd; i++) { for (unsigned int i = pageStart; i < pageEnd; i++) {
kainjow::mustache::data page; kainjow::mustache::data page;
page.set("label", to_string(i + 1)); page.set("label", to_string(i + 1));
page.set("start", to_string(i * resultCountPerPage)); page.set("start", to_string(i * pageLength));
page.set("end", to_string((i + 1) * resultCountPerPage));
if (i == currentPage) { if (i == currentPage) {
page.set("selected", true); page.set("selected", true);
@ -137,9 +137,8 @@ std::string SearchRenderer::getHtml()
allData.set("searchPatternEncoded", urlEncode(this->searchPattern)); allData.set("searchPatternEncoded", urlEncode(this->searchPattern));
allData.set("resultStart", to_string(resultStart + 1)); allData.set("resultStart", to_string(resultStart + 1));
allData.set("resultEnd", to_string(min(resultEnd, estimatedResultCount))); allData.set("resultEnd", to_string(min(resultEnd, estimatedResultCount)));
allData.set("resultRange", to_string(resultCountPerPage)); allData.set("pageLength", to_string(pageLength));
allData.set("resultLastPageStart", to_string(lastPageStart)); allData.set("resultLastPageStart", to_string(lastPageStart));
allData.set("lastResult", to_string(estimatedResultCount));
allData.set("protocolPrefix", this->protocolPrefix); allData.set("protocolPrefix", this->protocolPrefix);
allData.set("searchProtocolPrefix", this->searchProtocolPrefix); allData.set("searchProtocolPrefix", this->searchProtocolPrefix);
allData.set("contentId", this->searchContent); allData.set("contentId", this->searchContent);

View File

@ -708,19 +708,21 @@ Response InternalServer::handle_search(const RequestContext& request)
try { try {
start = request.get_argument<unsigned int>("start"); start = request.get_argument<unsigned int>("start");
} catch (const std::exception&) {} } catch (const std::exception&) {}
auto end = 25; auto pageLength=25;
try{ try{
end = request.get_argument<unsigned int>("end"); pageLength=request.get_argument<unsigned int>("pageLength");
}catch(const std::exception&){} }catch(const std::exception&){}
if (start>end) { if (pageLength > MAX_SEARCH_LEN) {
auto tmp = start; pageLength = MAX_SEARCH_LEN;
start = end;
end = tmp;
} }
if (end > start + MAX_SEARCH_LEN) {
end = start + MAX_SEARCH_LEN; if(pageLength==0)
{
pageLength=25;
} }
auto end=start+pageLength;
/* Get the results */ /* Get the results */
try { try {
if (patternString.empty()) { if (patternString.empty()) {
@ -735,6 +737,7 @@ Response InternalServer::handle_search(const RequestContext& request)
renderer.setSearchContent(bookName); renderer.setSearchContent(bookName);
renderer.setProtocolPrefix(m_root + "/"); renderer.setProtocolPrefix(m_root + "/");
renderer.setSearchProtocolPrefix(m_root + "/search?"); renderer.setSearchProtocolPrefix(m_root + "/search?");
renderer.setPageLength(pageLength);
response.set_content(renderer.getHtml()); response.set_content(renderer.getHtml());
} catch (const std::exception& e) { } catch (const std::exception& e) {
std::cerr << e.what() << std::endl; std::cerr << e.what() << std::endl;

View File

@ -133,7 +133,7 @@
<ul> <ul>
{{#resultLastPageStart}} {{#resultLastPageStart}}
<li> <li>
<a href="{{searchProtocolPrefix}}pattern={{searchPatternEncoded}}{{#contentId}}&content={{.}}{{/contentId}}&start=0&end={{resultRange}}"> <a href="{{searchProtocolPrefix}}pattern={{searchPatternEncoded}}{{#contentId}}&content={{.}}{{/contentId}}&start=0&pageLength={{pageLength}}">
</a> </a>
</li> </li>
@ -141,14 +141,14 @@
{{#pages}} {{#pages}}
<li> <li>
<a {{#selected}}class="selected"{{/selected}} <a {{#selected}}class="selected"{{/selected}}
href="{{searchProtocolPrefix}}pattern={{searchPatternEncoded}}{{#contentId}}&content={{.}}{{/contentId}}&start={{start}}&end={{end}}"> href="{{searchProtocolPrefix}}pattern={{searchPatternEncoded}}{{#contentId}}&content={{.}}{{/contentId}}&start={{start}}&pageLength={{pageLength}}">
{{label}} {{label}}
</a> </a>
</li> </li>
{{/pages}} {{/pages}}
{{#resultLastPageStart}} {{#resultLastPageStart}}
<li> <li>
<a href="{{searchProtocolPrefix}}pattern={{searchPatternEncoded}}{{#contentId}}&content={{.}}{{/contentId}}&start={{resultLastPageStart}}&end={{lastResult}}"> <a href="{{searchProtocolPrefix}}pattern={{searchPatternEncoded}}{{#contentId}}&content={{.}}{{/contentId}}&start={{resultLastPageStart}}&pageLength={{pageLength}}">
</a> </a>
</li> </li>