From: David Bremner Date: Sun, 28 Jan 2018 02:50:42 +0000 (-0400) Subject: lib: define specialized get_thread_id for use in thread subquery X-Git-Tag: 0.27_rc0~31 X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=commitdiff_plain;h=f0131af6c59704e29d58eb74ed5e4bc298455272;hp=60fcec82d2a8041ba3ee9fc6413cd404659e38dc lib: define specialized get_thread_id for use in thread subquery The observation is that we are only using the messages to get there thread_id, which is kindof a pessimal access pattern for the current notmuch_message_get_thread_id --- diff --git a/lib/message.cc b/lib/message.cc index d5db89b6..b2067076 100644 --- a/lib/message.cc +++ b/lib/message.cc @@ -318,6 +318,23 @@ _notmuch_message_get_term (notmuch_message_t *message, return value; } +/* + * For special applications where we only want the thread id, reading + * in all metadata is a heavy I/O penalty. + */ +const char * +_notmuch_message_get_thread_id_only (notmuch_message_t *message) +{ + + Xapian::TermIterator i = message->doc.termlist_begin (); + Xapian::TermIterator end = message->doc.termlist_end (); + + message->thread_id = _notmuch_message_get_term (message, i, end, + _find_prefix ("thread")); + return message->thread_id; +} + + static void _notmuch_message_ensure_metadata (notmuch_message_t *message, void *field) { diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h index 1093429c..4598577f 100644 --- a/lib/notmuch-private.h +++ b/lib/notmuch-private.h @@ -537,6 +537,10 @@ _notmuch_message_database (notmuch_message_t *message); void _notmuch_message_remove_unprefixed_terms (notmuch_message_t *message); + +const char * +_notmuch_message_get_thread_id_only(notmuch_message_t *message); + /* sha1.c */ char * diff --git a/lib/thread-fp.cc b/lib/thread-fp.cc index 75339ffa..73277006 100644 --- a/lib/thread-fp.cc +++ b/lib/thread-fp.cc @@ -52,7 +52,7 @@ ThreadFieldProcessor::operator() (const std::string & str) std::string term = thread_prefix; notmuch_message_t *message; message = notmuch_messages_get (messages); - term += notmuch_message_get_thread_id (message); + term += _notmuch_message_get_thread_id_only (message); terms.insert (term); } return Xapian::Query (Xapian::Query::OP_OR, terms.begin (), terms.end ());