]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: mail_search_args_simplify() handles now ALL better.
authorTimo Sirainen <tss@iki.fi>
Tue, 8 Dec 2015 11:23:19 +0000 (13:23 +0200)
committerTimo Sirainen <tss@iki.fi>
Tue, 8 Dec 2015 11:23:19 +0000 (13:23 +0200)
src/lib-storage/mail-search-args-simplify.c
src/lib-storage/test-mail-search-args-simplify.c

index cfd9df5b7c681b61bd37a163fa024b3108aadecf..8413ff188a9bb9b14af64f748f4bb48bb8454c0a 100644 (file)
@@ -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;
index c72dc9bbe74256deb156a8f8f4694e6ae064bfa6..9ba5ca719cf6933bfcc3069b2901fb57dd0393cf 100644 (file)
@@ -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" },