From: Timo Sirainen Date: Tue, 16 Feb 2016 16:34:19 +0000 (+0200) Subject: fts: When searching data headers, don't expand search keys to all languages. X-Git-Tag: 2.2.22.rc1~161 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ebcd7cf40e53c2bbc98f7f686e206cda5c0e3111;p=thirdparty%2Fdovecot%2Fcore.git 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". --- diff --git a/src/plugins/fts/fts-search-args.c b/src/plugins/fts/fts-search-args.c index b99ce8d9eb..5750b420d7 100644 --- a/src/plugins/fts/fts-search-args.c +++ b/src/plugins/fts/fts-search-args.c @@ -148,7 +148,13 @@ static int fts_search_arg_expand(struct fts_backend *backend, pool_t pool, 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. */ diff --git a/src/plugins/fts/fts-user.c b/src/plugins/fts/fts-user.c index a84b7d5a88..583d439bf5 100644 --- a/src/plugins/fts/fts-user.c +++ b/src/plugins/fts/fts-user.c @@ -17,7 +17,7 @@ struct fts_user { 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 @@ fts_user_init_data_language(struct mail_user *user, struct fts_user *fuser, &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 @@ fts_user_get_all_languages(struct mail_user *user) 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); diff --git a/src/plugins/fts/fts-user.h b/src/plugins/fts/fts-user.h index 1c2159d599..0ff86d6bd1 100644 --- a/src/plugins/fts/fts-user.h +++ b/src/plugins/fts/fts-user.h @@ -15,6 +15,8 @@ struct fts_language_list *fts_user_get_language_list(struct mail_user *user); 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);