From: Timo Sirainen Date: Thu, 23 Apr 2015 16:49:49 +0000 (+0300) Subject: lib-storage: If mail_search_args_simplify() merges flags, check again if any SUBs... X-Git-Tag: 2.2.17.rc1~160 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fb79b36eb34532dbe67caf99eefe3660b8c841e0;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: If mail_search_args_simplify() merges flags, check again if any SUBs can be removed. The subquery may have been replaced with a single SEARCH_FLAGS parameter. --- diff --git a/src/lib-storage/mail-search-args-simplify.c b/src/lib-storage/mail-search-args-simplify.c index 3bea99eccc..dda0901e81 100644 --- a/src/lib-storage/mail-search-args-simplify.c +++ b/src/lib-storage/mail-search-args-simplify.c @@ -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); } diff --git a/src/lib-storage/test-mail-search-args-simplify.c b/src/lib-storage/test-mail-search-args-simplify.c index f148d42226..0d03152158 100644 --- a/src/lib-storage/test-mail-search-args-simplify.c +++ b/src/lib-storage/test-mail-search-args-simplify.c @@ -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 *