changeset 21961:3ef294f37e92

lib-storage: mail_search_args_simplify() - deduplicate KEYWORDs
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 13 Apr 2017 13:04:25 +0300
parents 9353f0cc30d3
children 65c149bea418
files src/lib-storage/mail-search-args-simplify.c src/lib-storage/test-mail-search-args-simplify.c
diffstat 2 files changed, 33 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/mail-search-args-simplify.c	Thu Apr 13 12:51:25 2017 +0300
+++ b/src/lib-storage/mail-search-args-simplify.c	Thu Apr 13 13:04:25 2017 +0300
@@ -106,6 +106,25 @@
 	}
 }
 
+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;
@@ -590,6 +609,9 @@
 		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);
--- a/src/lib-storage/test-mail-search-args-simplify.c	Thu Apr 13 12:51:25 2017 +0300
+++ b/src/lib-storage/test-mail-search-args-simplify.c	Thu Apr 13 13:04:25 2017 +0300
@@ -46,6 +46,17 @@
 	{ "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" },