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