From 1c0020171b04d14adc4966ed963361abc9a86787 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Thu, 13 Apr 2017 13:04:25 +0300 Subject: [PATCH] lib-storage: mail_search_args_simplify() - deduplicate KEYWORDs --- src/lib-storage/mail-search-args-simplify.c | 22 +++++++++++++++++++ .../test-mail-search-args-simplify.c | 11 ++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/lib-storage/mail-search-args-simplify.c b/src/lib-storage/mail-search-args-simplify.c index 86f35e817b..4bf01372a6 100644 --- a/src/lib-storage/mail-search-args-simplify.c +++ b/src/lib-storage/mail-search-args-simplify.c @@ -106,6 +106,25 @@ static bool mail_search_args_merge_flags(struct mail_search_simplify_ctx *ctx, } } +static bool +mail_search_args_merge_keywords(struct mail_search_simplify_ctx *ctx, + struct mail_search_arg *args) +{ + struct mail_search_simplify_prev_arg mask; + struct mail_search_arg **prev_argp; + + mail_search_arg_get_base_mask(args, &mask); + mask.str_mask = args->value.str; + prev_argp = mail_search_args_simplify_get_prev_argp(ctx, &mask); + + if (*prev_argp == NULL) { + *prev_argp = args; + return FALSE; + } + /* duplicate keyword. */ + return TRUE; +} + static void mail_search_args_simplify_set(struct mail_search_arg *args) { const struct seq_range *seqset; @@ -590,6 +609,9 @@ mail_search_args_simplify_sub(struct mailbox *box, pool_t pool, case SEARCH_FLAGS: merged = mail_search_args_merge_flags(&ctx, args); break; + case SEARCH_KEYWORDS: + merged = mail_search_args_merge_keywords(&ctx, args); + break; case SEARCH_SEQSET: case SEARCH_UIDSET: merged = mail_search_args_merge_set(&ctx, args); diff --git a/src/lib-storage/test-mail-search-args-simplify.c b/src/lib-storage/test-mail-search-args-simplify.c index e5450b314d..1bddb44a37 100644 --- a/src/lib-storage/test-mail-search-args-simplify.c +++ b/src/lib-storage/test-mail-search-args-simplify.c @@ -46,6 +46,17 @@ static const struct { { "ANSWERED NOT FLAGGED SEEN NOT DRAFT", "(ANSWERED SEEN) NOT (FLAGGED) NOT (DRAFT)" }, { "OR NOT ANSWERED NOT SEEN", "NOT (ANSWERED SEEN)" }, + { "KEYWORD foo", "KEYWORD foo" }, + { "KEYWORD foo KEYWORD bar", "KEYWORD foo KEYWORD bar" }, + { "NOT KEYWORD foo", "NOT KEYWORD foo" }, + { "NOT KEYWORD foo NOT KEYWORD bar", "NOT KEYWORD foo NOT KEYWORD bar" }, + { "OR KEYWORD foo KEYWORD bar", "(OR KEYWORD foo KEYWORD bar)" }, + { "OR NOT KEYWORD foo NOT KEYWORD bar", "(OR NOT KEYWORD foo NOT KEYWORD bar)" }, + + { "KEYWORD foo KEYWORD foo", "KEYWORD foo" }, + { "OR KEYWORD foo KEYWORD foo", "KEYWORD foo" }, + { "NOT KEYWORD foo NOT KEYWORD foo", "NOT KEYWORD foo" }, + { "1:* 1:*", "ALL" }, { "OR 1:5 6:*", "ALL" },