[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