changeset 22142:7181f55cae2c

lib-storage: mail_search_args_to_imap() - don't add parenthesis around OR There's no need to write "(OR a b)" when "OR a b" works just the same.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Tue, 30 May 2017 23:53:44 +0300
parents a37bfca0d2e4
children 98e35a5592b1
files src/lib-storage/mail-search-args-imap.c src/lib-storage/mail-search-mime.c src/lib-storage/test-mail-search-args-imap.c src/lib-storage/test-mail-search-args-simplify.c
diffstat 4 files changed, 50 insertions(+), 46 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/mail-search-args-imap.c	Fri Jun 09 13:17:38 2017 +0300
+++ b/src/lib-storage/mail-search-args-imap.c	Tue May 30 23:53:44 2017 +0300
@@ -20,7 +20,8 @@
 {
 	const struct mail_search_arg *arg;
 
-	str_append_c(dest, '(');
+	if (prefix[0] == '\0')
+		str_append_c(dest, '(');
 	for (arg = args; arg != NULL; arg = arg->next) {
 		if (arg->next != NULL)
 			str_append(dest, prefix);
@@ -29,7 +30,8 @@
 		if (arg->next != NULL)
 			str_append_c(dest, ' ');
 	}
-	str_append_c(dest, ')');
+	if (prefix[0] == '\0')
+		str_append_c(dest, ')');
 	return TRUE;
 }
 
--- a/src/lib-storage/mail-search-mime.c	Fri Jun 09 13:17:38 2017 +0300
+++ b/src/lib-storage/mail-search-mime.c	Tue May 30 23:53:44 2017 +0300
@@ -355,7 +355,8 @@
 {
 	const struct mail_search_mime_arg *arg;
 
-	str_append_c(dest, '(');
+	if (prefix[0] == '\0')
+		str_append_c(dest, '(');
 	for (arg = args; arg != NULL; arg = arg->next) {
 		if (arg->next != NULL)
 			str_append(dest, prefix);
@@ -364,7 +365,8 @@
 		if (arg->next != NULL)
 			str_append_c(dest, ' ');
 	}
-	str_append_c(dest, ')');
+	if (prefix[0] == '\0')
+		str_append_c(dest, ')');
 	return TRUE;
 }
 
--- a/src/lib-storage/test-mail-search-args-imap.c	Fri Jun 09 13:17:38 2017 +0300
+++ b/src/lib-storage/test-mail-search-args-imap.c	Tue May 30 23:53:44 2017 +0300
@@ -58,7 +58,7 @@
 	{ "INTHREAD ORDEREDSUBJECT seen", "INTHREAD ORDEREDSUBJECT (SEEN)" },
 	{ "INTHREAD REFS seen", "INTHREAD REFS (SEEN)" },
 	{ "INTHREAD REFS ( OR text foo OR keyword bar seen )",
-	  "INTHREAD REFS (((OR TEXT foo OR KEYWORD bar SEEN)))" },
+	  "INTHREAD REFS ((OR TEXT foo OR KEYWORD bar SEEN))" },
 	{ "X-GUID foo", NULL },
 	{ "X-MAILBOX foo", NULL },
 	{ "X-REAL-UID 1,5:6,10:15", NULL },
@@ -80,13 +80,13 @@
 	  "MIMEPART LOCATION http://www.dovecot.org" },
 	{ "MIMEPART NOT MD5 373def35afde6378efd6172dfeadfd", NULL },
 	{ "MIMEPART OR PARAM charset utf-8 TYPE text",
-	  "MIMEPART (OR PARAM CHARSET utf-8 TYPE text)" },
+	  "MIMEPART OR PARAM CHARSET utf-8 TYPE text" },
 	{ "MIMEPART ( OR SIZE LARGER 25 SIZE SMALLER 1023 )",
-	  "MIMEPART (OR SIZE LARGER 25 SIZE SMALLER 1023)" },
+	  "MIMEPART OR SIZE LARGER 25 SIZE SMALLER 1023" },
 	{ "MIMEPART ( TYPE video SUBTYPE mpeg )",
 	  "MIMEPART (TYPE video SUBTYPE mpeg)" },
 	{ "( OR MIMEPART ( DEPTH 2 INDEX 1 ) MIMEPART ( DEPTH MAX 4 INDEX 3 ) )",
-	  "((OR MIMEPART (DEPTH 2 INDEX 1) MIMEPART (DEPTH MAX 4 INDEX 3)))" },
+	  "(OR MIMEPART (DEPTH 2 INDEX 1) MIMEPART (DEPTH MAX 4 INDEX 3))" },
 	{ "MIMEPART FILENAME IS frop.txt", NULL },
 	{ "MIMEPART FILENAME BEGINS frop", NULL },
 	{ "MIMEPART FILENAME ENDS .txt", NULL },
@@ -99,7 +99,7 @@
 	{ "MIMEPART ( SUBJECT Frop TO henkie SENTON 20-Feb-2017 )",
 	  "MIMEPART (SUBJECT Frop TO henkie SENTON \"20-Feb-2017\")" },
 	{ "MIMEPART ( OR SENTBEFORE 20-May-2015 SENTSINCE 20-Feb-2017 )",
-	  "MIMEPART (OR SENTBEFORE \"20-May-2015\" SENTSINCE \"20-Feb-2017\")" },
+	  "MIMEPART OR SENTBEFORE \"20-May-2015\" SENTSINCE \"20-Feb-2017\"" },
 	{ "MIMEPART ( ID <frop> PARENT ID <friep> )",
 	  "MIMEPART (ID <frop> PARENT (ID <friep>))" },
 	{ "MIMEPART ( ID <frop> CHILD ( DESCRIPTION frop ID friep ) )",
--- a/src/lib-storage/test-mail-search-args-simplify.c	Fri Jun 09 13:17:38 2017 +0300
+++ b/src/lib-storage/test-mail-search-args-simplify.c	Tue May 30 23:53:44 2017 +0300
@@ -27,30 +27,30 @@
 	{ "( ( TEXT foo ) )", "TEXT foo" },
 	{ "( ( TEXT foo ) ( TEXT bar ) )", "TEXT foo TEXT bar" },
 
-	{ "OR ( TEXT foo ) ( TEXT bar )", "(OR TEXT foo TEXT bar)" },
+	{ "OR ( TEXT foo ) ( TEXT bar )", "OR TEXT foo TEXT bar" },
 	{ "OR ( TEXT foo ) OR ( TEXT bar ) ( TEXT baz )",
-	  "(OR TEXT foo OR TEXT bar TEXT baz)" },
+	  "OR TEXT foo OR TEXT bar TEXT baz" },
 	{ "OR ( ( TEXT foo TEXT foo2 ) ) ( ( TEXT bar ( TEXT baz ) ) )",
-	  "(OR (TEXT foo TEXT foo2) (TEXT bar TEXT baz))" },
+	  "OR (TEXT foo TEXT foo2) (TEXT bar TEXT baz)" },
 
 	{ "NOT ( TEXT foo )", "NOT TEXT foo" },
 	{ "NOT ( NOT ( TEXT foo ) )", "TEXT foo" },
 	{ "NOT OR ( TEXT foo ) ( TEXT bar )", "NOT TEXT foo NOT TEXT bar" },
 	{ "NOT ( OR ( TEXT foo ) ( TEXT bar ) )", "NOT TEXT foo NOT TEXT bar" },
-	{ "NOT ( TEXT foo TEXT bar )", "(OR NOT TEXT foo NOT TEXT bar)" },
+	{ "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)" },
+	{ "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)" },
-	{ "OR NOT ANSWERED OR NOT FLAGGED SEEN", "(OR NOT (ANSWERED FLAGGED) SEEN)" },
-	{ "OR NOT ANSWERED OR FLAGGED NOT SEEN", "(OR NOT (ANSWERED SEEN) FLAGGED)" },
-	{ "NOT ANSWERED OR FLAGGED NOT SEEN", "NOT ANSWERED (OR FLAGGED NOT SEEN)" },
+	{ "OR NOT ANSWERED OR NOT FLAGGED SEEN", "OR NOT (ANSWERED FLAGGED) SEEN" },
+	{ "OR NOT ANSWERED OR FLAGGED NOT SEEN", "OR NOT (ANSWERED SEEN) FLAGGED" },
+	{ "NOT ANSWERED OR FLAGGED NOT SEEN", "NOT ANSWERED OR FLAGGED NOT SEEN" },
 	{ "NOT ANSWERED OR NOT FLAGGED NOT SEEN", "NOT ANSWERED NOT (FLAGGED SEEN)" },
 	{ "ANSWERED NOT FLAGGED SEEN NOT DRAFT", "(ANSWERED SEEN) NOT FLAGGED NOT DRAFT" },
 	{ "OR NOT ANSWERED NOT SEEN", "NOT (ANSWERED SEEN)" },
-	{ "OR NOT ANSWERED OR NOT SEEN TEXT foo", "(OR NOT (ANSWERED SEEN) TEXT foo)" },
+	{ "OR NOT ANSWERED OR NOT SEEN TEXT foo", "OR NOT (ANSWERED SEEN) TEXT foo" },
 
 	{ "ANSWERED ANSWERED", "ANSWERED" },
 	{ "ANSWERED NOT ANSWERED", "NOT ALL" },
@@ -64,8 +64,8 @@
 	{ "KEYWORD foo KEYWORD bar", "KEYWORD foo KEYWORD bar" },
 	{ "NOT KEYWORD foo", "NOT KEYWORD foo" },
 	{ "NOT KEYWORD foo NOT KEYWORD bar", "NOT KEYWORD foo NOT KEYWORD bar" },
-	{ "OR KEYWORD foo KEYWORD bar", "(OR KEYWORD foo KEYWORD bar)" },
-	{ "OR NOT KEYWORD foo NOT KEYWORD bar", "(OR NOT KEYWORD foo NOT KEYWORD bar)" },
+	{ "OR KEYWORD foo KEYWORD bar", "OR KEYWORD foo KEYWORD bar" },
+	{ "OR NOT KEYWORD foo NOT KEYWORD bar", "OR NOT KEYWORD foo NOT KEYWORD bar" },
 
 	{ "KEYWORD foo KEYWORD foo", "KEYWORD foo" },
 	{ "KEYWORD foo NOT KEYWORD foo", "NOT ALL" },
@@ -114,7 +114,7 @@
 
 	{ "ON 03-Aug-2014 ON 03-Aug-2014", "ON \"03-Aug-2014\"" },
 	{ "ON 03-Aug-2014 ON 04-Aug-2014", "ON \"03-Aug-2014\" ON \"04-Aug-2014\"" }, /* this could be replaced with e.g. NOT ALL */
-	{ "OR ON 03-Aug-2014 ON 04-Aug-2014", "(OR ON \"03-Aug-2014\" ON \"04-Aug-2014\")" },
+	{ "OR ON 03-Aug-2014 ON 04-Aug-2014", "OR ON \"03-Aug-2014\" ON \"04-Aug-2014\"" },
 
 	{ "SINCE 03-Aug-2014 SINCE 01-Aug-2014 SINCE 02-Aug-2014", "SINCE \"03-Aug-2014\"" },
 	{ "OR SINCE 01-Aug-2014 SINCE 02-Aug-2014", "SINCE \"01-Aug-2014\"" },
@@ -128,7 +128,7 @@
 	{ "OR SMALLER 1 OR SMALLER 3 SMALLER 2", "SMALLER 3" },
 	{ "SMALLER 3 NOT SMALLER 1 SMALLER 2", "SMALLER 2 NOT SMALLER 1" },
 	{ "SMALLER 3 LARGER 5", "SMALLER 3 LARGER 5" }, /* this could be replaced with e.g. NOT ALL */
-	{ "OR SMALLER 3 LARGER 5", "(OR SMALLER 3 LARGER 5)" },
+	{ "OR SMALLER 3 LARGER 5", "OR SMALLER 3 LARGER 5" },
 
 	{ "LARGER 3 LARGER 1 LARGER 2", "LARGER 3" },
 	{ "OR LARGER 1 LARGER 2", "LARGER 1" },
@@ -179,45 +179,45 @@
 	{ "OR TEXT common1 OR ( TEXT unique1 TEXT common1 ) ( TEXT unique3 TEXT common1 )", "TEXT common1" },
 
 	/* OR: extract common AND */
-	{ "OR ( TEXT common1 TEXT unique1 ) ( TEXT common1 TEXT unique2 )", "(OR TEXT unique1 TEXT unique2) TEXT common1" },
-	{ "OR ( TEXT unique1 TEXT common1 ) ( TEXT unique2 TEXT common1 )", "(OR TEXT unique1 TEXT unique2) TEXT common1" },
-	{ "OR ( TEXT common1 TEXT unique1 ) ( TEXT unique2 TEXT common1 )", "(OR TEXT unique1 TEXT unique2) TEXT common1" },
-	{ "OR ( TEXT unique1 TEXT common1 ) ( TEXT common1 TEXT unique2 )", "(OR TEXT unique1 TEXT unique2) TEXT common1" },
+	{ "OR ( TEXT common1 TEXT unique1 ) ( TEXT common1 TEXT unique2 )", "OR TEXT unique1 TEXT unique2 TEXT common1" },
+	{ "OR ( TEXT unique1 TEXT common1 ) ( TEXT unique2 TEXT common1 )", "OR TEXT unique1 TEXT unique2 TEXT common1" },
+	{ "OR ( TEXT common1 TEXT unique1 ) ( TEXT unique2 TEXT common1 )", "OR TEXT unique1 TEXT unique2 TEXT common1" },
+	{ "OR ( TEXT unique1 TEXT common1 ) ( TEXT common1 TEXT unique2 )", "OR TEXT unique1 TEXT unique2 TEXT common1" },
 
-	{ "OR ( TEXT unique1 TEXT common1 ) ( TEXT common1 TEXT unique2 TEXT unique3 )", "(OR TEXT unique1 (TEXT unique2 TEXT unique3)) TEXT common1" },
-	{ "OR ( TEXT common1 TEXT common2 TEXT unique1 ) ( TEXT common1 TEXT common2 TEXT unique2 )", "(OR TEXT unique1 TEXT unique2) TEXT common2 TEXT common1" },
-	{ "OR ( TEXT common1 TEXT common2 TEXT unique1 TEXT unique2 ) ( TEXT common1 TEXT common2 TEXT unique3 TEXT unique4 )", "(OR (TEXT unique1 TEXT unique2) (TEXT unique3 TEXT unique4)) TEXT common2 TEXT common1" },
+	{ "OR ( TEXT unique1 TEXT common1 ) ( TEXT common1 TEXT unique2 TEXT unique3 )", "OR TEXT unique1 (TEXT unique2 TEXT unique3) TEXT common1" },
+	{ "OR ( TEXT common1 TEXT common2 TEXT unique1 ) ( TEXT common1 TEXT common2 TEXT unique2 )", "OR TEXT unique1 TEXT unique2 TEXT common2 TEXT common1" },
+	{ "OR ( TEXT common1 TEXT common2 TEXT unique1 TEXT unique2 ) ( TEXT common1 TEXT common2 TEXT unique3 TEXT unique4 )", "OR (TEXT unique1 TEXT unique2) (TEXT unique3 TEXT unique4) TEXT common2 TEXT common1" },
 
 	/* non-matching cases */
-	{ "OR ( TEXT unique1 TEXT unique2 ) TEXT unique3", "(OR (TEXT unique1 TEXT unique2) TEXT unique3)" },
-	{ "OR ( TEXT unique1 TEXT unique2 ) ( TEXT unique3 TEXT unique4 )", "(OR (TEXT unique1 TEXT unique2) (TEXT unique3 TEXT unique4))" },
-	{ "OR ( TEXT common1 TEXT unique1 ) OR ( TEXT common1 TEXT unique2 ) TEXT unique3", "(OR (TEXT common1 TEXT unique1) OR (TEXT common1 TEXT unique2) TEXT unique3)" },
-	{ "OR ( TEXT common1 TEXT unique1 ) OR ( TEXT common1 TEXT common2 ) ( TEXT common2 TEXT unique2 )", "(OR (TEXT common1 TEXT unique1) OR (TEXT common1 TEXT common2) (TEXT common2 TEXT unique2))" },
+	{ "OR ( TEXT unique1 TEXT unique2 ) TEXT unique3", "OR (TEXT unique1 TEXT unique2) TEXT unique3" },
+	{ "OR ( TEXT unique1 TEXT unique2 ) ( TEXT unique3 TEXT unique4 )", "OR (TEXT unique1 TEXT unique2) (TEXT unique3 TEXT unique4)" },
+	{ "OR ( TEXT common1 TEXT unique1 ) OR ( TEXT common1 TEXT unique2 ) TEXT unique3", "OR (TEXT common1 TEXT unique1) OR (TEXT common1 TEXT unique2) TEXT unique3" },
+	{ "OR ( TEXT common1 TEXT unique1 ) OR ( TEXT common1 TEXT common2 ) ( TEXT common2 TEXT unique2 )", "OR (TEXT common1 TEXT unique1) OR (TEXT common1 TEXT common2) (TEXT common2 TEXT unique2)" },
 
 	/* SUB: drop redundant args */
 	{ "( OR TEXT common1 TEXT unique1 ) TEXT common1", "TEXT common1" },
 	{ "( OR TEXT unique1 TEXT common1 ) TEXT common1", "TEXT common1" },
 	{ "TEXT common1 ( OR TEXT common1 TEXT unique1 )", "TEXT common1" },
 	{ "TEXT common1 ( OR TEXT unique1 TEXT common1 )", "TEXT common1" },
-	{ "( OR TEXT common1 TEXT common2 ) ( OR TEXT common1 OR TEXT common2 TEXT unique1 )", "(OR TEXT common1 TEXT common2)" },
+	{ "( OR TEXT common1 TEXT common2 ) ( OR TEXT common1 OR TEXT common2 TEXT unique1 )", "OR TEXT common1 TEXT common2" },
 	{ "TEXT common1 ( OR TEXT unique1 TEXT common1 ) ( OR TEXT unique3 TEXT common1 )", "TEXT common1" },
-	{ "OR ( TEXT common1 ( OR TEXT unique1 TEXT common1 ) ) TEXT unique1", "(OR TEXT common1 TEXT unique1)" },
+	{ "OR ( TEXT common1 ( OR TEXT unique1 TEXT common1 ) ) TEXT unique1", "OR TEXT common1 TEXT unique1" },
 
 	/* SUB: extract common OR */
-	{ "( OR TEXT common1 TEXT unique1 ) ( OR TEXT common1 TEXT unique2 )", "(OR (TEXT unique1 TEXT unique2) TEXT common1)" },
-	{ "( OR TEXT unique1 TEXT common1 ) ( OR TEXT unique2 TEXT common1 )", "(OR (TEXT unique1 TEXT unique2) TEXT common1)" },
-	{ "( OR TEXT common1 TEXT unique1 ) ( OR TEXT unique2 TEXT common1 )", "(OR (TEXT unique1 TEXT unique2) TEXT common1)" },
-	{ "( OR TEXT unique1 TEXT common1 ) ( OR TEXT common1 TEXT unique2 )", "(OR (TEXT unique1 TEXT unique2) TEXT common1)" },
+	{ "( OR TEXT common1 TEXT unique1 ) ( OR TEXT common1 TEXT unique2 )", "OR (TEXT unique1 TEXT unique2) TEXT common1" },
+	{ "( OR TEXT unique1 TEXT common1 ) ( OR TEXT unique2 TEXT common1 )", "OR (TEXT unique1 TEXT unique2) TEXT common1" },
+	{ "( OR TEXT common1 TEXT unique1 ) ( OR TEXT unique2 TEXT common1 )", "OR (TEXT unique1 TEXT unique2) TEXT common1" },
+	{ "( OR TEXT unique1 TEXT common1 ) ( OR TEXT common1 TEXT unique2 )", "OR (TEXT unique1 TEXT unique2) TEXT common1" },
 
-	{ "( OR TEXT unique1 TEXT common1 ) ( OR TEXT common1 OR TEXT unique2 TEXT unique3 )", "(OR (TEXT unique1 (OR TEXT unique2 TEXT unique3)) TEXT common1)" },
-	{ "( OR TEXT common1 OR TEXT common2 TEXT unique1 ) ( OR TEXT common1 OR TEXT common2 TEXT unique2 )", "(OR (TEXT unique1 TEXT unique2) OR TEXT common2 TEXT common1)" },
-	{ "( OR TEXT common1 OR TEXT common2 OR TEXT unique1 TEXT unique2 ) ( OR TEXT common1 OR TEXT common2 OR TEXT unique3 TEXT unique4 )", "(OR ((OR TEXT unique1 TEXT unique2) (OR TEXT unique3 TEXT unique4)) OR TEXT common2 TEXT common1)" },
+	{ "( OR TEXT unique1 TEXT common1 ) ( OR TEXT common1 OR TEXT unique2 TEXT unique3 )", "OR (TEXT unique1 OR TEXT unique2 TEXT unique3) TEXT common1" },
+	{ "( OR TEXT common1 OR TEXT common2 TEXT unique1 ) ( OR TEXT common1 OR TEXT common2 TEXT unique2 )", "OR (TEXT unique1 TEXT unique2) OR TEXT common2 TEXT common1" },
+	{ "( OR TEXT common1 OR TEXT common2 OR TEXT unique1 TEXT unique2 ) ( OR TEXT common1 OR TEXT common2 OR TEXT unique3 TEXT unique4 )", "OR (OR TEXT unique1 TEXT unique2 OR TEXT unique3 TEXT unique4) OR TEXT common2 TEXT common1" },
 
 	/* non-matching cases */
-	{ "( OR TEXT unique1 TEXT unique2 ) TEXT unique3", "(OR TEXT unique1 TEXT unique2) TEXT unique3" },
-	{ "( OR TEXT unique1 TEXT unique2 ) ( OR TEXT unique3 TEXT unique4 )", "(OR TEXT unique1 TEXT unique2) (OR TEXT unique3 TEXT unique4)" },
-	{ "( OR TEXT common1 TEXT unique1 ) ( OR TEXT common1 TEXT unique2 ) TEXT unique3", "(OR TEXT common1 TEXT unique1) (OR TEXT common1 TEXT unique2) TEXT unique3" },
-	{ "( OR TEXT common1 TEXT unique1 ) ( OR TEXT common1 TEXT common2 ) ( OR TEXT common2 TEXT unique2 )", "(OR TEXT common1 TEXT unique1) (OR TEXT common1 TEXT common2) (OR TEXT common2 TEXT unique2)" },
+	{ "( OR TEXT unique1 TEXT unique2 ) TEXT unique3", "OR TEXT unique1 TEXT unique2 TEXT unique3" },
+	{ "( OR TEXT unique1 TEXT unique2 ) ( OR TEXT unique3 TEXT unique4 )", "OR TEXT unique1 TEXT unique2 OR TEXT unique3 TEXT unique4" },
+	{ "( OR TEXT common1 TEXT unique1 ) ( OR TEXT common1 TEXT unique2 ) TEXT unique3", "OR TEXT common1 TEXT unique1 OR TEXT common1 TEXT unique2 TEXT unique3" },
+	{ "( OR TEXT common1 TEXT unique1 ) ( OR TEXT common1 TEXT common2 ) ( OR TEXT common2 TEXT unique2 )", "OR TEXT common1 TEXT unique1 OR TEXT common1 TEXT common2 OR TEXT common2 TEXT unique2" },
 };
 
 static struct mail_search_args *