dovecot-2.2: lib-storage: mail_search_args_simplify() handles no...

dovecot at dovecot.org dovecot at dovecot.org
Tue Dec 8 11:31:22 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/c75cb045e83f
changeset: 19491:c75cb045e83f
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Dec 08 13:23:19 2015 +0200
description:
lib-storage: mail_search_args_simplify() handles now ALL better.

diffstat:

 src/lib-storage/mail-search-args-simplify.c      |  23 ++++++++++++++++++++++-
 src/lib-storage/test-mail-search-args-simplify.c |  10 ++++++++++
 2 files changed, 32 insertions(+), 1 deletions(-)

diffs (60 lines):

diff -r f894dbea7226 -r c75cb045e83f src/lib-storage/mail-search-args-simplify.c
--- a/src/lib-storage/mail-search-args-simplify.c	Tue Dec 08 13:13:24 2015 +0200
+++ b/src/lib-storage/mail-search-args-simplify.c	Tue Dec 08 13:23:19 2015 +0200
@@ -464,7 +464,7 @@
 			      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 @@
 		/* 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;
diff -r f894dbea7226 -r c75cb045e83f src/lib-storage/test-mail-search-args-simplify.c
--- a/src/lib-storage/test-mail-search-args-simplify.c	Tue Dec 08 13:13:24 2015 +0200
+++ b/src/lib-storage/test-mail-search-args-simplify.c	Tue Dec 08 13:23:19 2015 +0200
@@ -11,6 +11,16 @@
 	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" },


More information about the dovecot-cvs mailing list