You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2011/11/25 03:12:29 UTC

svn commit: r1206040 - in /lucene/dev/branches/branch_3x: ./ lucene/ lucene/backwards/src/test/org/apache/lucene/search/ lucene/src/java/org/apache/lucene/search/ lucene/src/test/org/apache/lucene/search/

Author: uschindler
Date: Fri Nov 25 02:12:27 2011
New Revision: 1206040

URL: http://svn.apache.org/viewvc?rev=1206040&view=rev
Log:
Merged revision(s) 1206033 from lucene/dev/trunk:
LUCENE-3595: Fixed FieldCacheRangeFilter and FieldCacheTermsFilter to correctly respect deletions on reopened SegmentReaders. Factored out FieldCacheDocIdSet to be a top-level class

Added:
    lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldCacheDocIdSet.java
      - copied, changed from r1206033, lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/FieldCacheDocIdSet.java
Modified:
    lucene/dev/branches/branch_3x/   (props changed)
    lucene/dev/branches/branch_3x/lucene/   (props changed)
    lucene/dev/branches/branch_3x/lucene/CHANGES.txt
    lucene/dev/branches/branch_3x/lucene/backwards/src/test/org/apache/lucene/search/TestFieldCacheRangeFilter.java
    lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldCacheRangeFilter.java
    lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldCacheTermsFilter.java
    lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldValueFilter.java
    lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/search/TestFieldCacheRangeFilter.java

Modified: lucene/dev/branches/branch_3x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/CHANGES.txt?rev=1206040&r1=1206039&r2=1206040&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_3x/lucene/CHANGES.txt Fri Nov 25 02:12:27 2011
@@ -25,6 +25,12 @@ New Features
   have at least one or no value at all in a specific field. (Simon Willnauer,
   Uwe Schindler, Robert Muir)
   
+Bug fixes
+
+* LUCENE-3595: Fixed FieldCacheRangeFilter and FieldCacheTermsFilter
+  to correctly respect deletions on reopened SegmentReaders. Factored out
+  FieldCacheDocIdSet to be a top-level class.  (Uwe Schindler, Simon Willnauer)
+
 ======================= Lucene 3.5.0 =======================
 
 Changes in backwards compatibility policy

Modified: lucene/dev/branches/branch_3x/lucene/backwards/src/test/org/apache/lucene/search/TestFieldCacheRangeFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/backwards/src/test/org/apache/lucene/search/TestFieldCacheRangeFilter.java?rev=1206040&r1=1206039&r2=1206040&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/backwards/src/test/org/apache/lucene/search/TestFieldCacheRangeFilter.java (original)
+++ lucene/dev/branches/branch_3x/lucene/backwards/src/test/org/apache/lucene/search/TestFieldCacheRangeFilter.java Fri Nov 25 02:12:27 2011
@@ -535,7 +535,6 @@ public class TestFieldCacheRangeFilter e
     search.close();
   }
   
-  // test using a sparse index (with deleted docs). The DocIdSet should be not cacheable, as it uses TermDocs if the range contains 0
   @Test
   public void testSparseIndex() throws IOException {
     Directory dir = newDirectory();
@@ -561,23 +560,23 @@ public class TestFieldCacheRangeFilter e
     Query q = new TermQuery(new Term("body","body"));
 
     result = search.search(q,fcrf=FieldCacheRangeFilter.newByteRange("id",Byte.valueOf((byte) -20),Byte.valueOf((byte) 20),T,T), 100).scoreDocs;
-    assertFalse("DocIdSet must be not cacheable", fcrf.getDocIdSet(reader.getSequentialSubReaders()[0]).isCacheable());
+    //behaviour change: assertFalse("DocIdSet must be not cacheable", fcrf.getDocIdSet(reader.getSequentialSubReaders()[0]).isCacheable());
     assertEquals("find all", 40, result.length);
 
     result = search.search(q,fcrf=FieldCacheRangeFilter.newByteRange("id",Byte.valueOf((byte) 0),Byte.valueOf((byte) 20),T,T), 100).scoreDocs;
-    assertFalse("DocIdSet must be not cacheable", fcrf.getDocIdSet(reader.getSequentialSubReaders()[0]).isCacheable());
+    //behaviour change: assertFalse("DocIdSet must be not cacheable", fcrf.getDocIdSet(reader.getSequentialSubReaders()[0]).isCacheable());
     assertEquals("find all", 20, result.length);
 
     result = search.search(q,fcrf=FieldCacheRangeFilter.newByteRange("id",Byte.valueOf((byte) -20),Byte.valueOf((byte) 0),T,T), 100).scoreDocs;
-    assertFalse("DocIdSet must be not cacheable", fcrf.getDocIdSet(reader.getSequentialSubReaders()[0]).isCacheable());
+    //behaviour change: assertFalse("DocIdSet must be not cacheable", fcrf.getDocIdSet(reader.getSequentialSubReaders()[0]).isCacheable());
     assertEquals("find all", 20, result.length);
 
     result = search.search(q,fcrf=FieldCacheRangeFilter.newByteRange("id",Byte.valueOf((byte) 10),Byte.valueOf((byte) 20),T,T), 100).scoreDocs;
-    assertTrue("DocIdSet must be cacheable", fcrf.getDocIdSet(reader.getSequentialSubReaders()[0]).isCacheable());
+    //behaviour change: assertTrue("DocIdSet must be cacheable", fcrf.getDocIdSet(reader.getSequentialSubReaders()[0]).isCacheable());
     assertEquals("find all", 11, result.length);
 
     result = search.search(q,fcrf=FieldCacheRangeFilter.newByteRange("id",Byte.valueOf((byte) -20),Byte.valueOf((byte) -10),T,T), 100).scoreDocs;
-    assertTrue("DocIdSet must be cacheable", fcrf.getDocIdSet(reader.getSequentialSubReaders()[0]).isCacheable());
+    //behaviour change: assertTrue("DocIdSet must be cacheable", fcrf.getDocIdSet(reader.getSequentialSubReaders()[0]).isCacheable());
     assertEquals("find all", 11, result.length);
     search.close();
     reader.close();

Copied: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldCacheDocIdSet.java (from r1206033, lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/FieldCacheDocIdSet.java)
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldCacheDocIdSet.java?p2=lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldCacheDocIdSet.java&p1=lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/FieldCacheDocIdSet.java&r1=1206033&r2=1206040&rev=1206040&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/FieldCacheDocIdSet.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldCacheDocIdSet.java Fri Nov 25 02:12:27 2011
@@ -17,9 +17,8 @@ package org.apache.lucene.search;
  */
 
 import java.io.IOException;
-import org.apache.lucene.util.Bits;
-import org.apache.lucene.util.FixedBitSet;
-import org.apache.lucene.util.OpenBitSet;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.TermDocs;
 
 /**
  * Base class for DocIdSet to be used with FieldCache. The implementation
@@ -32,12 +31,10 @@ import org.apache.lucene.util.OpenBitSet
  */
 public abstract class FieldCacheDocIdSet extends DocIdSet {
 
-  protected final int maxDoc;
-  protected final Bits acceptDocs;
-
-  public FieldCacheDocIdSet(int maxDoc, Bits acceptDocs) {
-    this.maxDoc = maxDoc;
-    this.acceptDocs = acceptDocs;
+  protected final IndexReader reader;
+  
+  public FieldCacheDocIdSet(IndexReader reader) {
+    this.reader = reader;
   }
 
   /**
@@ -45,40 +42,17 @@ public abstract class FieldCacheDocIdSet
    */
   protected abstract boolean matchDoc(int doc);
 
-  /**
-   * this DocIdSet is always cacheable (does not go back
-   * to the reader for iteration)
-   */
+  /** this DocIdSet is cacheable, if it works solely with FieldCache and no TermDocs */
   @Override
   public final boolean isCacheable() {
-    return true;
-  }
-
-  @Override
-  public final Bits bits() {
-    return (acceptDocs == null) ? new Bits() {
-      public boolean get(int docid) {
-        return matchDoc(docid);
-      }
-
-      public int length() {
-        return maxDoc;
-      }
-    } : new Bits() {
-      public boolean get(int docid) {
-        return acceptDocs.get(docid) && matchDoc(docid);
-      }
-
-      public int length() {
-        return maxDoc;
-      }
-    };
+    return !reader.hasDeletions();
   }
 
   @Override
   public final DocIdSetIterator iterator() throws IOException {
-    if (acceptDocs == null) {
-      // Specialization optimization disregard acceptDocs
+    if (!reader.hasDeletions()) {
+      // Specialization optimization disregard deleted docs
+      final int maxDoc = reader.maxDoc();
       return new DocIdSetIterator() {
         private int doc = -1;
         
@@ -108,17 +82,9 @@ public abstract class FieldCacheDocIdSet
           return doc = NO_MORE_DOCS;
         }
       };
-    } else if (acceptDocs instanceof FixedBitSet || acceptDocs instanceof OpenBitSet) {
-      // special case for FixedBitSet / OpenBitSet: use the iterator and filter it
-      // (used e.g. when Filters are chained by FilteredQuery)
-      return new FilteredDocIdSetIterator(((DocIdSet) acceptDocs).iterator()) {
-        @Override
-        protected boolean match(int doc) {
-          return FieldCacheDocIdSet.this.matchDoc(doc);
-        }
-      };
     } else {
       // Stupid consultation of acceptDocs and matchDoc()
+      final TermDocs termDocs = reader.termDocs(null);
       return new DocIdSetIterator() {
         private int doc = -1;
         
@@ -128,24 +94,23 @@ public abstract class FieldCacheDocIdSet
         }
       
         @Override
-        public int nextDoc() {
+        public int nextDoc() throws IOException {
           do {
-            doc++;
-            if (doc >= maxDoc) {
+            if (!termDocs.next())
               return doc = NO_MORE_DOCS;
-            }
-          } while (!acceptDocs.get(doc) || !matchDoc(doc));
+          } while (!matchDoc(doc = termDocs.doc()));
           return doc;
         }
       
         @Override
-        public int advance(int target) {
-          for(doc=target; doc<maxDoc; doc++) {
-            if (acceptDocs.get(doc) && matchDoc(doc)) {
-              return doc;
-            }
+        public int advance(int target) throws IOException {
+          if (!termDocs.skipTo(target))
+            return doc = NO_MORE_DOCS;
+          while (!matchDoc(doc = termDocs.doc())) { 
+            if (!termDocs.next())
+              return doc = NO_MORE_DOCS;
           }
-          return doc = NO_MORE_DOCS;
+          return doc;
         }
       };
     }

Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldCacheRangeFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldCacheRangeFilter.java?rev=1206040&r1=1206039&r2=1206040&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldCacheRangeFilter.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldCacheRangeFilter.java Fri Nov 25 02:12:27 2011
@@ -19,7 +19,6 @@ package org.apache.lucene.search;
 import java.io.IOException;
 
 import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.TermDocs;
 import org.apache.lucene.util.NumericUtils;
 import org.apache.lucene.document.NumericField; // for javadocs
 
@@ -119,11 +118,9 @@ public abstract class FieldCacheRangeFil
         
         assert inclusiveLowerPoint > 0 && inclusiveUpperPoint > 0;
         
-        // for this DocIdSet, we never need to use TermDocs,
-        // because deleted docs have an order of 0 (null entry in StringIndex)
-        return new FieldCacheDocIdSet(reader, false) {
+        return new FieldCacheDocIdSet(reader) {
           @Override
-          final boolean matchDoc(int doc) {
+          protected final boolean matchDoc(int doc) {
             return fcsi.order[doc] >= inclusiveLowerPoint && fcsi.order[doc] <= inclusiveUpperPoint;
           }
         };
@@ -171,10 +168,9 @@ public abstract class FieldCacheRangeFil
           return DocIdSet.EMPTY_DOCIDSET;
         
         final byte[] values = FieldCache.DEFAULT.getBytes(reader, field, (FieldCache.ByteParser) parser);
-        // we only request the usage of termDocs, if the range contains 0
-        return new FieldCacheDocIdSet(reader, (inclusiveLowerPoint <= 0 && inclusiveUpperPoint >= 0)) {
+        return new FieldCacheDocIdSet(reader) {
           @Override
-          boolean matchDoc(int doc) {
+          protected boolean matchDoc(int doc) {
             return values[doc] >= inclusiveLowerPoint && values[doc] <= inclusiveUpperPoint;
           }
         };
@@ -222,10 +218,9 @@ public abstract class FieldCacheRangeFil
           return DocIdSet.EMPTY_DOCIDSET;
         
         final short[] values = FieldCache.DEFAULT.getShorts(reader, field, (FieldCache.ShortParser) parser);
-        // we only request the usage of termDocs, if the range contains 0
-        return new FieldCacheDocIdSet(reader, (inclusiveLowerPoint <= 0 && inclusiveUpperPoint >= 0)) {
+        return new FieldCacheDocIdSet(reader) {
           @Override
-          boolean matchDoc(int doc) {
+          protected boolean matchDoc(int doc) {
             return values[doc] >= inclusiveLowerPoint && values[doc] <= inclusiveUpperPoint;
           }
         };
@@ -273,10 +268,9 @@ public abstract class FieldCacheRangeFil
           return DocIdSet.EMPTY_DOCIDSET;
         
         final int[] values = FieldCache.DEFAULT.getInts(reader, field, (FieldCache.IntParser) parser);
-        // we only request the usage of termDocs, if the range contains 0
-        return new FieldCacheDocIdSet(reader, (inclusiveLowerPoint <= 0 && inclusiveUpperPoint >= 0)) {
+        return new FieldCacheDocIdSet(reader) {
           @Override
-          boolean matchDoc(int doc) {
+          protected boolean matchDoc(int doc) {
             return values[doc] >= inclusiveLowerPoint && values[doc] <= inclusiveUpperPoint;
           }
         };
@@ -324,10 +318,9 @@ public abstract class FieldCacheRangeFil
           return DocIdSet.EMPTY_DOCIDSET;
         
         final long[] values = FieldCache.DEFAULT.getLongs(reader, field, (FieldCache.LongParser) parser);
-        // we only request the usage of termDocs, if the range contains 0
-        return new FieldCacheDocIdSet(reader, (inclusiveLowerPoint <= 0L && inclusiveUpperPoint >= 0L)) {
+        return new FieldCacheDocIdSet(reader) {
           @Override
-          boolean matchDoc(int doc) {
+          protected boolean matchDoc(int doc) {
             return values[doc] >= inclusiveLowerPoint && values[doc] <= inclusiveUpperPoint;
           }
         };
@@ -379,10 +372,9 @@ public abstract class FieldCacheRangeFil
           return DocIdSet.EMPTY_DOCIDSET;
         
         final float[] values = FieldCache.DEFAULT.getFloats(reader, field, (FieldCache.FloatParser) parser);
-        // we only request the usage of termDocs, if the range contains 0
-        return new FieldCacheDocIdSet(reader, (inclusiveLowerPoint <= 0.0f && inclusiveUpperPoint >= 0.0f)) {
+        return new FieldCacheDocIdSet(reader) {
           @Override
-          boolean matchDoc(int doc) {
+          protected boolean matchDoc(int doc) {
             return values[doc] >= inclusiveLowerPoint && values[doc] <= inclusiveUpperPoint;
           }
         };
@@ -434,10 +426,9 @@ public abstract class FieldCacheRangeFil
           return DocIdSet.EMPTY_DOCIDSET;
         
         final double[] values = FieldCache.DEFAULT.getDoubles(reader, field, (FieldCache.DoubleParser) parser);
-        // we only request the usage of termDocs, if the range contains 0
-        return new FieldCacheDocIdSet(reader, (inclusiveLowerPoint <= 0.0 && inclusiveUpperPoint >= 0.0)) {
+        return new FieldCacheDocIdSet(reader) {
           @Override
-          boolean matchDoc(int doc) {
+          protected boolean matchDoc(int doc) {
             return values[doc] >= inclusiveLowerPoint && values[doc] <= inclusiveUpperPoint;
           }
         };
@@ -500,103 +491,5 @@ public abstract class FieldCacheRangeFil
   
   /** Returns the current numeric parser ({@code null} for {@code T} is {@code String}} */
   public FieldCache.Parser getParser() { return parser; }
-  
-  static abstract class FieldCacheDocIdSet extends DocIdSet {
-    private final IndexReader reader;
-    private boolean mayUseTermDocs;
-  
-    FieldCacheDocIdSet(IndexReader reader, boolean mayUseTermDocs) {
-      this.reader = reader;
-      this.mayUseTermDocs = mayUseTermDocs;
-    }
-  
-    /** this method checks, if a doc is a hit, should throw AIOBE, when position invalid */
-    abstract boolean matchDoc(int doc) throws ArrayIndexOutOfBoundsException;
-    
-    /** this DocIdSet is cacheable, if it works solely with FieldCache and no TermDocs */
-    @Override
-    public boolean isCacheable() {
-      return !(mayUseTermDocs && reader.hasDeletions());
-    }
-
-    @Override
-    public DocIdSetIterator iterator() throws IOException {
-      // Synchronization needed because deleted docs BitVector
-      // can change after call to hasDeletions until TermDocs creation.
-      // We only use an iterator with termDocs, when this was requested (e.g. range contains 0)
-      // and the index has deletions
-      final TermDocs termDocs;
-      synchronized(reader) {
-        termDocs = isCacheable() ? null : reader.termDocs(null);
-      }
-      if (termDocs != null) {
-        // a DocIdSetIterator using TermDocs to iterate valid docIds
-        return new DocIdSetIterator() {
-          private int doc = -1;
-          
-          @Override
-          public int docID() {
-            return doc;
-          }
-          
-          @Override
-          public int nextDoc() throws IOException {
-            do {
-              if (!termDocs.next())
-                return doc = NO_MORE_DOCS;
-            } while (!matchDoc(doc = termDocs.doc()));
-            return doc;
-          }
-          
-          @Override
-          public int advance(int target) throws IOException {
-            if (!termDocs.skipTo(target))
-              return doc = NO_MORE_DOCS;
-            while (!matchDoc(doc = termDocs.doc())) { 
-              if (!termDocs.next())
-                return doc = NO_MORE_DOCS;
-            }
-            return doc;
-          }
-        };
-      } else {
-        // a DocIdSetIterator generating docIds by incrementing a variable -
-        // this one can be used if there are no deletions are on the index
-        return new DocIdSetIterator() {
-          private int doc = -1;
-          
-          @Override
-          public int docID() {
-            return doc;
-          }
-          
-          @Override
-          public int nextDoc() {
-            try {
-              do {
-                doc++;
-              } while (!matchDoc(doc));
-              return doc;
-            } catch (ArrayIndexOutOfBoundsException e) {
-              return doc = NO_MORE_DOCS;
-            }
-          }
-          
-          @Override
-          public int advance(int target) {
-            try {
-              doc = target;
-              while (!matchDoc(doc)) { 
-                doc++;
-              }
-              return doc;
-            } catch (ArrayIndexOutOfBoundsException e) {
-              return doc = NO_MORE_DOCS;
-            }
-          }
-        };
-      }
-    }
-  }
 
 }

Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldCacheTermsFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldCacheTermsFilter.java?rev=1206040&r1=1206039&r2=1206040&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldCacheTermsFilter.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldCacheTermsFilter.java Fri Nov 25 02:12:27 2011
@@ -116,9 +116,9 @@ public class FieldCacheTermsFilter exten
         bits.set(termNumber);
       }
     }
-    return new FieldCacheRangeFilter.FieldCacheDocIdSet(reader, true) {
+    return new FieldCacheDocIdSet(reader) {
       @Override
-      boolean matchDoc(int doc) {
+      protected final boolean matchDoc(int doc) {
         return bits.get(fcsi.order[doc]);
       }
     };

Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldValueFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldValueFilter.java?rev=1206040&r1=1206039&r2=1206040&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldValueFilter.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldValueFilter.java Fri Nov 25 02:12:27 2011
@@ -19,7 +19,6 @@ package org.apache.lucene.search;
 import java.io.IOException;
 
 import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.search.FieldCacheRangeFilter.FieldCacheDocIdSet;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.Bits.MatchAllBits;
 import org.apache.lucene.util.Bits.MatchNoBits;
@@ -59,21 +58,16 @@ public class FieldValueFilter extends Fi
   }
 
   @Override
-  public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
+  public DocIdSet getDocIdSet(final IndexReader reader) throws IOException {
     final Bits docsWithField = FieldCache.DEFAULT.getDocsWithField(
         reader, field);
     if (negate) {
       if (docsWithField instanceof MatchAllBits) {
         return null;
       }
-      final int maxDoc = reader.maxDoc();
-      return new FieldCacheDocIdSet(reader, true) {
+      return new FieldCacheDocIdSet(reader) {
         @Override
-        final boolean matchDoc(int doc) {
-          if (doc >= maxDoc) {
-            // TODO: this makes no sense we should check this on the caller level
-            throw new ArrayIndexOutOfBoundsException("doc: "+doc + " maxDoc: " + maxDoc);
-          }
+        protected final boolean matchDoc(int doc) {
           return !docsWithField.get(doc);
         }
       };
@@ -84,20 +78,18 @@ public class FieldValueFilter extends Fi
       if (docsWithField instanceof DocIdSet) {
         // UweSays: this is always the case for our current impl - but who knows
         // :-)
-        /*
-         *  TODO this could deliver delete docs but FCDID seems broken too if
-         *  this filter is not used with another query
-         */
-        return (DocIdSet) docsWithField;
+        final DocIdSet dis = (DocIdSet) docsWithField;
+        return (reader.hasDeletions()) ?
+          new FilteredDocIdSet(dis) {
+            @Override
+            protected final boolean match(int doc) {
+              return !reader.isDeleted(doc);
+            }
+          } : dis;
       }
-      final int maxDoc = reader.maxDoc();
-      return new FieldCacheDocIdSet(reader, true) {
+      return new FieldCacheDocIdSet(reader) {
         @Override
-        final boolean matchDoc(int doc) {
-          if (doc >= maxDoc) {
-            // TODO: this makes no sense we should check this on the caller level
-            throw new ArrayIndexOutOfBoundsException("doc: "+doc + " maxDoc: " + maxDoc);
-          }
+        protected final boolean matchDoc(int doc) {
           return docsWithField.get(doc);
         }
       };
@@ -134,7 +126,7 @@ public class FieldValueFilter extends Fi
 
   @Override
   public String toString() {
-    return "NoFieldValueFilter [field=" + field + ", negate=" + negate + "]";
+    return "FieldValueFilter [field=" + field + ", negate=" + negate + "]";
   }
 
 }

Modified: lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/search/TestFieldCacheRangeFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/search/TestFieldCacheRangeFilter.java?rev=1206040&r1=1206039&r2=1206040&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/search/TestFieldCacheRangeFilter.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/search/TestFieldCacheRangeFilter.java Fri Nov 25 02:12:27 2011
@@ -535,7 +535,6 @@ public class TestFieldCacheRangeFilter e
     search.close();
   }
   
-  // test using a sparse index (with deleted docs). The DocIdSet should be not cacheable, as it uses TermDocs if the range contains 0
   @Test
   public void testSparseIndex() throws IOException {
     Directory dir = newDirectory();
@@ -573,11 +572,11 @@ public class TestFieldCacheRangeFilter e
     assertEquals("find all", 20, result.length);
 
     result = search.search(q,fcrf=FieldCacheRangeFilter.newByteRange("id",Byte.valueOf((byte) 10),Byte.valueOf((byte) 20),T,T), 100).scoreDocs;
-    assertTrue("DocIdSet must be cacheable", fcrf.getDocIdSet(reader.getSequentialSubReaders()[0]).isCacheable());
+    assertFalse("DocIdSet must be not cacheable", fcrf.getDocIdSet(reader.getSequentialSubReaders()[0]).isCacheable());
     assertEquals("find all", 11, result.length);
 
     result = search.search(q,fcrf=FieldCacheRangeFilter.newByteRange("id",Byte.valueOf((byte) -20),Byte.valueOf((byte) -10),T,T), 100).scoreDocs;
-    assertTrue("DocIdSet must be cacheable", fcrf.getDocIdSet(reader.getSequentialSubReaders()[0]).isCacheable());
+    assertFalse("DocIdSet must be not cacheable", fcrf.getDocIdSet(reader.getSequentialSubReaders()[0]).isCacheable());
     assertEquals("find all", 11, result.length);
     search.close();
     reader.close();