]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: mail_search_args_simplify() handles now SEARCH_SMALLER/LARGER
authorTimo Sirainen <tss@iki.fi>
Thu, 23 Apr 2015 18:00:43 +0000 (21:00 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 23 Apr 2015 18:00:43 +0000 (21:00 +0300)
src/lib-storage/mail-search-args-simplify.c
src/lib-storage/test-mail-search-args-simplify.c

index c14ab32756c6fe5c6b9d35f4bf63218cfe5eb111..89a5929ea23d307d1ae03cb3299cea9658d41a2a 100644 (file)
@@ -159,12 +159,69 @@ static bool mail_search_args_merge_time(struct mail_search_simplify_ctx *ctx,
        return FALSE;
 }
 
+static bool mail_search_args_merge_size(struct mail_search_simplify_ctx *ctx,
+                                       struct mail_search_arg *args)
+{
+       struct mail_search_arg mask;
+       struct mail_search_arg **prev_argp, *prev_arg;
+
+       mail_search_arg_get_base_mask(args, &mask);
+       prev_argp = mail_search_args_simplify_get_prev_argp(ctx, &mask);
+
+       if (*prev_argp == NULL) {
+               *prev_argp = args;
+               return FALSE;
+       }
+
+       prev_arg = *prev_argp;
+       switch (args->type) {
+       case SEARCH_SMALLER:
+               if (ctx->parent_and) {
+                       if (prev_arg->value.size < args->value.size) {
+                               /* prev_arg < 5 AND arg < 10 */
+                       } else {
+                               /* prev_arg < 10 AND arg < 5 */
+                               prev_arg->value.size = args->value.size;
+                       }
+               } else {
+                       if (prev_arg->value.size < args->value.size) {
+                               /* prev_arg < 5 OR arg < 10 */
+                               prev_arg->value.size = args->value.size;
+                       } else {
+                               /* prev_arg < 10 OR arg < 5 */
+                       }
+               }
+               return TRUE;
+       case SEARCH_LARGER:
+               if (ctx->parent_and) {
+                       if (prev_arg->value.size < args->value.size) {
+                               /* prev_arg >= 5 AND arg >= 10 */
+                               prev_arg->value.size = args->value.size;
+                       } else {
+                               /* prev_arg >= 10 AND arg >= 5 */
+                       }
+               } else {
+                       if (prev_arg->value.size < args->value.size) {
+                               /* prev_arg >= 5 OR arg >= 10 */
+                       } else {
+                               /* prev_arg >= 10 OR arg >= 5 */
+                               prev_arg->value.size = args->value.size;
+                       }
+               }
+               return TRUE;
+       default:
+               break;
+       }
+       return FALSE;
+}
+
 static bool
 mail_search_args_simplify_sub(struct mailbox *box,
                              struct mail_search_arg *args, bool parent_and)
 {
        struct mail_search_simplify_ctx ctx;
        struct mail_search_arg *sub, *prev_arg = NULL;
+       bool merged;
 
        memset(&ctx, 0, sizeof(ctx));
        ctx.parent_and = parent_and;
@@ -210,8 +267,6 @@ mail_search_args_simplify_sub(struct mailbox *box,
                }
 
                /* try to merge arguments */
-               bool merged;
-
                switch (args->type) {
                case SEARCH_FLAGS:
                        merged = mail_search_args_merge_flags(&ctx, args);
@@ -225,6 +280,10 @@ mail_search_args_simplify_sub(struct mailbox *box,
                case SEARCH_SINCE:
                        merged = mail_search_args_merge_time(&ctx, args);
                        break;
+               case SEARCH_SMALLER:
+               case SEARCH_LARGER:
+                       merged = mail_search_args_merge_size(&ctx, args);
+                       break;
                default:
                        merged = FALSE;
                        break;
index f76010d538f4f5375141854304f55157e8fac7e8..9613a1e51bc2d730ccc5dab9977d7645d554fd2b 100644 (file)
@@ -68,6 +68,18 @@ struct {
        { "SINCE 03-Aug-2014 NOT SINCE 01-Aug-2014 SINCE 02-Aug-2014", "SINCE \"03-Aug-2014\" NOT SINCE \"01-Aug-2014\"" },
        { "SENTSINCE 03-Aug-2014 SENTSINCE 01-Aug-2014 SENTSINCE 02-Aug-2014", "SENTSINCE \"03-Aug-2014\"" },
        { "SENTSINCE 03-Aug-2014 SINCE 01-Aug-2014 SENTSINCE 02-Aug-2014", "SENTSINCE \"03-Aug-2014\" SINCE \"01-Aug-2014\"" },
+
+       { "SMALLER 1 SMALLER 2", "SMALLER 1" },
+       { "OR SMALLER 1 SMALLER 2", "SMALLER 2" },
+       { "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)" },
+
+       { "LARGER 3 LARGER 1 LARGER 2", "LARGER 3" },
+       { "OR LARGER 1 LARGER 2", "LARGER 1" },
+       { "OR LARGER 1 OR LARGER 3 LARGER 2", "LARGER 1" },
+       { "LARGER 3 NOT LARGER 1 LARGER 2", "LARGER 3 NOT LARGER 1" }
 };
 
 static struct mail_search_args *