dovecot-2.2: lib-fts: Delay stopwords filter full initialization...
dovecot at dovecot.org
dovecot at dovecot.org
Sat May 9 08:32:35 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/6a6ce51597f7
changeset: 18557:6a6ce51597f7
user: Teemu Huovila <teemu.huovila at dovecot.fi>
date: Sat May 09 11:15:34 2015 +0300
description:
lib-fts: Delay stopwords filter full initialization until it's needed.
diffstat:
src/lib-fts/fts-filter-stopwords.c | 27 +++++++++++++++++----------
src/lib-fts/test-fts-filter.c | 12 +++++++-----
2 files changed, 24 insertions(+), 15 deletions(-)
diffs (108 lines):
diff -r a45a328c5019 -r 6a6ce51597f7 src/lib-fts/fts-filter-stopwords.c
--- a/src/lib-fts/fts-filter-stopwords.c Sat May 09 11:14:51 2015 +0300
+++ b/src/lib-fts/fts-filter-stopwords.c Sat May 09 11:15:34 2015 +0300
@@ -74,7 +74,8 @@
static void fts_filter_stopwords_destroy(struct fts_filter *filter)
{
struct fts_filter_stopwords *sp = (struct fts_filter_stopwords *)filter;
- hash_table_destroy(&sp->stopwords);
+ if (hash_table_is_created(sp->stopwords))
+ hash_table_destroy(&sp->stopwords);
pool_unref(&sp->pool);
return;
}
@@ -87,7 +88,6 @@
{
struct fts_filter_stopwords *sp;
pool_t pp;
- int ret;
const char *dir = NULL;
unsigned int i;
@@ -101,7 +101,6 @@
return -1;
}
}
-
pp = pool_alloconly_create(MEMPOOL_GROWING"fts_filter_stopwords",
sizeof(struct fts_filter));
sp = p_new(pp, struct fts_filter_stopwords, 1);
@@ -109,19 +108,24 @@
sp->pool = pp;
sp->lang = p_malloc(sp->pool, sizeof(struct fts_language));
sp->lang->name = str_lcase(p_strdup(sp->pool, lang->name));
- hash_table_create(&sp->stopwords, sp->pool, 0, str_hash, strcmp);
if (dir != NULL)
sp->stopwords_dir = p_strdup(pp, dir);
else
sp->stopwords_dir = DATADIR"/stopwords";
*filter_r = &sp->filter;
+ return 0;
+}
+
+static int
+fts_filter_stopwords_create_stopwords(struct fts_filter_stopwords *sp)
+{
+ int ret;
+
+ hash_table_create(&sp->stopwords, sp->pool, 0, str_hash, strcmp);
ret = fts_filter_stopwords_read_list(sp);
- if (ret < 0) {
- *error_r = t_strdup_printf(
- "Failed to read stopword list %s", sp->stopwords_dir);
- fts_filter_stopwords_destroy(*filter_r);
- *filter_r = NULL;
- }
+ if (ret < 0)
+ sp->filter.error = t_strdup_printf("Failed to read stopword list %s",
+ sp->stopwords_dir);
return ret;
}
@@ -132,6 +136,9 @@
struct fts_filter_stopwords *sp =
(struct fts_filter_stopwords *) filter;
+ if (!hash_table_is_created(sp->stopwords))
+ if (fts_filter_stopwords_create_stopwords(sp) < 0)
+ return -1;
stopword = hash_table_lookup(sp->stopwords, *token);
if (stopword != NULL) {
*token = NULL;
diff -r a45a328c5019 -r 6a6ce51597f7 src/lib-fts/test-fts-filter.c
--- a/src/lib-fts/test-fts-filter.c Sat May 09 11:14:51 2015 +0300
+++ b/src/lib-fts/test-fts-filter.c Sat May 09 11:15:34 2015 +0300
@@ -160,18 +160,20 @@
test_end();
}
-static void test_fts_filter_stopwords_fail_create(void)
+static void test_fts_filter_stopwords_fail_lazy_init(void)
{
const struct fts_filter *filter_class;
const struct fts_language unknown = { .name = "bebobidoop" };
struct fts_filter *filter = NULL;
- const char *error;
+ const char *error = NULL, *token = "foobar";
int ret;
- test_begin("fts filter stopwords, fail create()");
+ test_begin("fts filter stopwords, fail filter() (lazy init)");
filter_class = fts_filter_find(STOPWORDS_FILTER_NAME);
ret = fts_filter_create(filter_class, NULL, &unknown, stopword_settings, &filter, &error);
- test_assert(ret == -1 && filter == NULL && error != NULL);
+ test_assert(ret == 0 && filter != NULL && error == NULL);
+ ret = fts_filter_filter(filter, &token, &error);
+ test_assert(ret == -1 && error != NULL);
test_end();
}
@@ -545,7 +547,7 @@
test_fts_filter_stopwords_eng,
test_fts_filter_stopwords_fin,
test_fts_filter_stopwords_fra,
- test_fts_filter_stopwords_fail_create,
+ test_fts_filter_stopwords_fail_lazy_init,
#ifdef HAVE_FTS_STEMMER
test_fts_filter_stemmer_snowball_stem_english,
test_fts_filter_stemmer_snowball_stem_french,
More information about the dovecot-cvs
mailing list