From: Jani Nikula Date: Sun, 13 Nov 2011 21:15:30 +0000 (+0200) Subject: [PATCH v6 1/6] lib: add function to get the number of threads matching a search X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;ds=sidebyside;h=d542c9941cfd2b25e69721b7b1e663a17c3a0e7e;p=notmuch-archives.git [PATCH v6 1/6] lib: add function to get the number of threads matching a search --- diff --git a/02/411442f12d624016383343d619155daa5aa560 b/02/411442f12d624016383343d619155daa5aa560 new file mode 100644 index 000000000..86cc4d05c --- /dev/null +++ b/02/411442f12d624016383343d619155daa5aa560 @@ -0,0 +1,147 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by olra.theworths.org (Postfix) with ESMTP id 623AC429E35 + for ; Sun, 13 Nov 2011 13:15:48 -0800 (PST) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Amavis-Alert: BAD HEADER SECTION, Duplicate header field: "References" +X-Spam-Flag: NO +X-Spam-Score: 1.075 +X-Spam-Level: * +X-Spam-Status: No, score=1.075 tagged_above=-999 required=5 + tests=[RCVD_IN_DNSWL_LOW=-0.7, URIBL_BLACK=1.775] autolearn=disabled +Received: from olra.theworths.org ([127.0.0.1]) + by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id pQx1s2UIaf7C for ; + Sun, 13 Nov 2011 13:15:46 -0800 (PST) +Received: from mail-bw0-f53.google.com (mail-bw0-f53.google.com + [209.85.214.53]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) + (No client certificate requested) + by olra.theworths.org (Postfix) with ESMTPS id 812DE429E2E + for ; Sun, 13 Nov 2011 13:15:43 -0800 (PST) +Received: by mail-bw0-f53.google.com with SMTP id q10so6289712bka.26 + for ; Sun, 13 Nov 2011 13:15:43 -0800 (PST) +Received: by 10.205.128.15 with SMTP id hc15mr8656045bkc.110.1321218943033; + Sun, 13 Nov 2011 13:15:43 -0800 (PST) +Received: from localhost (dsl-hkibrasgw4-fe5cdc00-23.dhcp.inet.fi. + [80.220.92.23]) + by mx.google.com with ESMTPS id o7sm17662101bkw.16.2011.11.13.13.15.40 + (version=SSLv3 cipher=OTHER); Sun, 13 Nov 2011 13:15:42 -0800 (PST) +From: Jani Nikula +To: notmuch@notmuchmail.org +Subject: [PATCH v6 1/6] lib: add function to get the number of threads + matching a search +Date: Sun, 13 Nov 2011 23:15:30 +0200 +Message-Id: + +X-Mailer: git-send-email 1.7.5.4 +In-Reply-To: +References: +In-Reply-To: +References: +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.13 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Sun, 13 Nov 2011 21:15:48 -0000 + +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 +--- + lib/notmuch.h | 14 ++++++++++++++ + lib/query.cc | 44 ++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 58 insertions(+), 0 deletions(-) + +diff --git a/lib/notmuch.h b/lib/notmuch.h +index c4330e4..9f23a10 100644 +--- a/lib/notmuch.h ++++ b/lib/notmuch.h +@@ -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 +diff --git a/lib/query.cc b/lib/query.cc +index 6f02b04..b6c0f12 100644 +--- a/lib/query.cc ++++ b/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; ++} +-- +1.7.5.4 +