Skip to content

Commit

Permalink
lib-storage: mail_search_args_simplify() - deduplicate KEYWORDs
Browse files Browse the repository at this point in the history
  • Loading branch information
sirainen committed Apr 13, 2017
1 parent 7b6ebd5 commit 1c00201
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 0 deletions.
22 changes: 22 additions & 0 deletions src/lib-storage/mail-search-args-simplify.c
Expand Up @@ -106,6 +106,25 @@ static bool mail_search_args_merge_flags(struct mail_search_simplify_ctx *ctx,
}
}

static bool
mail_search_args_merge_keywords(struct mail_search_simplify_ctx *ctx,
struct mail_search_arg *args)
{
struct mail_search_simplify_prev_arg mask;
struct mail_search_arg **prev_argp;

mail_search_arg_get_base_mask(args, &mask);
mask.str_mask = args->value.str;
prev_argp = mail_search_args_simplify_get_prev_argp(ctx, &mask);

if (*prev_argp == NULL) {
*prev_argp = args;
return FALSE;
}
/* duplicate keyword. */
return TRUE;
}

static void mail_search_args_simplify_set(struct mail_search_arg *args)
{
const struct seq_range *seqset;
Expand Down Expand Up @@ -590,6 +609,9 @@ mail_search_args_simplify_sub(struct mailbox *box, pool_t pool,
case SEARCH_FLAGS:
merged = mail_search_args_merge_flags(&ctx, args);
break;
case SEARCH_KEYWORDS:
merged = mail_search_args_merge_keywords(&ctx, args);
break;
case SEARCH_SEQSET:
case SEARCH_UIDSET:
merged = mail_search_args_merge_set(&ctx, args);
Expand Down
11 changes: 11 additions & 0 deletions src/lib-storage/test-mail-search-args-simplify.c
Expand Up @@ -46,6 +46,17 @@ static const struct {
{ "ANSWERED NOT FLAGGED SEEN NOT DRAFT", "(ANSWERED SEEN) NOT (FLAGGED) NOT (DRAFT)" },
{ "OR NOT ANSWERED NOT SEEN", "NOT (ANSWERED SEEN)" },

{ "KEYWORD foo", "KEYWORD foo" },
{ "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)" },

{ "KEYWORD foo KEYWORD foo", "KEYWORD foo" },
{ "OR KEYWORD foo KEYWORD foo", "KEYWORD foo" },
{ "NOT KEYWORD foo NOT KEYWORD foo", "NOT KEYWORD foo" },

{ "1:* 1:*", "ALL" },
{ "OR 1:5 6:*", "ALL" },

Expand Down

0 comments on commit 1c00201

Please sign in to comment.