]> git.cworth.org Git - obsolete/notmuch-old/commitdiff
lib: add function to get the number of threads matching a search
authorJani Nikula <jani@nikula.org>
Tue, 15 Nov 2011 20:08:48 +0000 (22:08 +0200)
committerDavid Bremner <bremner@debian.org>
Tue, 15 Nov 2011 23:12:32 +0000 (19:12 -0400)
Add function notmuch_query_count_threads() to get the number of threads
matching a search. This is done by performing a search and figuring out the
number of unique thread IDs in the matching messages, a significantly
heavier operation than notmuch_query_count_messages().

Signed-off-by: Jani Nikula <jani@nikula.org>
lib/notmuch.h
lib/query.cc

index c4330e4b3e620119b22790ba9a24163aac7bdf4f..9f23a106e53b7acef19d1bf26036ed6993a361df 100644 (file)
@@ -609,6 +609,20 @@ notmuch_threads_destroy (notmuch_threads_t *threads);
 unsigned
 notmuch_query_count_messages (notmuch_query_t *query);
  
+/* Return the number of threads matching a search.
+ *
+ * This function performs a search and returns the number of unique thread IDs
+ * in the matching messages. This is the same as number of threads matching a
+ * search.
+ *
+ * Note that this is a significantly heavier operation than
+ * notmuch_query_count_messages().
+ *
+ * If an error occurs, this function may return 0.
+ */
+unsigned
+notmuch_query_count_threads (notmuch_query_t *query);
+
 /* Get the thread ID of 'thread'.
  *
  * The returned string belongs to 'thread' and as such, should not be
index 6f02b04b95dc81def0c240a055b95ea7917153b8..b6c0f12d9cd87f73993be6ef6c822319df888995 100644 (file)
@@ -457,3 +457,47 @@ notmuch_query_count_messages (notmuch_query_t *query)
 
     return count;
 }
+
+unsigned
+notmuch_query_count_threads (notmuch_query_t *query)
+{
+    notmuch_messages_t *messages;
+    GHashTable *hash;
+    unsigned int count;
+    notmuch_sort_t sort;
+
+    sort = query->sort;
+    query->sort = NOTMUCH_SORT_UNSORTED;
+    messages = notmuch_query_search_messages (query);
+    query->sort = sort;
+    if (messages == NULL)
+       return 0;
+
+    hash = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL);
+    if (hash == NULL) {
+       talloc_free (messages);
+       return 0;
+    }
+
+    while (notmuch_messages_valid (messages)) {
+       notmuch_message_t *message = notmuch_messages_get (messages);
+       const char *thread_id = notmuch_message_get_thread_id (message);
+       char *thread_id_copy = talloc_strdup (messages, thread_id);
+       if (unlikely (thread_id_copy == NULL)) {
+           notmuch_message_destroy (message);
+           count = 0;
+           goto DONE;
+       }
+       g_hash_table_insert (hash, thread_id_copy, NULL);
+       notmuch_message_destroy (message);
+       notmuch_messages_move_to_next (messages);
+    }
+
+    count = g_hash_table_size (hash);
+
+  DONE:
+    g_hash_table_unref (hash);
+    talloc_free (messages);
+
+    return count;
+}