mirror of https://github.com/kiwix/libkiwix.git
Use the newly introduced searcherCache for multizim searcher.
This commit is contained in:
parent
fd0edbba80
commit
854623618c
|
@ -153,6 +153,7 @@ class Library
|
||||||
typedef uint64_t Revision;
|
typedef uint64_t Revision;
|
||||||
typedef std::vector<std::string> BookIdCollection;
|
typedef std::vector<std::string> BookIdCollection;
|
||||||
typedef std::map<std::string, int> AttributeCounts;
|
typedef std::map<std::string, int> AttributeCounts;
|
||||||
|
typedef std::set<std::string> BookIdSet;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Library();
|
Library();
|
||||||
|
@ -208,7 +209,10 @@ class Library
|
||||||
|
|
||||||
DEPRECATED std::shared_ptr<Reader> getReaderById(const std::string& id);
|
DEPRECATED std::shared_ptr<Reader> getReaderById(const std::string& id);
|
||||||
std::shared_ptr<zim::Archive> getArchiveById(const std::string& id);
|
std::shared_ptr<zim::Archive> getArchiveById(const std::string& id);
|
||||||
std::shared_ptr<zim::Searcher> getSearcherById(const std::string& id);
|
std::shared_ptr<zim::Searcher> getSearcherById(const std::string& id) {
|
||||||
|
return getSearcherByIds(BookIdSet{id});
|
||||||
|
}
|
||||||
|
std::shared_ptr<zim::Searcher> getSearcherByIds(const BookIdSet& ids);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove a book from the library.
|
* Remove a book from the library.
|
||||||
|
|
|
@ -304,17 +304,21 @@ std::shared_ptr<zim::Archive> Library::getArchiveById(const std::string& id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<zim::Searcher> Library::getSearcherById(const std::string& id)
|
std::shared_ptr<zim::Searcher> Library::getSearcherByIds(const BookIdSet& ids)
|
||||||
{
|
{
|
||||||
std::set<std::string> ids {id};
|
assert(!ids.empty());
|
||||||
try {
|
try {
|
||||||
return mp_impl->mp_searcherCache->getOrPut(ids,
|
return mp_impl->mp_searcherCache->getOrPut(ids,
|
||||||
[&](){
|
[&](){
|
||||||
auto archive = getArchiveById(id);
|
std::vector<zim::Archive> archives;
|
||||||
if(!archive) {
|
for(auto& id:ids) {
|
||||||
throw std::invalid_argument("");
|
auto archive = getArchiveById(id);
|
||||||
|
if(!archive) {
|
||||||
|
throw std::invalid_argument("");
|
||||||
|
}
|
||||||
|
archives.push_back(*archive);
|
||||||
}
|
}
|
||||||
return std::make_shared<zim::Searcher>(*archive);
|
return std::make_shared<zim::Searcher>(archives);
|
||||||
});
|
});
|
||||||
} catch (std::invalid_argument&) {
|
} catch (std::invalid_argument&) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
|
@ -596,21 +596,15 @@ std::unique_ptr<Response> InternalServer::handle_search(const RequestContext& re
|
||||||
try {
|
try {
|
||||||
search = searchCache.getOrPut(searchInfo,
|
search = searchCache.getOrPut(searchInfo,
|
||||||
[=](){
|
[=](){
|
||||||
std::shared_ptr<zim::Searcher> searcher;
|
Library::BookIdSet bookIds;
|
||||||
if(!bookId.empty()) {
|
if(!bookId.empty()) {
|
||||||
searcher = mp_library->getSearcherById(bookId);
|
bookIds.insert(bookId);
|
||||||
} else {
|
} else {
|
||||||
for (auto& bookId: mp_library->filter(kiwix::Filter().local(true).valid(true))) {
|
for (auto& bookId: mp_library->filter(kiwix::Filter().local(true).valid(true))) {
|
||||||
auto currentArchive = mp_library->getArchiveById(bookId);
|
bookIds.insert(bookId);
|
||||||
if (currentArchive) {
|
}
|
||||||
if (! searcher) {
|
|
||||||
searcher = std::make_shared<zim::Searcher>(*currentArchive);
|
|
||||||
} else {
|
|
||||||
searcher->addArchive(*currentArchive);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
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())));
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in New Issue