*
* 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