Index: src/java/org/apache/lucene/search/CachingWrapperFilter.java
===================================================================
--- src/java/org/apache/lucene/search/CachingWrapperFilter.java	(revision 708633)
+++ 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;
@@ -44,26 +46,15 @@
   }
 
   /**
-   * @deprecated Use {@link #getDocIdSet(IndexReader)} instead.
+   * @deprecated Use {@link #getDocIdSet(IndexReader)} instead,
+   * especially when this implementation is too slow.
    */
   public BitSet bits(IndexReader reader) throws IOException {
-    if (cache == null) {
-      cache = new WeakHashMap();
+    DocIdSetIterator disi = getDocIdSet(reader).iterator();
+    BitSet bits = new BitSet();
+    while (disi.next()) {
+      bits.set(disi.doc());
     }
-
-    synchronized (cache) {  // check cache
-      BitSet cached = (BitSet) cache.get(reader);
-      if (cached != null) {
-        return cached;
-      }
-    }
-
-    final BitSet bits = filter.bits(reader);
-
-    synchronized (cache) {  // update cache
-      cache.put(reader, bits);
-    }
-
     return bits;
   }
   
@@ -79,7 +70,8 @@
       }
     }
 
-    final DocIdSet docIdSet = filter.getDocIdSet(reader);
+    final DocIdSet docIdSet = docIdSetToCache(filter.getDocIdSet(reader),
+                                              reader);
 
     synchronized (cache) {  // update cache
       cache.put(reader, docIdSet);
@@ -89,6 +81,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, IndexReader reader) {
+    return docIdSet;
+  }
+
   public String toString() {
     return "CachingWrapperFilter("+filter+")";
   }
