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;
 	}
 }