From 7407f30790e03d6ed8dd396110bd3ed14f71d665 Mon Sep 17 00:00:00 2001 From: Matthieu Gautier Date: Wed, 9 Mar 2022 14:49:17 +0100 Subject: [PATCH] Better cache usage. It is better to directly try to get the `Search` from the cache instead of getting the `Searcher` first which could be useless in Search already exist. --- src/server/internalServer.cpp | 36 ++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/server/internalServer.cpp b/src/server/internalServer.cpp index 54f0c311a..14aaf3a68 100644 --- a/src/server/internalServer.cpp +++ b/src/server/internalServer.cpp @@ -567,22 +567,31 @@ std::unique_ptr InternalServer::handle_search(const RequestContext& re } } + /* Make the search */ - std::shared_ptr searcher; - if (archive) { - searcher = searcherCache.getOrPut(bookId, [=](){ return std::make_shared(*archive);}); - } else { - for (auto& bookId: mp_library->filter(kiwix::Filter().local(true).valid(true))) { - auto currentArchive = mp_library->getArchiveById(bookId); - if (currentArchive) { - if (! searcher) { - searcher = std::make_shared(*currentArchive); - } else { - searcher->addArchive(*currentArchive); + // Try to get a search from the searchInfo, else build it + std::shared_ptr search; + search = searchCache.getOrPut(searchInfo, + [=](){ + std::shared_ptr searcher; + if (archive) { + searcher = searcherCache.getOrPut(bookId, [=](){ return std::make_shared(*archive);}); + } else { + for (auto& bookId: mp_library->filter(kiwix::Filter().local(true).valid(true))) { + auto currentArchive = mp_library->getArchiveById(bookId); + if (currentArchive) { + if (! searcher) { + searcher = std::make_shared(*currentArchive); + } else { + searcher->addArchive(*currentArchive); + } + } } } + return make_shared(searcher->search(searchInfo.getZimQuery(m_verbose.load()))); } - } + ); + auto start = 0; try { @@ -601,9 +610,6 @@ std::unique_ptr InternalServer::handle_search(const RequestContext& re } /* Get the results */ - std::shared_ptr search; - search = searchCache.getOrPut(searchInfo, [=](){ return make_shared(searcher->search(searchInfo.getZimQuery(m_verbose.load())));}); - SearchRenderer renderer(search->getResults(start, pageLength), mp_nameMapper, mp_library, start, search->getEstimatedMatches()); renderer.setSearchPattern(searchInfo.pattern);