The non-obvious choice of creating the query outside the factored-out code is so the the new function can be used with different query syntaxes. --- lib/database-private.h | 5 +++++ lib/query.cc | 26 ++++++++++++++++++++++++++ lib/thread-fp.cc | 25 +++++++++---------------- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/lib/database-private.h b/lib/database-private.h index 9706c17e..72b74807 100644 --- a/lib/database-private.h +++ b/lib/database-private.h @@ -300,4 +300,9 @@ _notmuch_database_setup_standard_query_fields (notmuch_database_t *notmuch); notmuch_status_t _notmuch_database_setup_user_query_fields (notmuch_database_t *notmuch); +/* query.cc */ +notmuch_status_t +_notmuch_query_expand_to_threads (notmuch_query_t *subquery, + Xapian::Query &output, std::string &msg); + #endif diff --git a/lib/query.cc b/lib/query.cc index 46bc1373..0916860e 100644 --- a/lib/query.cc +++ b/lib/query.cc @@ -796,3 +796,29 @@ notmuch_query_get_database (const notmuch_query_t *query) { return query->notmuch; } + +notmuch_status_t +_notmuch_query_expand_to_threads (notmuch_query_t *subquery, Xapian::Query &output, std::string &msg) +{ + notmuch_messages_t *messages; + std::set<std::string> terms; + notmuch_status_t status; + const std::string thread_prefix = _find_prefix ("thread"); + + status = notmuch_query_search_messages (subquery, &messages); + if (status) { + msg = "failed to search messages for subquery"; + return NOTMUCH_STATUS_ILLEGAL_ARGUMENT; + } + + for (; notmuch_messages_valid (messages); notmuch_messages_move_to_next (messages)) { + std::string term = thread_prefix; + notmuch_message_t *message; + message = notmuch_messages_get (messages); + term += _notmuch_message_get_thread_id_only (message); + terms.insert (term); + } + output = Xapian::Query (Xapian::Query::OP_OR, terms.begin (), terms.end ()); + + return NOTMUCH_STATUS_SUCCESS; +} diff --git a/lib/thread-fp.cc b/lib/thread-fp.cc index 06708ef2..d0680a22 100644 --- a/lib/thread-fp.cc +++ b/lib/thread-fp.cc @@ -34,28 +34,21 @@ ThreadFieldProcessor::operator() (const std::string & str) if (str.size () <= 1 || str.at (str.size () - 1) != '}') { throw Xapian::QueryParserError ("missing } in '" + str + "'"); } else { + notmuch_query_t *subquery; + Xapian::Query query; + std::string msg; std::string subquery_str = str.substr (1, str.size () - 2); - notmuch_query_t *subquery = notmuch_query_create (notmuch, subquery_str.c_str ()); - notmuch_messages_t *messages; - std::set<std::string> terms; + subquery = notmuch_query_create (notmuch, subquery_str.c_str ()); if (! subquery) - throw Xapian::QueryParserError ("failed to create subquery for '" + subquery_str + - "'"); + throw Xapian::QueryParserError ("failed to create subquery for '" + + subquery_str + "'"); - status = notmuch_query_search_messages (subquery, &messages); + status = _notmuch_query_expand_to_threads (subquery, query, msg); if (status) - throw Xapian::QueryParserError ("failed to search messages for '" + subquery_str + - "'"); + throw Xapian::QueryParserError (msg); - for (; notmuch_messages_valid (messages); notmuch_messages_move_to_next (messages)) { - std::string term = thread_prefix; - notmuch_message_t *message; - message = notmuch_messages_get (messages); - term += _notmuch_message_get_thread_id_only (message); - terms.insert (term); - } - return Xapian::Query (Xapian::Query::OP_OR, terms.begin (), terms.end ()); + return query; } } else { /* literal thread id */ -- 2.30.2 _______________________________________________ notmuch mailing list -- notmuch@notmuchmail.org To unsubscribe send an email to notmuch-leave@notmuchmail.org