[PATCH 4/7] lib: Add the exclude flag to notmuch_query_search_threads

2012-01-31 Thread Mark Walters
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

2012-01-31 Thread Austin Clements
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

2012-01-31 Thread Mark Walters
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

2012-01-30 Thread Austin Clements
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

2012-01-30 Thread Austin Clements
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

2012-01-29 Thread Mark Walters
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

2012-01-29 Thread Mark Walters
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