lib: add function to get the number of threads matching a search

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>
This commit is contained in:
Jani Nikula 2011-11-15 22:08:48 +02:00 committed by David Bremner
parent ed20210b6d
commit 00c60fbcb3
2 changed files with 58 additions and 0 deletions

View file

@ -609,6 +609,20 @@ notmuch_threads_destroy (notmuch_threads_t *threads);
unsigned unsigned
notmuch_query_count_messages (notmuch_query_t *query); 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'. /* Get the thread ID of 'thread'.
* *
* The returned string belongs to 'thread' and as such, should not be * The returned string belongs to 'thread' and as such, should not be

View file

@ -457,3 +457,47 @@ notmuch_query_count_messages (notmuch_query_t *query)
return count; 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;
}