mu-query: sort "related" input by date
When doing 'related' searches, sort the initial (bounded) query results by date, so we get the newest (or oldest)
This commit is contained in:
@ -100,7 +100,6 @@ Query::Private::make_enquire (const std::string& expr,
|
|||||||
return maybe_sort (enq, sortfieldid, qflags);
|
return maybe_sort (enq, sortfieldid, qflags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Xapian::Enquire
|
Xapian::Enquire
|
||||||
Query::Private::make_related_enquire (const Xapian::Query& first_q,
|
Query::Private::make_related_enquire (const Xapian::Query& first_q,
|
||||||
const StringSet& thread_ids,
|
const StringSet& thread_ids,
|
||||||
@ -158,11 +157,21 @@ Option<QueryResults>
|
|||||||
Query::Private::run_singular (const std::string& expr, MuMsgFieldId sortfieldid,
|
Query::Private::run_singular (const std::string& expr, MuMsgFieldId sortfieldid,
|
||||||
QueryFlags qflags, size_t maxnum) const
|
QueryFlags qflags, size_t maxnum) const
|
||||||
{
|
{
|
||||||
|
// i.e. a query _without_ related messages, but still possibly
|
||||||
|
// with threading.
|
||||||
|
//
|
||||||
|
// In the threading case, the sortfield-id is ignored, we always sort by
|
||||||
|
// date (since threading the threading results are always by date.)
|
||||||
|
|
||||||
const auto singular_qflags{qflags | QueryFlags::Leader};
|
const auto singular_qflags{qflags | QueryFlags::Leader};
|
||||||
const auto threading{any_of(qflags & QueryFlags::Threading)};
|
const auto threading{any_of(qflags & QueryFlags::Threading)};
|
||||||
|
|
||||||
DeciderInfo minfo{};
|
DeciderInfo minfo{};
|
||||||
auto enq{make_enquire(expr, threading ? MU_MSG_FIELD_ID_NONE : sortfieldid, qflags)};
|
#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"
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
auto mset{enq.get_mset(0, maxnum, {}, make_leader_decider(singular_qflags, minfo).get())};
|
auto mset{enq.get_mset(0, maxnum, {}, make_leader_decider(singular_qflags, minfo).get())};
|
||||||
|
|
||||||
auto qres{QueryResults{mset, std::move(minfo.matches)}};
|
auto qres{QueryResults{mset, std::move(minfo.matches)}};
|
||||||
@ -177,17 +186,26 @@ Option<QueryResults>
|
|||||||
Query::Private::run_related (const std::string& expr, MuMsgFieldId sortfieldid,
|
Query::Private::run_related (const std::string& expr, MuMsgFieldId sortfieldid,
|
||||||
QueryFlags qflags, size_t maxnum) const
|
QueryFlags qflags, size_t maxnum) const
|
||||||
{
|
{
|
||||||
const auto leader_qflags{qflags | QueryFlags::Leader | QueryFlags::GatherThreadIds};
|
// i.e. a query _with_ related messages and possibly with threading.
|
||||||
|
//
|
||||||
|
// In the threading case, the sortfield-id is ignored, we always sort by
|
||||||
|
// date (since threading the threading results are always by date.);
|
||||||
|
// moreover, in either threaded or non-threaded case, we sort the first
|
||||||
|
// ("leader") query by date, i.e, we prefer the newest or oldest
|
||||||
|
// (descending) messages.
|
||||||
|
const auto leader_qflags{QueryFlags::Leader | QueryFlags::GatherThreadIds};
|
||||||
const auto threading{any_of(qflags & QueryFlags::Threading)};
|
const auto threading{any_of(qflags & QueryFlags::Threading)};
|
||||||
|
|
||||||
// Run our first, "leader" query;
|
// Run our first, "leader" query;
|
||||||
DeciderInfo minfo{};
|
DeciderInfo minfo{};
|
||||||
auto enq{make_enquire(expr, MU_MSG_FIELD_ID_NONE, qflags)};
|
auto enq{make_enquire(expr, MU_MSG_FIELD_ID_DATE, leader_qflags)};
|
||||||
const auto mset{enq.get_mset(0, maxnum, {},
|
const auto mset{enq.get_mset(0, maxnum, {},
|
||||||
make_leader_decider(leader_qflags, minfo).get())};
|
make_leader_decider(leader_qflags, minfo).get())};
|
||||||
|
|
||||||
// Now, determine the "related query". In the threaded-case, we search
|
// Now, determine the "related query". In the threaded-case, we search
|
||||||
// among _all_ messages, since complete threads are preferred.
|
// 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,
|
auto r_enq{make_related_enquire(enq.get_query(), minfo.thread_ids,
|
||||||
threading ? MU_MSG_FIELD_ID_NONE : sortfieldid, qflags)};
|
threading ? MU_MSG_FIELD_ID_NONE : sortfieldid, qflags)};
|
||||||
const auto r_mset{r_enq.get_mset(0, threading ? store_.size() : maxnum,
|
const auto r_mset{r_enq.get_mset(0, threading ? store_.size() : maxnum,
|
||||||
|
|||||||
Reference in New Issue
Block a user