aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Carl Worth <cworth@cworth.org>2009-11-17 19:11:05 -0800
committerGravatar Carl Worth <cworth@cworth.org>2009-11-17 19:11:05 -0800
commit5dec429f457c5b387a43802a32ef3192592c425d (patch)
tree51bff0f8e3bec504ed37f7c81503efab42a785ec
parent8b23a828c250c2711924511b85de6301de8b3f23 (diff)
notmuch search: Return first 100 results as quickly as possible.
This is one of those cases where total time is not the metric of interest. We increase the total time of the search, (by doing some redundant work for the initial threads). But more significantly, we give the user *some* results nearly instantaneously, (so that the user might see the result of interest without ever even waiting for the complete results to come in).
-rw-r--r--notmuch-search.c103
1 files changed, 64 insertions, 39 deletions
diff --git a/notmuch-search.c b/notmuch-search.c
index 8db09c77..59ffb038 100644
--- a/notmuch-search.c
+++ b/notmuch-search.c
@@ -20,18 +20,69 @@
#include "notmuch-client.h"
+/* If the user asks for a *lot* of threads, lets give some results as
+ * quickly as possible and let the user read those while we compute
+ * the remainder. */
+#define NOTMUCH_SHOW_INITIAL_BURST 100
+
+static void
+do_search_threads (const void *ctx,
+ notmuch_query_t *query,
+ notmuch_sort_t sort,
+ int first, int max_threads)
+{
+ notmuch_thread_t *thread;
+ notmuch_threads_t *threads;
+ notmuch_tags_t *tags;
+ time_t date;
+ const char *relative_date;
+
+ for (threads = notmuch_query_search_threads (query, first, max_threads);
+ notmuch_threads_has_more (threads);
+ notmuch_threads_advance (threads))
+ {
+ int first_tag = 1;
+
+ thread = notmuch_threads_get (threads);
+
+ if (sort == NOTMUCH_SORT_DATE)
+ date = notmuch_thread_get_oldest_date (thread);
+ else
+ date = notmuch_thread_get_newest_date (thread);
+
+ relative_date = notmuch_time_relative_date (ctx, date);
+
+ printf ("thread:%s %12s [%d/%d] %s; %s",
+ notmuch_thread_get_thread_id (thread),
+ relative_date,
+ notmuch_thread_get_matched_messages (thread),
+ notmuch_thread_get_total_messages (thread),
+ notmuch_thread_get_authors (thread),
+ notmuch_thread_get_subject (thread));
+
+ printf (" (");
+ for (tags = notmuch_thread_get_tags (thread);
+ notmuch_tags_has_more (tags);
+ notmuch_tags_advance (tags))
+ {
+ if (! first_tag)
+ printf (" ");
+ printf ("%s", notmuch_tags_get (tags));
+ first_tag = 0;
+ }
+ printf (")\n");
+
+ notmuch_thread_destroy (thread);
+ }
+}
+
int
notmuch_search_command (void *ctx, int argc, char *argv[])
{
notmuch_config_t *config;
notmuch_database_t *notmuch;
notmuch_query_t *query;
- notmuch_threads_t *threads;
- notmuch_thread_t *thread;
- notmuch_tags_t *tags;
char *query_str;
- const char *relative_date;
- time_t date;
int i, first = 0, max_threads = -1;
char *opt, *end;
notmuch_sort_t sort = NOTMUCH_SORT_DATE;
@@ -88,44 +139,18 @@ notmuch_search_command (void *ctx, int argc, char *argv[])
notmuch_query_set_sort (query, sort);
- for (threads = notmuch_query_search_threads (query, first, max_threads);
- notmuch_threads_has_more (threads);
- notmuch_threads_advance (threads))
+ if (max_threads < 0 || max_threads > NOTMUCH_SHOW_INITIAL_BURST)
{
- int first = 1;
-
- thread = notmuch_threads_get (threads);
-
- if (sort == NOTMUCH_SORT_DATE)
- date = notmuch_thread_get_oldest_date (thread);
- else
- date = notmuch_thread_get_newest_date (thread);
-
- relative_date = notmuch_time_relative_date (ctx, date);
+ do_search_threads (ctx, query, sort,
+ first, NOTMUCH_SHOW_INITIAL_BURST);
- printf ("thread:%s %12s [%d/%d] %s; %s",
- notmuch_thread_get_thread_id (thread),
- relative_date,
- notmuch_thread_get_matched_messages (thread),
- notmuch_thread_get_total_messages (thread),
- notmuch_thread_get_authors (thread),
- notmuch_thread_get_subject (thread));
-
- printf (" (");
- for (tags = notmuch_thread_get_tags (thread);
- notmuch_tags_has_more (tags);
- notmuch_tags_advance (tags))
- {
- if (! first)
- printf (" ");
- printf ("%s", notmuch_tags_get (tags));
- first = 0;
- }
- printf (")\n");
-
- notmuch_thread_destroy (thread);
+ first += NOTMUCH_SHOW_INITIAL_BURST;
+ if (max_threads > 0)
+ max_threads -= NOTMUCH_SHOW_INITIAL_BURST;
}
+ do_search_threads (ctx, query, sort, first, max_threads);
+
notmuch_query_destroy (query);
notmuch_database_close (notmuch);