dovecot-2.2: fts: Create filters earlier

dovecot at dovecot.org dovecot at dovecot.org
Sat May 9 08:32:02 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/abbd71252175
changeset: 18548:abbd71252175
user:      Teemu Huovila <teemu.huovila at dovecot.fi>
date:      Sat May 09 10:53:25 2015 +0300
description:
fts: Create filters earlier

This builds on the assumption that early initialization will be made
less costly, in a coming change.

diffstat:

 src/plugins/fts/fts-build-mail.c  |  10 +++-------
 src/plugins/fts/fts-search-args.c |   8 --------
 src/plugins/fts/fts-user.c        |  38 +++++++++++++++++++-------------------
 src/plugins/fts/fts-user.h        |   8 +++-----
 4 files changed, 25 insertions(+), 39 deletions(-)

diffs (152 lines):

diff -r 6ec2073bbf5c -r abbd71252175 src/plugins/fts/fts-build-mail.c
--- 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,
diff -r 6ec2073bbf5c -r abbd71252175 src/plugins/fts/fts-search-args.c
--- 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 */
diff -r 6ec2073bbf5c -r abbd71252175 src/plugins/fts/fts-user.c
--- 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;
 }
diff -r 6ec2073bbf5c -r abbd71252175 src/plugins/fts/fts-user.h
--- 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) *


More information about the dovecot-cvs mailing list