From bba8af8d51c812decb92fe2ccafca279d9c21716 Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Sat, 13 Feb 2021 00:48:07 +0200 Subject: [PATCH] mu-query: tweaks threaded/threaded querying --- lib/mu-query.cc | 38 +++++++++++++++++++------------------- lib/mu-query.hh | 11 ++++++++++- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/lib/mu-query.cc b/lib/mu-query.cc index 3d6f3fa2..dd91aa71 100644 --- a/lib/mu-query.cc +++ b/lib/mu-query.cc @@ -164,7 +164,7 @@ Query::Private::run_singular (const std::string& expr, MuMsgFieldId sortfieldid, const auto threading{any_of(qflags & QueryFlags::Threading)}; DeciderInfo minfo{}; - #pragma GCC diagnostic push +#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wextra" auto enq{make_enquire(expr, threading ? MU_MSG_FIELD_ID_DATE : sortfieldid, qflags)}; #pragma GCC diagnostic ignored "-Wswitch-default" @@ -173,10 +173,8 @@ Query::Private::run_singular (const std::string& expr, MuMsgFieldId sortfieldid, mset.fetch(); auto qres{QueryResults{mset, std::move(minfo.matches)}}; - if (!threading) - return qres; - else - return run_threaded(qres, enq, qflags); + + return threading ? run_threaded(qres, enq, qflags) : qres; } @@ -194,26 +192,24 @@ Query::Private::run_related (const std::string& expr, MuMsgFieldId sortfieldid, const auto leader_qflags{QueryFlags::Leader | QueryFlags::GatherThreadIds}; const auto threading{any_of(qflags & QueryFlags::Threading)}; - // Run our first, "leader" query; + // Run our first, "leader" query DeciderInfo minfo{}; - auto enq{make_enquire(expr, MU_MSG_FIELD_ID_DATE, leader_qflags)}; + auto enq{make_enquire(expr, sortfieldid, leader_qflags)}; const auto mset{enq.get_mset(0, maxnum, {}, make_leader_decider(leader_qflags, minfo).get())}; - // Now, determine the "related query". In the threaded-case, we search - // among _all_ messages, since complete threads are preferred; no need - // to sort in that case since the search is unlimited and the sorting - // happens during threading. + // Now, determine the "related query". + // + // In the threaded-case, we search among _all_ messages, since complete + // threads are preferred; no need to sort in that case since the search + // is unlimited and the sorting happens during threading. auto r_enq{make_related_enquire(enq.get_query(), minfo.thread_ids, threading ? MU_MSG_FIELD_ID_NONE : sortfieldid, qflags)}; const auto r_mset{r_enq.get_mset(0, threading ? store_.size() : maxnum, {}, make_related_decider(qflags, minfo).get())}; - auto qres{QueryResults{r_mset, std::move(minfo.matches)}}; - if (!threading) - return qres; - else - return run_threaded(qres, r_enq, qflags); + + return threading ? run_threaded(qres, r_enq, qflags) : qres; } Option @@ -221,11 +217,15 @@ Query::Private::run (const std::string& expr, MuMsgFieldId sortfieldid, QueryFlags qflags, size_t maxnum) const { const auto eff_maxnum{maxnum == 0 ? store_.size() : maxnum}; - +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wextra" + const auto eff_sortfield{sortfieldid == MU_MSG_FIELD_ID_NONE ? + MU_MSG_FIELD_ID_DATE : sortfieldid }; +#pragma GCC diagnostic pop if (any_of(qflags & QueryFlags::IncludeRelated)) - return run_related (expr, sortfieldid, qflags, eff_maxnum); + return run_related (expr, eff_sortfield, qflags, eff_maxnum); else - return run_singular(expr, sortfieldid, qflags, eff_maxnum); + return run_singular(expr, eff_sortfield, qflags, eff_maxnum); } diff --git a/lib/mu-query.hh b/lib/mu-query.hh index d40b1417..24a6c5f4 100644 --- a/lib/mu-query.hh +++ b/lib/mu-query.hh @@ -52,7 +52,16 @@ public: */ Query(Query&& other); - + /** + * Run a query on the store + * + * @param expr the search expression + * @param sortfieldid the sortfield-id. If the field is NONE, sort by DATE + * @param flags query flags + * @param maxnum maximum number of results to return. 0 for 'no limit' + * + * @return the query-results, or Nothing in case of error. + */ Option run(const std::string& expr="", MuMsgFieldId sortfieldid=MU_MSG_FIELD_ID_NONE, QueryFlags flags=QueryFlags::None,