Mercurial > dovecot > core-2.2
changeset 18548:abbd71252175
fts: Create filters earlier
This builds on the assumption that early initialization will be made
less costly, in a coming change.
author | Teemu Huovila <teemu.huovila@dovecot.fi> |
---|---|
date | Sat, 09 May 2015 10:53:25 +0300 |
parents | 6ec2073bbf5c |
children | ae0458c63761 |
files | src/plugins/fts/fts-build-mail.c src/plugins/fts/fts-search-args.c src/plugins/fts/fts-user.c src/plugins/fts/fts-user.h |
diffstat | 4 files changed, 25 insertions(+), 39 deletions(-) [+] |
line wrap: on
line diff
--- a/src/plugins/fts/fts-build-mail.c Fri May 08 16:00:16 2015 +0300 +++ b/src/plugins/fts/fts-build-mail.c Sat May 09 10:53:25 2015 +0300 @@ -299,7 +299,6 @@ { struct mail_user *user = ctx->update_ctx->backend->ns->user; const struct fts_language *lang; - const char *error; int ret; if (ctx->cur_user_lang != NULL) { @@ -310,12 +309,9 @@ /* wait for more data */ return 0; } else { - if (fts_user_language_get(user, lang, &ctx->cur_user_lang, - &error) < 0) { - i_error("fts: Can't index input because of invalid language '%s' config: %s", - lang->name, error); - return -1; - } + ctx->cur_user_lang = fts_user_language_find(user, lang); + i_assert(ctx->cur_user_lang != NULL); + if (ctx->pending_input->used > 0) { if (fts_build_add_tokens_with_filter(ctx, ctx->pending_input->data,
--- a/src/plugins/fts/fts-search-args.c Fri May 08 16:00:16 2015 +0300 +++ b/src/plugins/fts/fts-search-args.c Sat May 09 10:53:25 2015 +0300 @@ -151,15 +151,7 @@ int fts_search_args_expand(struct fts_backend *backend, struct mail_search_args *args) { - const char *error; - /* we need to know all the possible languages for building the - search query. each search word queried by passing it through each - language's filters. */ - if (fts_user_languages_fill_all(backend->ns->user, &error) < 0) { - i_error("fts_dovecot: Failed to initialize languages: %s", error); - return -1; - } fts_search_args_expand_tree(backend, args->pool, &args->args); /* we'll need to re-simplify the args if we changed anything */
--- a/src/plugins/fts/fts-user.c Fri May 08 16:00:16 2015 +0300 +++ b/src/plugins/fts/fts-user.c Sat May 09 10:53:25 2015 +0300 @@ -114,12 +114,13 @@ return 0; } -static struct fts_user_language * -fts_user_language_find(struct fts_user *fuser, +struct fts_user_language * +fts_user_language_find(struct mail_user *user, const struct fts_language *lang) { struct fts_user_language *const *user_langp; - + struct fts_user *fuser = FTS_USER_CONTEXT(user); + array_foreach(&fuser->languages, user_langp) { if (strcmp((*user_langp)->lang->name, lang->name) == 0) return *user_langp; @@ -127,19 +128,13 @@ return NULL; } -int fts_user_language_get(struct mail_user *user, - const struct fts_language *lang, - struct fts_user_language **user_lang_r, - const char **error_r) +static int fts_user_language_create(struct mail_user *user, + struct fts_user *fuser, + const struct fts_language *lang, + const char **error_r) { - struct fts_user *fuser = FTS_USER_CONTEXT(user); + struct fts_filter *filter; struct fts_user_language *user_lang; - struct fts_filter *filter; - - *user_lang_r = fts_user_language_find(fuser, lang); - if (*user_lang_r != NULL) - return 0; - if (fts_user_create_filters(user, lang, &filter, error_r) < 0) return -1; @@ -148,18 +143,17 @@ user_lang->filter = filter; array_append(&fuser->languages, &user_lang, 1); - *user_lang_r = user_lang; return 0; } -int fts_user_languages_fill_all(struct mail_user *user, const char **error_r) +static int fts_user_languages_fill_all(struct mail_user *user, + struct fts_user *fuser, + const char **error_r) { - struct fts_user *fuser = FTS_USER_CONTEXT(user); const struct fts_language *const *langp; - struct fts_user_language *user_lang; array_foreach(fts_language_list_get_all(fuser->lang_list), langp) { - if (fts_user_language_get(user, *langp, &user_lang, error_r) < 0) + if (fts_user_language_create(user, fuser, *langp, error_r) < 0) return -1; } return 0; @@ -196,6 +190,7 @@ int fts_mail_user_init(struct mail_user *user, const char **error_r) { struct fts_user *fuser; + const char *error; fuser = p_new(user->pool, struct fts_user, 1); p_array_init(&fuser->languages, user->pool, 4); @@ -204,6 +199,11 @@ fts_user_free(fuser); return -1; } + if (fts_user_languages_fill_all(user, fuser, &error) < 0) { + i_error("fts_dovecot: Failed to initialize languages: %s", error); + fts_user_free(fuser); + return -1; + } MODULE_CONTEXT_SET(user, fts_user_module, fuser); return 0; }
--- a/src/plugins/fts/fts-user.h Fri May 08 16:00:16 2015 +0300 +++ b/src/plugins/fts/fts-user.h Sat May 09 10:53:25 2015 +0300 @@ -7,11 +7,9 @@ }; ARRAY_DEFINE_TYPE(fts_user_language, struct fts_user_language *); -int fts_user_language_get(struct mail_user *user, - const struct fts_language *lang, - struct fts_user_language **user_lang_r, - const char **error_r); -int fts_user_languages_fill_all(struct mail_user *user, const char **error_r); +struct fts_user_language * +fts_user_language_find(struct mail_user *user, + const struct fts_language *lang); struct fts_language_list *fts_user_get_language_list(struct mail_user *user); const ARRAY_TYPE(fts_user_language) *