]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts: When searching data headers, don't expand search keys to all languages.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 16 Feb 2016 16:34:19 +0000 (18:34 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 16 Feb 2016 16:34:19 +0000 (18:34 +0200)
For example "SEARCH HEADER Message-Id foo@example.com" works better the
less expansion there is for "foo@example.com".

src/plugins/fts/fts-search-args.c
src/plugins/fts/fts-user.c
src/plugins/fts/fts-user.h

index b99ce8d9eb63dbffa8cc3afbcf3aa5c312e2bb4b..5750b420d74e2bc2988cf73aaccf998e4a157a6c 100644 (file)
@@ -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. */
index a84b7d5a889fe6651b089108b84f6bf18e09accc..583d439bf5ccb4a4960ab0c053a6f38f56e5d286 100644 (file)
@@ -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);
index 1c2159d599cba2c62cbbf2b177f000a112d7bc2f..0ff86d6bd1362cd310ef05940660a380d1ef833d 100644 (file)
@@ -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);