Make notmuch_query_search_messages set the exclude flag

Exclude flag will be added to notmuch_query_search threads later.
---
 lib/notmuch.h |    3 ++-
 lib/query.cc  |   34 +++++++++++++++++++++++++++++++---
 2 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/lib/notmuch.h b/lib/notmuch.h
index 7929fe7..cf0d45d 100644
--- a/lib/notmuch.h
+++ b/lib/notmuch.h
@@ -895,7 +895,8 @@ notmuch_message_get_filenames (notmuch_message_t *message);

 /* Message flags */
 typedef enum _notmuch_message_flag {
-    NOTMUCH_MESSAGE_FLAG_MATCH
+    NOTMUCH_MESSAGE_FLAG_MATCH,
+    NOTMUCH_MESSAGE_FLAG_EXCLUDED
 } notmuch_message_flag_t;

 /* Get a value of a flag for the email corresponding to 'message'. */
diff --git a/lib/query.cc b/lib/query.cc
index c25b301..8ffafe5 100644
--- a/lib/query.cc
+++ b/lib/query.cc
@@ -57,6 +57,12 @@ struct visible _notmuch_threads {
     notmuch_doc_id_set_t match_set;
 };

+/* we need this in the message functions so forward declare */
+static notmuch_bool_t
+_notmuch_doc_id_set_init (void *ctx,
+                         notmuch_doc_id_set_t *doc_ids,
+                         GArray *arr);
+
 notmuch_query_t *
 notmuch_query_create (notmuch_database_t *notmuch,
                      const char *query_string)
@@ -173,6 +179,7 @@ notmuch_query_search_messages (notmuch_query_t *query)
                                                   "mail"));
        Xapian::Query string_query, final_query, exclude_query;
        Xapian::MSet mset;
+       Xapian::MSetIterator iterator;
        unsigned int flags = (Xapian::QueryParser::FLAG_BOOLEAN |
                              Xapian::QueryParser::FLAG_PHRASE |
                              Xapian::QueryParser::FLAG_LOVEHATE |
@@ -190,11 +197,28 @@ notmuch_query_search_messages (notmuch_query_t *query)
            final_query = Xapian::Query (Xapian::Query::OP_AND,
                                         mail_query, string_query);
        }
+       if (query->exclude_terms) {
+           exclude_query = _notmuch_exclude_tags (query, final_query);
+           exclude_query = Xapian::Query (Xapian::Query::OP_AND,
+                                          exclude_query, final_query);

-       exclude_query = _notmuch_exclude_tags (query, final_query);
+           enquire.set_weighting_scheme (Xapian::BoolWeight());
+           enquire.set_query (exclude_query);

-       final_query = Xapian::Query (Xapian::Query::OP_AND_NOT,
-                                        final_query, exclude_query);
+           mset = enquire.get_mset (0, notmuch->xapian_db->get_doccount ());
+
+           GArray *excluded_doc_ids = g_array_new (FALSE, FALSE, sizeof 
(unsigned int));
+
+           for (iterator = mset.begin (); iterator != mset.end (); iterator++)
+           {
+               unsigned int doc_id = *iterator;
+               g_array_append_val (excluded_doc_ids, doc_id);
+           }
+           messages->base.excluded_doc_ids = talloc (query, 
_notmuch_doc_id_set);
+           _notmuch_doc_id_set_init (query, messages->base.excluded_doc_ids,
+                                 excluded_doc_ids);
+       } else
+           messages->base.excluded_doc_ids = NULL;

        enquire.set_weighting_scheme (Xapian::BoolWeight());

@@ -283,6 +307,10 @@ _notmuch_mset_messages_get (notmuch_messages_t *messages)
        INTERNAL_ERROR ("a messages iterator contains a non-existent document 
ID.\n");
     }

+    if ((messages->excluded_doc_ids) &&
+       (_notmuch_doc_id_set_contains (messages->excluded_doc_ids, doc_id)))
+       notmuch_message_set_flag (message, NOTMUCH_MESSAGE_FLAG_EXCLUDED, TRUE);
+
     return message;
 }

-- 
1.7.2.3

Reply via email to