]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: If mail_search_args_simplify() merges flags, check again if any SUBs...
authorTimo Sirainen <tss@iki.fi>
Thu, 23 Apr 2015 16:49:49 +0000 (19:49 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 23 Apr 2015 16:49:49 +0000 (19:49 +0300)
The subquery may have been replaced with a single SEARCH_FLAGS parameter.

src/lib-storage/mail-search-args-simplify.c
src/lib-storage/test-mail-search-args-simplify.c

index 3bea99ecccbd0ed564df7cfa971acf1845270a67..dda0901e8191b09154e3f6b6fb783bf4078c8132 100644 (file)
@@ -3,12 +3,13 @@
 #include "lib.h"
 #include "mail-search.h"
 
-static void
+static bool
 mail_search_args_simplify_sub(struct mailbox *box,
                              struct mail_search_arg *args, bool parent_and)
 {
        struct mail_search_arg *sub, *prev = NULL;
        struct mail_search_arg *prev_flags_arg, *prev_not_flags_arg;
+       bool removals;
 
        prev_flags_arg = prev_not_flags_arg = NULL;
        while (args != NULL) {
@@ -43,8 +44,9 @@ mail_search_args_simplify_sub(struct mailbox *box,
                if (args->type == SEARCH_SUB ||
                    args->type == SEARCH_OR ||
                    args->type == SEARCH_INTHREAD) {
-                       mail_search_args_simplify_sub(box, args->value.subargs,
-                                                     args->type != SEARCH_OR);
+                       if (mail_search_args_simplify_sub(box, args->value.subargs,
+                                                         args->type != SEARCH_OR))
+                               removals = TRUE;
                }
 
                /* merge all flags arguments */
@@ -57,6 +59,7 @@ mail_search_args_simplify_sub(struct mailbox *box,
                                        args->value.flags;
                                prev->next = args->next;
                                args = args->next;
+                               removals = TRUE;
                                continue;
                        }
                } else if (args->type == SEARCH_FLAGS && args->match_not &&
@@ -68,6 +71,7 @@ mail_search_args_simplify_sub(struct mailbox *box,
                                        args->value.flags;
                                prev->next = args->next;
                                args = args->next;
+                               removals = TRUE;
                                continue;
                        }
                }
@@ -75,6 +79,7 @@ mail_search_args_simplify_sub(struct mailbox *box,
                prev = args;
                args = args->next;
        }
+       return removals;
 }
 
 static bool
@@ -145,12 +150,16 @@ mail_search_args_unnest_inthreads(struct mail_search_args *args,
 
 void mail_search_args_simplify(struct mail_search_args *args)
 {
+       bool removals;
+
        args->simplified = TRUE;
 
-       mail_search_args_simplify_sub(args->box, args->args, TRUE);
+       removals = mail_search_args_simplify_sub(args->box, args->args, TRUE);
        if (mail_search_args_unnest_inthreads(args, &args->args,
                                              FALSE, TRUE)) {
                /* we may have added some extra SUBs that could be dropped */
                mail_search_args_simplify_sub(args->box, args->args, TRUE);
        }
+       if (removals)
+               mail_search_args_simplify_sub(args->box, args->args, TRUE);
 }
index f148d422265951a4190bcda4a46b98e4b2a81fb3..0d03152158064b0bcd2224d095dc8f389481af63 100644 (file)
@@ -29,9 +29,10 @@ struct {
        { "NOT ( TEXT foo TEXT bar )", "(OR NOT TEXT foo NOT TEXT bar)" },
 
        { "ANSWERED FLAGGED SEEN", "(ANSWERED FLAGGED SEEN)" },
+       { "OR ( ANSWERED FLAGGED SEEN ) DRAFT", "(OR (ANSWERED FLAGGED SEEN) (DRAFT))" },
        { "ANSWERED TEXT foo FLAGGED SEEN", "(ANSWERED FLAGGED SEEN) TEXT foo" },
-       { "NOT ( ANSWERED FLAGGED SEEN )", "(NOT (ANSWERED FLAGGED SEEN))" },
-       { "OR NOT ANSWERED OR NOT FLAGGED NOT SEEN", "(NOT (ANSWERED FLAGGED SEEN))" }
+       { "NOT ( ANSWERED FLAGGED SEEN )", "NOT (ANSWERED FLAGGED SEEN)" },
+       { "OR NOT ANSWERED OR NOT FLAGGED NOT SEEN", "NOT (ANSWERED FLAGGED SEEN)" }
 };
 
 static struct mail_search_args *