changeset 19759:ca563b2b6788

fts: When searching data headers, don't expand search keys to all languages. For example "SEARCH HEADER Message-Id foo@example.com" works better the less expansion there is for "foo@example.com".
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Tue, 16 Feb 2016 18:34:19 +0200
parents 526084651206
children a46848c73d7f
files src/plugins/fts/fts-search-args.c src/plugins/fts/fts-user.c src/plugins/fts/fts-user.h
diffstat 3 files changed, 22 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/fts/fts-search-args.c	Tue Feb 16 18:33:46 2016 +0200
+++ b/src/plugins/fts/fts-search-args.c	Tue Feb 16 18:34:19 2016 +0200
@@ -148,7 +148,13 @@
 	struct mail_search_arg *or_arg, *orig_arg = *argp;
 	const char *error, *orig_token = orig_arg->value.str;
 
-	languages = fts_user_get_all_languages(backend->ns->user);
+	if ((*argp)->type == SEARCH_HEADER &&
+	    !fts_header_has_language((*argp)->hdr_field_name)) {
+		/* use only the data-language */
+		languages = fts_user_get_data_languages(backend->ns->user);
+	} else {
+		languages = fts_user_get_all_languages(backend->ns->user);
+	}
 
 	/* OR together all the different expansions for different languages.
 	   it's enough for one of them to match. */
--- a/src/plugins/fts/fts-user.c	Tue Feb 16 18:33:46 2016 +0200
+++ b/src/plugins/fts/fts-user.c	Tue Feb 16 18:34:19 2016 +0200
@@ -17,7 +17,7 @@
 
 	struct fts_language_list *lang_list;
 	struct fts_user_language *data_lang;
-	ARRAY_TYPE(fts_user_language) languages;
+	ARRAY_TYPE(fts_user_language) languages, data_languages;
 };
 
 static MODULE_CONTEXT_DEFINE_INIT(fts_user_module,
@@ -292,6 +292,10 @@
 			      &user_lang->filter, &error) < 0)
 		i_unreached();
 	i_assert(user_lang->filter != NULL);
+
+	p_array_init(&fuser->data_languages, user->pool, 1);
+	array_append(&fuser->data_languages, &user_lang, 1);
+
 	fuser->data_lang = user_lang;
 	return 0;
 }
@@ -311,6 +315,14 @@
 	return &fuser->languages;
 }
 
+const ARRAY_TYPE(fts_user_language) *
+fts_user_get_data_languages(struct mail_user *user)
+{
+	struct fts_user *fuser = FTS_USER_CONTEXT(user);
+
+	return &fuser->data_languages;
+}
+
 struct fts_user_language *fts_user_get_data_lang(struct mail_user *user)
 {
 	struct fts_user *fuser = FTS_USER_CONTEXT(user);
--- a/src/plugins/fts/fts-user.h	Tue Feb 16 18:33:46 2016 +0200
+++ b/src/plugins/fts/fts-user.h	Tue Feb 16 18:34:19 2016 +0200
@@ -15,6 +15,8 @@
 const ARRAY_TYPE(fts_user_language) *
 fts_user_get_all_languages(struct mail_user *user);
 struct fts_user_language *fts_user_get_data_lang(struct mail_user *user);
+const ARRAY_TYPE(fts_user_language) *
+fts_user_get_data_languages(struct mail_user *user);
 
 int fts_mail_user_init(struct mail_user *user, const char **error_r);
 void fts_mail_user_deinit(struct mail_user *user);