Use selectBooks in handle_search

This commit is contained in:
Matthieu Gautier 2022-04-20 10:32:24 +02:00
parent 76d5fafb72
commit 39d0a56be8
2 changed files with 26 additions and 45 deletions

View File

@ -181,20 +181,12 @@ Library::BookIdSet InternalServer::selectBooks(const RequestContext& request) co
return Library::BookIdSet(id_vec.begin(), id_vec.end()); return Library::BookIdSet(id_vec.begin(), id_vec.end());
} }
SearchInfo::SearchInfo(const std::string& pattern) SearchInfo InternalServer::getSearchInfo(const RequestContext& request) const
: pattern(pattern),
geoQuery()
{}
SearchInfo::SearchInfo(const std::string& pattern, GeoQuery geoQuery)
: pattern(pattern),
geoQuery(geoQuery)
{}
SearchInfo::SearchInfo(const RequestContext& request)
: pattern(request.get_optional_param<std::string>("pattern", "")),
geoQuery()
{ {
auto bookIds = selectBooks(request);
auto pattern = request.get_optional_param<std::string>("pattern", "");
GeoQuery geoQuery;
/* Retrive geo search */ /* Retrive geo search */
try { try {
auto latitude = request.get_argument<float>("latitude"); auto latitude = request.get_argument<float>("latitude");
@ -208,12 +200,15 @@ SearchInfo::SearchInfo(const RequestContext& request)
throw std::invalid_argument("No query provided."); throw std::invalid_argument("No query provided.");
} }
try { return SearchInfo(pattern, geoQuery, bookIds);
auto content_vector = request.get_arguments("content");
bookNames = std::set<std::string>(content_vector.begin(), content_vector.end());
} catch (const std::out_of_range&) {}
} }
SearchInfo::SearchInfo(const std::string& pattern, GeoQuery geoQuery, const Library::BookIdSet& bookIds)
: pattern(pattern),
geoQuery(geoQuery),
bookIds(bookIds)
{}
zim::Query SearchInfo::getZimQuery(bool verbose) const { zim::Query SearchInfo::getZimQuery(bool verbose) const {
zim::Query query; zim::Query query;
if (verbose) { if (verbose) {
@ -666,7 +661,8 @@ std::unique_ptr<Response> InternalServer::handle_search(const RequestContext& re
} }
try { try {
auto searchInfo = SearchInfo(request); auto searchInfo = getSearchInfo(request);
auto bookIds = searchInfo.getBookIds();
/* Make the search */ /* Make the search */
// Try to get a search from the searchInfo, else build it // Try to get a search from the searchInfo, else build it
@ -674,21 +670,6 @@ std::unique_ptr<Response> InternalServer::handle_search(const RequestContext& re
try { try {
search = searchCache.getOrPut(searchInfo, search = searchCache.getOrPut(searchInfo,
[=](){ [=](){
Library::BookIdSet bookIds;
if(!searchInfo.bookNames.empty()) {
for(const auto& bookName: searchInfo.bookNames) {
try {
auto bookId = mp_nameMapper->getIdForName(bookName);
bookIds.insert(bookId);
} catch(const std::out_of_range&) {
throw std::invalid_argument("The requested book doesn't exist.");
}
}
} else {
for (auto& bookId: mp_library->filter(kiwix::Filter().local(true).valid(true))) {
bookIds.insert(bookId);
}
}
auto searcher = mp_library->getSearcherByIds(bookIds); auto searcher = mp_library->getSearcherByIds(bookIds);
return make_shared<zim::Search>(searcher->search(searchInfo.getZimQuery(m_verbose.load()))); return make_shared<zim::Search>(searcher->search(searchInfo.getZimQuery(m_verbose.load())));
} }
@ -702,9 +683,9 @@ std::unique_ptr<Response> InternalServer::handle_search(const RequestContext& re
"404-page-heading", "404-page-heading",
cssUrl); cssUrl);
response += nonParameterizedMessage("no-search-results"); response += nonParameterizedMessage("no-search-results");
if(searchInfo.bookNames.size() == 1) { if(bookIds.size() == 1) {
auto bookName =*searchInfo.bookNames.begin(); auto bookId = *bookIds.begin();
auto bookId = mp_nameMapper->getIdForName(bookName); auto bookName = mp_nameMapper->getNameForId(bookId);
response += TaskbarInfo(bookName, mp_library->getArchiveById(bookId).get()); response += TaskbarInfo(bookName, mp_library->getArchiveById(bookId).get());
} }
return response; return response;
@ -736,9 +717,9 @@ std::unique_ptr<Response> InternalServer::handle_search(const RequestContext& re
renderer.setSearchProtocolPrefix(m_root + "/search"); renderer.setSearchProtocolPrefix(m_root + "/search");
renderer.setPageLength(pageLength); renderer.setPageLength(pageLength);
auto response = ContentResponse::build(*this, renderer.getHtml(), "text/html; charset=utf-8"); auto response = ContentResponse::build(*this, renderer.getHtml(), "text/html; charset=utf-8");
if(searchInfo.bookNames.size() == 1) { if(bookIds.size() == 1) {
auto bookName = *searchInfo.bookNames.begin(); auto bookId = *bookIds.begin();
auto bookId = mp_nameMapper->getIdForName(bookName); auto bookName = mp_nameMapper->getNameForId(bookId);
response->set_taskbar(bookName, mp_library->getArchiveById(bookId).get()); response->set_taskbar(bookName, mp_library->getArchiveById(bookId).get());
} }
return std::move(response); return std::move(response);

View File

@ -68,22 +68,21 @@ struct GeoQuery {
class SearchInfo { class SearchInfo {
public: public:
SearchInfo(const std::string& pattern); SearchInfo(const std::string& pattern, GeoQuery geoQuery, const Library::BookIdSet& bookIds);
SearchInfo(const std::string& pattern, GeoQuery geoQuery);
SearchInfo(const RequestContext& request);
zim::Query getZimQuery(bool verbose) const; zim::Query getZimQuery(bool verbose) const;
const Library::BookIdSet& getBookIds() const { return bookIds; }
friend bool operator<(const SearchInfo& l, const SearchInfo& r) friend bool operator<(const SearchInfo& l, const SearchInfo& r)
{ {
return std::tie(l.bookNames, l.pattern, l.geoQuery) return std::tie(l.bookIds, l.pattern, l.geoQuery)
< std::tie(r.bookNames, r.pattern, r.geoQuery); // keep the same order < std::tie(r.bookIds, r.pattern, r.geoQuery); // keep the same order
} }
public: //data public: //data
std::string pattern; std::string pattern;
GeoQuery geoQuery; GeoQuery geoQuery;
std::set<std::string> bookNames; Library::BookIdSet bookIds;
}; };
@ -150,6 +149,7 @@ class InternalServer {
bool etag_not_needed(const RequestContext& r) const; bool etag_not_needed(const RequestContext& r) const;
ETag get_matching_if_none_match_etag(const RequestContext& request) const; ETag get_matching_if_none_match_etag(const RequestContext& request) const;
Library::BookIdSet selectBooks(const RequestContext& r) const; Library::BookIdSet selectBooks(const RequestContext& r) const;
SearchInfo getSearchInfo(const RequestContext& r) const;
private: // data private: // data
std::string m_addr; std::string m_addr;