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;
 }