Index: src/java/org/apache/lucene/search/CachingWrapperFilter.java
===================================================================
--- src/java/org/apache/lucene/search/CachingWrapperFilter.java	(revision 663485)
+++ src/java/org/apache/lucene/search/CachingWrapperFilter.java	(working copy)
@@ -26,6 +26,8 @@
 /**
  * Wraps another filter's result and caches it.  The purpose is to allow
  * filters to simply filter, and then wrap with this class to add caching.
+ * Subclasses may cache another DocIdSet than the one provided by the
+ * wrapped filter.
  */
 public class CachingWrapperFilter extends Filter {
   protected Filter filter;
@@ -79,7 +81,8 @@
       }
     }
 
-    final DocIdSet docIdSet = filter.getDocIdSet(reader);
+    final DocIdSet docIdSet = docIdSetToCache(filter.getDocIdSet(reader),
+                                              reader.maxDoc());
 
     synchronized (cache) {  // update cache
       cache.put(reader, docIdSet);
@@ -89,6 +92,14 @@
     
   }
 
+  /** Provide the DocIdSet to be cached, using the DocIdSet provided
+   * by the wrapped Filter.
+   * This implementation returns the given DocIdSet.
+   */
+  protected DocIdSet docIdSetToCache(DocIdSet docIdSet, int maxDoc) {
+    return docIdSet;
+  }
+
   public String toString() {
     return "CachingWrapperFilter("+filter+")";
   }
Index: contrib/miscellaneous/src/java/org/apache/lucene/misc/ChainedFilter.java
===================================================================
--- contrib/miscellaneous/src/java/org/apache/lucene/misc/ChainedFilter.java	(revision 663485)
+++ contrib/miscellaneous/src/java/org/apache/lucene/misc/ChainedFilter.java	(working copy)
@@ -62,7 +62,6 @@
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.util.OpenBitSet;
 import org.apache.lucene.util.OpenBitSetDISI;
-import org.apache.lucene.util.SortedVIntList;
 
 /**
  * <p>
@@ -178,14 +177,6 @@
         return result;
     }
     
-    /** Provide a SortedVIntList when it is definitely smaller than an OpenBitSet */
-    protected DocIdSet finalResult(OpenBitSetDISI result, int maxDocs) {
-        return (result.cardinality() < (maxDocs / 9))
-              ? (DocIdSet) new SortedVIntList(result)
-              : (DocIdSet) result;
-    }
-        
-
     /**
      * Delegates to each filter in the chain.
      * @param reader IndexReader
@@ -200,7 +191,7 @@
         {
             doChain(result, logic, chain[index[0]].getDocIdSet(reader));
         }
-        return finalResult(result, reader.maxDoc());
+        return result;
     }
 
     /**
@@ -220,7 +211,7 @@
         {
             doChain(result, logic[index[0]], chain[index[0]].getDocIdSet(reader));
         }
-        return finalResult(result, reader.maxDoc());
+        return result;
     }
 
     public String toString()
Index: contrib/queries/src/java/org/apache/lucene/search/BooleanFilter.java
===================================================================
--- contrib/queries/src/java/org/apache/lucene/search/BooleanFilter.java	(revision 663485)
+++ contrib/queries/src/java/org/apache/lucene/search/BooleanFilter.java	(working copy)
@@ -19,14 +19,11 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.BitSet;
 
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.search.BooleanClause.Occur;
-import org.apache.lucene.util.DocIdBitSet;
 import org.apache.lucene.util.OpenBitSet;
 import org.apache.lucene.util.OpenBitSetDISI;
-import org.apache.lucene.util.SortedVIntList;
 
 /**
  * A container Filter that allows Boolean composition of Filters.
@@ -109,7 +106,7 @@
     }
     
     if (res !=null)
-      return finalResult(res, reader.maxDoc());
+      return res;
 
     if (emptyDocIdSet == null)
       emptyDocIdSet = new OpenBitSetDISI(1);
@@ -117,13 +114,6 @@
     return emptyDocIdSet;
   }
 
-  /** Provide a SortedVIntList when it is definitely smaller than an OpenBitSet */
-  protected DocIdSet finalResult(OpenBitSetDISI result, int maxDocs) {
-    return (result.cardinality() < (maxDocs / 9))
-      ? (DocIdSet) new SortedVIntList(result)
-      : (DocIdSet) result;
-  }
-
   private static DocIdSet emptyDocIdSet = null;
 
   /**
