You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2014/11/05 10:06:15 UTC
svn commit: r1636828 - in /lucene/dev/branches/branch_5x: ./ lucene/
lucene/core/
lucene/core/src/java/org/apache/lucene/search/FieldValueFilter.java
lucene/core/src/test/org/apache/lucene/search/TestFieldValueFilter.java
Author: jpountz
Date: Wed Nov 5 09:06:14 2014
New Revision: 1636828
URL: http://svn.apache.org/r1636828
Log:
LUCENE-6038: Re-enable FieldValueFilter optimizations based on the way the docsWithField bits are implemented.
Modified:
lucene/dev/branches/branch_5x/ (props changed)
lucene/dev/branches/branch_5x/lucene/ (props changed)
lucene/dev/branches/branch_5x/lucene/core/ (props changed)
lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/FieldValueFilter.java
lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestFieldValueFilter.java
Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/FieldValueFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/FieldValueFilter.java?rev=1636828&r1=1636827&r2=1636828&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/FieldValueFilter.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/FieldValueFilter.java Wed Nov 5 09:06:14 2014
@@ -20,6 +20,8 @@ import java.io.IOException;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.DocValues;
+import org.apache.lucene.util.BitDocIdSet;
+import org.apache.lucene.util.BitSet;
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.Bits.MatchAllBits;
import org.apache.lucene.util.Bits.MatchNoBits;
@@ -93,10 +95,10 @@ public class FieldValueFilter extends Fi
if (docsWithField instanceof MatchNoBits) {
return null;
}
- if (docsWithField instanceof DocIdSet) {
+ if (docsWithField instanceof BitSet) {
// UweSays: this is always the case for our current impl - but who knows
// :-)
- return BitsFilteredDocIdSet.wrap((DocIdSet) docsWithField, acceptDocs);
+ return BitsFilteredDocIdSet.wrap(new BitDocIdSet((BitSet) docsWithField), acceptDocs);
}
return new DocValuesDocIdSet(context.reader().maxDoc(), acceptDocs) {
@Override
Modified: lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestFieldValueFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestFieldValueFilter.java?rev=1636828&r1=1636827&r2=1636828&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestFieldValueFilter.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestFieldValueFilter.java Wed Nov 5 09:06:14 2014
@@ -23,12 +23,20 @@ import org.apache.lucene.document.Docume
import org.apache.lucene.document.Field;
import org.apache.lucene.document.SortedDocValuesField;
import org.apache.lucene.index.DirectoryReader;
+import org.apache.lucene.index.FilterLeafReader;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.LeafReader;
+import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.RandomIndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.BitDocIdSet;
+import org.apache.lucene.util.BitSet;
+import org.apache.lucene.util.Bits;
import org.apache.lucene.util.BytesRef;
+import org.apache.lucene.util.FixedBitSet;
import org.apache.lucene.util.LuceneTestCase;
+import org.apache.lucene.util.SparseFixedBitSet;
/**
*
@@ -77,8 +85,8 @@ public class TestFieldValueFilter extend
}
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = newSearcher(reader);
- TopDocs search = searcher.search(new TermQuery(new Term("all", "test")),
- new FieldValueFilter("some"), docs);
+ Filter filter = new FieldValueFilter("some");
+ TopDocs search = searcher.search(new TermQuery(new Term("all", "test")), filter, docs);
assertEquals(search.totalHits, numDocsWithValue);
ScoreDoc[] scoreDocs = search.scoreDocs;
@@ -90,6 +98,48 @@ public class TestFieldValueFilter extend
directory.close();
}
+ public void testOptimizations() throws IOException {
+ Directory directory = newDirectory();
+ RandomIndexWriter writer = new RandomIndexWriter(random(), directory,
+ newIndexWriterConfig(new MockAnalyzer(random())));
+ final int docs = atLeast(10);
+ buildIndex(writer, docs);
+ IndexReader reader = DirectoryReader.open(directory);
+ LeafReader leafReader = reader.leaves().get(0).reader();
+
+ FilterLeafReader filterReader = new FilterLeafReader(leafReader) {
+ @Override
+ public Bits getDocsWithField(String field) throws IOException {
+ switch (field) {
+ case "with_matchall":
+ return new Bits.MatchAllBits(maxDoc());
+ case "with_matchno":
+ return new Bits.MatchNoBits(maxDoc());
+ case "with_bitset":
+ BitSet b = random().nextBoolean() ? new SparseFixedBitSet(maxDoc()) : new FixedBitSet(maxDoc());
+ b.set(random().nextInt(maxDoc()));
+ return b;
+ }
+ return super.getDocsWithField(field);
+ }
+ };
+
+ Filter filter = new FieldValueFilter("with_matchall", true);
+ DocIdSet set = filter.getDocIdSet(filterReader.getContext(), null);
+ assertNull(set);
+
+ filter = new FieldValueFilter("with_matchno");
+ set = filter.getDocIdSet(filterReader.getContext(), null);
+ assertNull(set);
+
+ filter = new FieldValueFilter("with_bitset");
+ set = filter.getDocIdSet(filterReader.getContext(), null);
+ assertTrue(set instanceof BitDocIdSet);
+
+ reader.close();
+ directory.close();
+ }
+
private int[] buildIndex(RandomIndexWriter writer, int docs)
throws IOException {
int[] docStates = new int[docs];