Mercurial > dovecot > core-2.2
changeset 19491:c75cb045e83f
lib-storage: mail_search_args_simplify() handles now ALL better.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 08 Dec 2015 13:23:19 +0200 |
parents | f894dbea7226 |
children | 8f04a0ce1c76 |
files | src/lib-storage/mail-search-args-simplify.c src/lib-storage/test-mail-search-args-simplify.c |
diffstat | 2 files changed, 32 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/mail-search-args-simplify.c Tue Dec 08 13:13:24 2015 +0200 +++ b/src/lib-storage/mail-search-args-simplify.c Tue Dec 08 13:23:19 2015 +0200 @@ -464,7 +464,7 @@ 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 @@ /* 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;
--- a/src/lib-storage/test-mail-search-args-simplify.c Tue Dec 08 13:13:24 2015 +0200 +++ b/src/lib-storage/test-mail-search-args-simplify.c Tue Dec 08 13:23:19 2015 +0200 @@ -11,6 +11,16 @@ 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" },