From: Timo Sirainen Date: Tue, 8 Dec 2015 11:23:19 +0000 (+0200) Subject: lib-storage: mail_search_args_simplify() handles now ALL better. X-Git-Tag: 2.2.21~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dfeae309e396ff899da87e3bde6bea35cb0cdbf8;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: mail_search_args_simplify() handles now ALL better. --- diff --git a/src/lib-storage/mail-search-args-simplify.c b/src/lib-storage/mail-search-args-simplify.c index cfd9df5b7c..8413ff188a 100644 --- a/src/lib-storage/mail-search-args-simplify.c +++ b/src/lib-storage/mail-search-args-simplify.c @@ -464,7 +464,7 @@ mail_search_args_simplify_sub(struct mailbox *box, pool_t pool, struct mail_search_arg **argsp, bool parent_and) { struct mail_search_simplify_ctx ctx; - struct mail_search_arg *sub; + struct mail_search_arg *sub, **all_argsp = argsp; bool merged; memset(&ctx, 0, sizeof(ctx)); @@ -527,6 +527,27 @@ mail_search_args_simplify_sub(struct mailbox *box, pool_t pool, /* try to merge arguments */ merged = FALSE; switch (args->type) { + case SEARCH_ALL: { + if (*all_argsp == args && args->next == NULL) { + /* this arg has no siblings - no merging */ + break; + } + if ((parent_and && !args->match_not) || + (!parent_and && args->match_not)) { + /* .. AND ALL .. + .. OR NOT ALL .. + This arg is irrelevant -> drop */ + merged = TRUE; + break; + } + /* .. AND NOT ALL .. + .. OR ALL .. + The other args are irrelevant -> drop them */ + *all_argsp = args; + args->next = NULL; + ctx.removals = TRUE; + break; + } case SEARCH_FLAGS: merged = mail_search_args_merge_flags(&ctx, args); break; diff --git a/src/lib-storage/test-mail-search-args-simplify.c b/src/lib-storage/test-mail-search-args-simplify.c index c72dc9bbe7..9ba5ca719c 100644 --- a/src/lib-storage/test-mail-search-args-simplify.c +++ b/src/lib-storage/test-mail-search-args-simplify.c @@ -11,6 +11,16 @@ struct { const char *input; const char *output; } tests[] = { + { "ALL", "ALL" }, + { "NOT ALL", "NOT ALL" }, + { "ALL NOT ALL", "NOT ALL" }, + { "ALL NOT ALL TEXT foo", "NOT ALL" }, + { "OR ALL NOT ALL", "ALL" }, + { "OR ALL OR NOT ALL TEXT foo", "ALL" }, + { "OR ALL OR TEXT foo TEXT bar", "ALL" }, + { "OR TEXT FOO ( ALL NOT ALL )", "TEXT FOO" }, + { "TEXT FOO OR ALL NOT ALL", "TEXT FOO" }, + { "TEXT foo", "TEXT foo" }, { "( TEXT foo )", "TEXT foo" }, { "( ( TEXT foo ) )", "TEXT foo" },