Add the exclude flag to notmuch_query_search_threads

---
 lib/notmuch-private.h |   17 +++++++++++------
 lib/query.cc          |    1 +
 lib/thread.cc         |   18 +++++++++++++++---
 3 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h
index 7bf153e..56b87c6 100644
--- a/lib/notmuch-private.h
+++ b/lib/notmuch-private.h
@@ -211,12 +211,8 @@ _notmuch_directory_get_document_id (notmuch_directory_t 
*directory);

 /* thread.cc */

-notmuch_thread_t *
-_notmuch_thread_create (void *ctx,
-                       notmuch_database_t *notmuch,
-                       unsigned int seed_doc_id,
-                       notmuch_doc_id_set_t *match_set,
-                       notmuch_sort_t sort);
+/* Definition of _notmuch_thread_create moved later since now uses
+ * string_list_t */

 /* message.cc */

@@ -401,6 +397,7 @@ typedef struct _notmuch_message_list {
  */
 struct visible _notmuch_messages {
     notmuch_bool_t is_of_list_type;
+    notmuch_doc_id_set_t *excluded_doc_ids;
     notmuch_message_node_t *iterator;
 };

@@ -491,6 +488,14 @@ notmuch_filenames_t *
 _notmuch_filenames_create (const void *ctx,
                           notmuch_string_list_t *list);

+notmuch_thread_t *
+_notmuch_thread_create (void *ctx,
+                       notmuch_database_t *notmuch,
+                       unsigned int seed_doc_id,
+                       notmuch_doc_id_set_t *match_set,
+                       notmuch_string_list_t *excluded_terms,
+                       notmuch_sort_t sort);
+
 #pragma GCC visibility pop

 NOTMUCH_END_DECLS
diff --git a/lib/query.cc b/lib/query.cc
index 8ffafe5..de95745 100644
--- a/lib/query.cc
+++ b/lib/query.cc
@@ -456,6 +456,7 @@ notmuch_threads_get (notmuch_threads_t *threads)
                                   threads->query->notmuch,
                                   doc_id,
                                   &threads->match_set,
+                                  threads->query->exclude_terms,
                                   threads->query->sort);
 }

diff --git a/lib/thread.cc b/lib/thread.cc
index 0435ee6..6d65d52 100644
--- a/lib/thread.cc
+++ b/lib/thread.cc
@@ -214,7 +214,8 @@ _thread_cleanup_author (notmuch_thread_t *thread,
  */
 static void
 _thread_add_message (notmuch_thread_t *thread,
-                    notmuch_message_t *message)
+                    notmuch_message_t *message,
+                    notmuch_string_list_t *exclude_terms)
 {
     notmuch_tags_t *tags;
     const char *tag;
@@ -262,6 +263,15 @@ _thread_add_message (notmuch_thread_t *thread,
         notmuch_tags_move_to_next (tags))
     {
        tag = notmuch_tags_get (tags);
+       /* mark excluded messages */
+       for (notmuch_string_node_t *term = exclude_terms->head; term;
+            term = term->next) {
+           /* we ignore initial 'K' */
+           if (strcmp(tag, (term->string + 1)) == 0) {
+               notmuch_message_set_flag (message, 
NOTMUCH_MESSAGE_FLAG_EXCLUDED, TRUE);
+               break;
+           }
+       }
        g_hash_table_insert (thread->tags, xstrdup (tag), NULL);
     }
 }
@@ -321,7 +331,8 @@ _thread_add_matched_message (notmuch_thread_t *thread,
            _thread_set_subject_from_message (thread, message);
     }

-    thread->matched_messages++;
+    if (!notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_EXCLUDED))
+       thread->matched_messages++;

     if (g_hash_table_lookup_extended (thread->message_hash,
                            notmuch_message_get_message_id (message), NULL,
@@ -392,6 +403,7 @@ _notmuch_thread_create (void *ctx,
                        notmuch_database_t *notmuch,
                        unsigned int seed_doc_id,
                        notmuch_doc_id_set_t *match_set,
+                       notmuch_string_list_t *exclude_terms,
                        notmuch_sort_t sort)
 {
     notmuch_thread_t *thread;
@@ -467,7 +479,7 @@ _notmuch_thread_create (void *ctx,
        if (doc_id == seed_doc_id)
            message = seed_message;

-       _thread_add_message (thread, message);
+       _thread_add_message (thread, message, exclude_terms);

        if ( _notmuch_doc_id_set_contains (match_set, doc_id)) {
            _notmuch_doc_id_set_remove (match_set, doc_id);
-- 
1.7.2.3

Reply via email to