[PATCH 2/4] Add exclude flag

Mark Walters markwalters1009 at gmail.com
Sat Jan 28 16:04:02 PST 2012


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



More information about the notmuch mailing list