mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-23 11:28:13 +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
|
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
|
||||||
|
|
44
lib/query.cc
44
lib/query.cc
|
@ -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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue