From 6c071d940b9aee611fdd3e55e92a4ee4c43a9fdb Mon Sep 17 00:00:00 2001 From: djcb Date: Wed, 19 Sep 2012 16:55:44 +0300 Subject: [PATCH] * lib: for sorting dates, use the strings as recorded in Xapian, rather than converting to time_t; this saves ~ 5% when we list threaded results --- lib/mu-msg-doc.cc | 8 +++++++- lib/mu-msg.c | 11 +++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/mu-msg-doc.cc b/lib/mu-msg-doc.cc index da59bf38..a7c93c1f 100644 --- a/lib/mu-msg-doc.cc +++ b/lib/mu-msg-doc.cc @@ -67,7 +67,13 @@ mu_msg_doc_get_str_field (MuMsgDoc *self, MuMsgFieldId mfid) { g_return_val_if_fail (self, NULL); g_return_val_if_fail (mu_msg_field_id_is_valid(mfid), NULL); - g_return_val_if_fail (mu_msg_field_is_string(mfid), NULL); + + // disable this check: + // g_return_val_if_fail (mu_msg_field_is_string(mfid), NULL); + // because it's useful to get numerical field as strings, + // for example when sorting (which is much faster if don't + // have to convert to numbers first, esp. when it's a date + // time_t) try { const std::string s (self->doc().get_value(mfid)); diff --git a/lib/mu-msg.c b/lib/mu-msg.c index 1df52e92..8ba92d03 100644 --- a/lib/mu-msg.c +++ b/lib/mu-msg.c @@ -779,14 +779,17 @@ mu_msg_cmp (MuMsg *m1, MuMsg *m2, MuMsgFieldId mfid) g_return_val_if_fail (m2, 0); g_return_val_if_fail (mu_msg_field_id_is_valid(mfid), 0); + /* even though date is a numeric field, we can sort it by its + * string repr. in the database, which is much faster */ + if (mfid == MU_MSG_FIELD_ID_DATE || + mu_msg_field_is_string (mfid)) + return cmp_str (get_str_field (m1, mfid), + get_str_field (m2, mfid)); + if (mfid == MU_MSG_FIELD_ID_SUBJECT) return cmp_subject (get_str_field (m1, mfid), get_str_field (m2, mfid)); - if (mu_msg_field_is_string (mfid)) - return cmp_str (get_str_field (m1, mfid), - get_str_field (m2, mfid)); - /* TODO: note, we cast (potentially > MAXINT to int) */ if (mu_msg_field_is_numeric (mfid)) return get_num_field(m1, mfid) - get_num_field(m2, mfid);