dovecot-2.2: lib-fts: Delay snowball filter initialization until...

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


details:   http://hg.dovecot.org/dovecot-2.2/rev/a45a328c5019
changeset: 18556:a45a328c5019
user:      Teemu Huovila <teemu.huovila at dovecot.fi>
date:      Sat May 09 11:14:51 2015 +0300
description:
lib-fts: Delay snowball filter initialization until it's needed.

diffstat:

 src/lib-fts/fts-filter-stemmer-snowball.c |  33 ++++++++++++++++++++++--------
 1 files changed, 24 insertions(+), 9 deletions(-)

diffs (76 lines):

diff -r 230698a51fbb -r a45a328c5019 src/lib-fts/fts-filter-stemmer-snowball.c
--- a/src/lib-fts/fts-filter-stemmer-snowball.c	Sat May 09 11:13:49 2015 +0300
+++ b/src/lib-fts/fts-filter-stemmer-snowball.c	Sat May 09 11:14:51 2015 +0300
@@ -11,6 +11,8 @@
 
 struct fts_filter_stemmer_snowball {
 	struct fts_filter filter;
+	pool_t pool;
+	struct fts_language *lang;
 	struct sb_stemmer *stemmer;
 };
 
@@ -33,7 +35,7 @@
 
 	if (sp->stemmer != NULL)
 		sb_stemmer_delete(sp->stemmer);
-	i_free(sp);
+	pool_unref(&sp->pool);
 }
 
 static int
@@ -43,6 +45,7 @@
                                    const char **error_r)
 {
 	struct fts_filter_stemmer_snowball *sp;
+	pool_t pp;
 
 	*filter_r = NULL;
 
@@ -50,19 +53,27 @@
 		*error_r = t_strdup_printf("Unknown setting: %s", settings[0]);
 		return -1;
 	}
+	pp = pool_alloconly_create(MEMPOOL_GROWING"fts_filter_stemmer_snowball",
+	                           sizeof(struct fts_filter));
+	sp = p_new(pp, struct fts_filter_stemmer_snowball, 1);
+	sp->pool = pp;
+	sp->filter = *fts_filter_stemmer_snowball;
+	sp->lang = p_malloc(sp->pool, sizeof(struct fts_language));
+	sp->lang->name = str_lcase(p_strdup(sp->pool, lang->name));
+	*filter_r = &sp->filter;
+	return 0;
+}
 
-	sp = i_new(struct fts_filter_stemmer_snowball, 1);
-	sp->filter = *fts_filter_stemmer_snowball;
-	sp->stemmer = sb_stemmer_new(t_str_lcase(lang->name), NULL);
+static int
+fts_filter_stemmer_snowball_create_stemmer(struct fts_filter_stemmer_snowball *sp)
+{
+	sp->stemmer = sb_stemmer_new(sp->lang->name, NULL);
 	if (sp->stemmer == NULL) {
-		if (error_r != NULL) {
-			*error_r = t_strdup_printf("Creating a Snowball stemmer failed." \
-			                    " lang: %s", lang->name);
-		}
+		sp->filter.error = t_strdup_printf("Creating a Snowball stemmer failed." \
+		                                   " lang: %s", sp->lang->name);
 		fts_filter_stemmer_snowball_destroy(&sp->filter);
 		return -1;
 	}
-	*filter_r = &sp->filter;
 	return 0;
 }
 
@@ -75,6 +86,10 @@
 	struct fts_filter_stemmer_snowball *sp =
 		(struct fts_filter_stemmer_snowball *) filter;
 
+	if (sp->stemmer == NULL)
+		if (fts_filter_stemmer_snowball_create_stemmer(sp) < 0)
+			return -1;
+
 	base = sb_stemmer_stem(sp->stemmer, (const unsigned char *)*token, strlen(*token));
 	len = sb_stemmer_length(sp->stemmer);
 	*token = t_strdup_until(base, base + len);


More information about the dovecot-cvs mailing list