X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=lib%2Fthread-fp.cc;h=97a65211992654b629269a74bdde0d6bbf82504f;hp=1ab2ae354f9e2c10f3329a2a135692b6644439c4;hb=HEAD;hpb=4f5bbaf7e2cecfe5022ba4b28915cccfb7ccb12d diff --git a/lib/thread-fp.cc b/lib/thread-fp.cc index 1ab2ae35..3aa9c423 100644 --- a/lib/thread-fp.cc +++ b/lib/thread-fp.cc @@ -2,7 +2,7 @@ * * This file is part of notmuch. * - * Copyright © 2017 David Bremner + * Copyright © 2018 David Bremner * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,45 +24,35 @@ #include "thread-fp.h" #include -#if HAVE_XAPIAN_FIELD_PROCESSOR - Xapian::Query ThreadFieldProcessor::operator() (const std::string & str) { notmuch_status_t status; + const char *thread_prefix = _find_prefix ("thread"); if (str.at (0) == '{') { - if (str.length() > 1 && str.at (str.size () - 1) == '}'){ - 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 terms; - - if (!subquery) - throw Xapian::QueryParserError ("failed to create subquery for '" + subquery_str + "'"); - + if (str.size () <= 1 || str.at (str.size () - 1) != '}') { + throw Xapian::QueryParserError ("missing } in '" + str + "'"); + } else { + Xapian::Query subquery; + Xapian::Query query; + std::string msg; + std::string subquery_str = str.substr (1, str.size () - 2); - status = notmuch_query_search_messages (subquery, &messages); + status = _notmuch_query_string_to_xapian_query (notmuch, subquery_str, subquery, msg); if (status) - throw Xapian::QueryParserError ("failed to search messages for '" + subquery_str + "'"); + throw Xapian::QueryParserError (msg); + status = _notmuch_query_expand (notmuch, "thread", subquery, query, msg); + if (status) + throw Xapian::QueryParserError (msg); - for (; notmuch_messages_valid (messages); notmuch_messages_move_to_next (messages)) { - std::string term = "G"; - notmuch_message_t *message; - message = notmuch_messages_get (messages); - term += notmuch_message_get_thread_id (message); - terms.insert (term); - } - return Xapian::Query (Xapian::Query::OP_OR, terms.begin(), terms.end()); - } else { - throw Xapian::QueryParserError ("missing } in '" + str + "'"); + return query; } } else { /* literal thread id */ - std::string term = "G"+str; + std::string term = thread_prefix + str; return Xapian::Query (term); } } -#endif