mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-12-24 02:14:52 +01:00
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:
parent
ed20210b6d
commit
00c60fbcb3
2 changed files with 58 additions and 0 deletions
|
@ -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
|
||||
|
|
44
lib/query.cc
44
lib/query.cc
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue