mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-25 12:28:09 +01:00
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).
This commit is contained in:
parent
8b23a828c2
commit
5dec429f45
1 changed files with 64 additions and 39 deletions
103
notmuch-search.c
103
notmuch-search.c
|
@ -20,18 +20,69 @@
|
||||||
|
|
||||||
#include "notmuch-client.h"
|
#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
|
int
|
||||||
notmuch_search_command (void *ctx, int argc, char *argv[])
|
notmuch_search_command (void *ctx, int argc, char *argv[])
|
||||||
{
|
{
|
||||||
notmuch_config_t *config;
|
notmuch_config_t *config;
|
||||||
notmuch_database_t *notmuch;
|
notmuch_database_t *notmuch;
|
||||||
notmuch_query_t *query;
|
notmuch_query_t *query;
|
||||||
notmuch_threads_t *threads;
|
|
||||||
notmuch_thread_t *thread;
|
|
||||||
notmuch_tags_t *tags;
|
|
||||||
char *query_str;
|
char *query_str;
|
||||||
const char *relative_date;
|
|
||||||
time_t date;
|
|
||||||
int i, first = 0, max_threads = -1;
|
int i, first = 0, max_threads = -1;
|
||||||
char *opt, *end;
|
char *opt, *end;
|
||||||
notmuch_sort_t sort = NOTMUCH_SORT_DATE;
|
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);
|
notmuch_query_set_sort (query, sort);
|
||||||
|
|
||||||
for (threads = notmuch_query_search_threads (query, first, max_threads);
|
if (max_threads < 0 || max_threads > NOTMUCH_SHOW_INITIAL_BURST)
|
||||||
notmuch_threads_has_more (threads);
|
|
||||||
notmuch_threads_advance (threads))
|
|
||||||
{
|
{
|
||||||
int first = 1;
|
do_search_threads (ctx, query, sort,
|
||||||
|
first, NOTMUCH_SHOW_INITIAL_BURST);
|
||||||
|
|
||||||
thread = notmuch_threads_get (threads);
|
first += NOTMUCH_SHOW_INITIAL_BURST;
|
||||||
|
if (max_threads > 0)
|
||||||
if (sort == NOTMUCH_SORT_DATE)
|
max_threads -= NOTMUCH_SHOW_INITIAL_BURST;
|
||||||
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)
|
|
||||||
printf (" ");
|
|
||||||
printf ("%s", notmuch_tags_get (tags));
|
|
||||||
first = 0;
|
|
||||||
}
|
|
||||||
printf (")\n");
|
|
||||||
|
|
||||||
notmuch_thread_destroy (thread);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do_search_threads (ctx, query, sort, first, max_threads);
|
||||||
|
|
||||||
notmuch_query_destroy (query);
|
notmuch_query_destroy (query);
|
||||||
notmuch_database_close (notmuch);
|
notmuch_database_close (notmuch);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue