[PATCH 4/7] lib: Add the exclude flag to notmuch_query_search_threads
On Mon, 30 Jan 2012 23:50:20 -0500, Austin Clements wrote: > Quoth Mark Walters on Jan 29 at 6:39 pm: > > Add the NOTMUCH_MESSAGE_FLAG_EXCLUDED flag to > > notmuch_query_search_threads. Implemented by inspecting the tags > > directly in _notmuch_thread_create/_thread_add_message rather than as > > a Xapian query for speed reasons. > > --- > > lib/notmuch-private.h | 16 ++-- > > lib/query.cc |1 + > > lib/thread.cc | 18 +++--- > > 3 files changed, 26 insertions(+), 9 deletions(-) > > > > diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h > > index e791bb0..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 */ > > Naw, leave the definition here along with the other things from > thread.cc and just add a > > typedef struct _notmuch_string_list notmuch_string_list_t; > > along with the typedef for notmuch_doc_id_set_t near the top. (You > might also have to tweak the typedef of notmuch_string_list_t later so > it's just the struct definition.) Will do. > > /* message.cc */ > > > > @@ -492,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 7d165d2..dee7ec0 100644 > > --- a/lib/query.cc > > +++ b/lib/query.cc > > @@ -472,6 +472,7 @@ notmuch_threads_get (notmuch_threads_t *threads) > >threads->query->notmuch, > >doc_id, > >>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 */ > > Capital and period. Will fix. > > + for (notmuch_string_node_t *term = exclude_terms->head; term; > > +term = term->next) { > > + /* we ignore initial 'K' */ > > Same. Will fix > > + 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++; > > I'd still say this warrants a better API. I agree: I will think about that. > > 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 (
[PATCH 4/7] lib: Add the exclude flag to notmuch_query_search_threads
Quoth Mark Walters on Jan 29 at 6:39 pm: > Add the NOTMUCH_MESSAGE_FLAG_EXCLUDED flag to > notmuch_query_search_threads. Implemented by inspecting the tags > directly in _notmuch_thread_create/_thread_add_message rather than as > a Xapian query for speed reasons. Hmm. Won't the thread sort be influenced by excluded messages? It's not completely obvious to me if it should or shouldn't be. If excluded messages are counted for thread sorting, it would be very natural to toggle their visibility in the search view; otherwise we probably need to perform the entire query again with exclusions disabled. If we do want to ignore excluded messages for sorting, I think notmuch_query_search_threads can simply shuffle excluded messages to the end of doc_ids (which is slightly awkward to implement, but not too bad).
Re: [PATCH 4/7] lib: Add the exclude flag to notmuch_query_search_threads
On Mon, 30 Jan 2012 23:50:20 -0500, Austin Clements amdra...@mit.edu wrote: Quoth Mark Walters on Jan 29 at 6:39 pm: Add the NOTMUCH_MESSAGE_FLAG_EXCLUDED flag to notmuch_query_search_threads. Implemented by inspecting the tags directly in _notmuch_thread_create/_thread_add_message rather than as a Xapian query for speed reasons. --- lib/notmuch-private.h | 16 ++-- lib/query.cc |1 + lib/thread.cc | 18 +++--- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h index e791bb0..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 */ Naw, leave the definition here along with the other things from thread.cc and just add a typedef struct _notmuch_string_list notmuch_string_list_t; along with the typedef for notmuch_doc_id_set_t near the top. (You might also have to tweak the typedef of notmuch_string_list_t later so it's just the struct definition.) Will do. /* message.cc */ @@ -492,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 7d165d2..dee7ec0 100644 --- a/lib/query.cc +++ b/lib/query.cc @@ -472,6 +472,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 */ Capital and period. Will fix. + for (notmuch_string_node_t *term = exclude_terms-head; term; +term = term-next) { + /* we ignore initial 'K' */ Same. Will fix + 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++; I'd still say this warrants a better API. I agree: I will think about that. 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); ___ notmuch mailing list notmuch@notmuchmail.org
[PATCH 4/7] lib: Add the exclude flag to notmuch_query_search_threads
Quoth Mark Walters on Jan 29 at 6:39 pm: > Add the NOTMUCH_MESSAGE_FLAG_EXCLUDED flag to > notmuch_query_search_threads. Implemented by inspecting the tags > directly in _notmuch_thread_create/_thread_add_message rather than as > a Xapian query for speed reasons. > --- > lib/notmuch-private.h | 16 ++-- > lib/query.cc |1 + > lib/thread.cc | 18 +++--- > 3 files changed, 26 insertions(+), 9 deletions(-) > > diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h > index e791bb0..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 */ Naw, leave the definition here along with the other things from thread.cc and just add a typedef struct _notmuch_string_list notmuch_string_list_t; along with the typedef for notmuch_doc_id_set_t near the top. (You might also have to tweak the typedef of notmuch_string_list_t later so it's just the struct definition.) > > /* message.cc */ > > @@ -492,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 7d165d2..dee7ec0 100644 > --- a/lib/query.cc > +++ b/lib/query.cc > @@ -472,6 +472,7 @@ notmuch_threads_get (notmuch_threads_t *threads) > threads->query->notmuch, > doc_id, > >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 */ Capital and period. > + for (notmuch_string_node_t *term = exclude_terms->head; term; > + term = term->next) { > + /* we ignore initial 'K' */ Same. > + 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++; I'd still say this warrants a better API. > > 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);
Re: [PATCH 4/7] lib: Add the exclude flag to notmuch_query_search_threads
Quoth Mark Walters on Jan 29 at 6:39 pm: Add the NOTMUCH_MESSAGE_FLAG_EXCLUDED flag to notmuch_query_search_threads. Implemented by inspecting the tags directly in _notmuch_thread_create/_thread_add_message rather than as a Xapian query for speed reasons. --- lib/notmuch-private.h | 16 ++-- lib/query.cc |1 + lib/thread.cc | 18 +++--- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h index e791bb0..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 */ Naw, leave the definition here along with the other things from thread.cc and just add a typedef struct _notmuch_string_list notmuch_string_list_t; along with the typedef for notmuch_doc_id_set_t near the top. (You might also have to tweak the typedef of notmuch_string_list_t later so it's just the struct definition.) /* message.cc */ @@ -492,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 7d165d2..dee7ec0 100644 --- a/lib/query.cc +++ b/lib/query.cc @@ -472,6 +472,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 */ Capital and period. + for (notmuch_string_node_t *term = exclude_terms-head; term; + term = term-next) { + /* we ignore initial 'K' */ Same. + 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++; I'd still say this warrants a better API. 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); ___ notmuch mailing list notmuch@notmuchmail.org http://notmuchmail.org/mailman/listinfo/notmuch
[PATCH 4/7] lib: Add the exclude flag to notmuch_query_search_threads
Add the NOTMUCH_MESSAGE_FLAG_EXCLUDED flag to notmuch_query_search_threads. Implemented by inspecting the tags directly in _notmuch_thread_create/_thread_add_message rather than as a Xapian query for speed reasons. --- lib/notmuch-private.h | 16 ++-- lib/query.cc |1 + lib/thread.cc | 18 +++--- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h index e791bb0..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 */ @@ -492,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 7d165d2..dee7ec0 100644 --- a/lib/query.cc +++ b/lib/query.cc @@ -472,6 +472,7 @@ notmuch_threads_get (notmuch_threads_t *threads) threads->query->notmuch, doc_id, >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
[PATCH 4/7] lib: Add the exclude flag to notmuch_query_search_threads
Add the NOTMUCH_MESSAGE_FLAG_EXCLUDED flag to notmuch_query_search_threads. Implemented by inspecting the tags directly in _notmuch_thread_create/_thread_add_message rather than as a Xapian query for speed reasons. --- lib/notmuch-private.h | 16 ++-- lib/query.cc |1 + lib/thread.cc | 18 +++--- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h index e791bb0..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 */ @@ -492,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 7d165d2..dee7ec0 100644 --- a/lib/query.cc +++ b/lib/query.cc @@ -472,6 +472,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 ___ notmuch mailing list notmuch@notmuchmail.org http://notmuchmail.org/mailman/listinfo/notmuch