Mercurial > dovecot > original-hg > dovecot-1.2
changeset 6963:5fb86ed98860 HEAD
Merge SEARCH_FLAGS arguments when possible.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 08 Dec 2007 18:34:23 +0200 |
parents | 659e4a606aae |
children | b9d674728523 |
files | src/lib-storage/mail-search.c |
diffstat | 1 files changed, 28 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/mail-search.c Sat Dec 08 18:26:42 2007 +0200 +++ b/src/lib-storage/mail-search.c Sat Dec 08 18:34:23 2007 +0200 @@ -180,8 +180,10 @@ static void mail_search_args_simplify_sub(struct mail_search_arg *args, bool parent_and) { - struct mail_search_arg *sub; + struct mail_search_arg *sub, *prev = NULL; + struct mail_search_arg *prev_flags_arg, *prev_not_flags_arg; + prev_flags_arg = prev_not_flags_arg = NULL; for (; args != NULL;) { if (args->not && (args->type == SEARCH_SUB || args->type == SEARCH_OR)) { @@ -210,6 +212,31 @@ mail_search_args_simplify_sub(args->value.subargs, args->type == SEARCH_SUB); } + + /* merge all flags arguments */ + if (args->type == SEARCH_FLAGS && !args->not) { + if (prev_flags_arg == NULL) + prev_flags_arg = args; + else { + prev_flags_arg->value.flags |= + args->value.flags; + prev->next = args->next; + args = args->next; + continue; + } + } else if (args->type == SEARCH_FLAGS && args->not) { + if (prev_not_flags_arg == NULL) + prev_not_flags_arg = args; + else { + prev_not_flags_arg->value.flags |= + args->value.flags; + prev->next = args->next; + args = args->next; + continue; + } + } + + prev = args; args = args->next; } }