Mercurial > dovecot > original-hg > dovecot-2.1
changeset 4934:5ffaf2d47671 HEAD
Fixed filtering to work with Lucene. Generic FTS code now implements the
filtering if the backend doesn't.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 20 Dec 2006 16:46:22 +0200 |
parents | 44a0e7606f7a |
children | f768dd773e6b |
files | src/plugins/fts-lucene/fts-backend-lucene.c src/plugins/fts-lucene/lucene-wrapper.cc src/plugins/fts-lucene/lucene-wrapper.h src/plugins/fts/fts-api.c |
diffstat | 4 files changed, 32 insertions(+), 22 deletions(-) [+] |
line wrap: on
line diff
--- a/src/plugins/fts-lucene/fts-backend-lucene.c Wed Dec 20 16:45:39 2006 +0200 +++ b/src/plugins/fts-lucene/fts-backend-lucene.c Wed Dec 20 16:46:22 2006 +0200 @@ -177,17 +177,6 @@ return lucene_index_lookup(backend->lstorage->index, key, result); } -static int -fts_backend_lucene_filter(struct fts_backend *_backend, const char *key, - ARRAY_TYPE(seq_range) *result) -{ - struct lucene_fts_backend *backend = - (struct lucene_fts_backend *)_backend; - - fts_backend_select(backend); - return lucene_index_filter(backend->lstorage->index, key, result); -} - struct fts_backend fts_backend_lucene = { "lucene", TRUE, @@ -204,6 +193,6 @@ fts_backend_lucene_lock, fts_backend_lucene_unlock, fts_backend_lucene_lookup, - fts_backend_lucene_filter + NULL } };
--- a/src/plugins/fts-lucene/lucene-wrapper.cc Wed Dec 20 16:45:39 2006 +0200 +++ b/src/plugins/fts-lucene/lucene-wrapper.cc Wed Dec 20 16:46:22 2006 +0200 @@ -475,10 +475,3 @@ _CLDELETE(content_query); return ret; } - -int lucene_index_filter(struct lucene_index *index, const char *key, - ARRAY_TYPE(seq_range) *result) -{ - /* FIXME: implement */ - return -1; -}
--- a/src/plugins/fts-lucene/lucene-wrapper.h Wed Dec 20 16:45:39 2006 +0200 +++ b/src/plugins/fts-lucene/lucene-wrapper.h Wed Dec 20 16:46:22 2006 +0200 @@ -19,7 +19,5 @@ int lucene_index_lookup(struct lucene_index *index, const char *key, ARRAY_TYPE(seq_range) *result); -int lucene_index_filter(struct lucene_index *index, const char *key, - ARRAY_TYPE(seq_range) *result); #endif
--- a/src/plugins/fts/fts-api.c Wed Dec 20 16:45:39 2006 +0200 +++ b/src/plugins/fts/fts-api.c Wed Dec 20 16:46:22 2006 +0200 @@ -107,5 +107,35 @@ int fts_backend_filter(struct fts_backend *backend, const char *key, ARRAY_TYPE(seq_range) *result) { - return backend->v.filter(backend, key, result); + ARRAY_TYPE(seq_range) tmp_result; + int ret; + + if (backend->v.filter != NULL) + return backend->v.filter(backend, key, result); + + /* do this ourself */ + i_array_init(&tmp_result, 64); + ret = fts_backend_lookup(backend, key, &tmp_result); + if (ret == 0) { + const struct seq_range *range; + unsigned int i, count; + uint32_t next_seq = 1; + + range = array_get(&tmp_result, &count); + for (i = 0; i < count; i++) { + if (next_seq != range[i].seq1) { + seq_range_array_remove_range(result, next_seq, + range[i].seq1 - 1); + } + next_seq = range[i].seq2 + 1; + } + + range = array_get(result, &count); + if (count > 0) { + seq_range_array_remove_range(result, next_seq, + range[count-1].seq2); + } + } + array_free(&tmp_result); + return ret; }