]> git.notmuchmail.org Git - notmuch/blobdiff - lib/thread-fp.cc
emacs: Add new option notmuch-search-hide-excluded
[notmuch] / lib / thread-fp.cc
index 1ab2ae354f9e2c10f3329a2a135692b6644439c4..3aa9c4238c6f80a6d2e9d359006e0b1b2ea9bc44 100644 (file)
@@ -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
 #include "thread-fp.h"
 #include <iostream>
 
-#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<std::string> 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