Mercurial > dovecot > core-2.2
changeset 21961:3ef294f37e92
lib-storage: mail_search_args_simplify() - deduplicate KEYWORDs
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 13 Apr 2017 13:04:25 +0300 |
parents | 9353f0cc30d3 |
children | 65c149bea418 |
files | src/lib-storage/mail-search-args-simplify.c src/lib-storage/test-mail-search-args-simplify.c |
diffstat | 2 files changed, 33 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/mail-search-args-simplify.c Thu Apr 13 12:51:25 2017 +0300 +++ b/src/lib-storage/mail-search-args-simplify.c Thu Apr 13 13:04:25 2017 +0300 @@ -106,6 +106,25 @@ } } +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 @@ 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);
--- a/src/lib-storage/test-mail-search-args-simplify.c Thu Apr 13 12:51:25 2017 +0300 +++ b/src/lib-storage/test-mail-search-args-simplify.c Thu Apr 13 13:04:25 2017 +0300 @@ -46,6 +46,17 @@ { "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" },