]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: mail_search_args_to_imap() - don't add parenthesis around OR
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 30 May 2017 20:53:44 +0000 (23:53 +0300)
committerGitLab <gitlab@git.dovecot.net>
Sun, 4 Jun 2017 16:09:24 +0000 (19:09 +0300)
There's no need to write "(OR a b)" when "OR a b" works just the same.

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

index 9d24d18be227e623daa10debcb62c5f0fcbaf9a8..793e6b70ce14c0010bef372d2731c8d179fc3ccc 100644 (file)
@@ -20,7 +20,8 @@ mail_search_subargs_to_imap(string_t *dest, const struct mail_search_arg *args,
 {
        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 @@ mail_search_subargs_to_imap(string_t *dest, const struct mail_search_arg *args,
                if (arg->next != NULL)
                        str_append_c(dest, ' ');
        }
-       str_append_c(dest, ')');
+       if (prefix[0] == '\0')
+               str_append_c(dest, ')');
        return TRUE;
 }
 
index 411a48e4bad7effae627e3f0fbf3b246c5b6b22e..4a4b95607e0c3ebaae06a893370982f414593ff6 100644 (file)
@@ -355,7 +355,8 @@ mail_search_mime_subargs_to_imap(string_t *dest,
 {
        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 @@ mail_search_mime_subargs_to_imap(string_t *dest,
                if (arg->next != NULL)
                        str_append_c(dest, ' ');
        }
-       str_append_c(dest, ')');
+       if (prefix[0] == '\0')
+               str_append_c(dest, ')');
        return TRUE;
 }
 
index 1980a8460e498017e3c90abea39992cc81e869bf..1bc0c996219e45ce3fb940e6f32c29e8c8369aee 100644 (file)
@@ -58,7 +58,7 @@ static const struct {
        { "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 @@ static const struct {
          "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 @@ static const struct {
        { "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 ) )",
index 4862be83164879596b29bde1e2eec008f372ed10..ed8addb023251b3eb4a16b0684dc572b4f42dc59 100644 (file)
@@ -27,30 +27,30 @@ static const struct {
        { "( ( 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 @@ static const struct {
        { "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 @@ static const struct {
 
        { "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 @@ static const struct {
        { "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 @@ static const struct {
        { "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 *