mirror of https://github.com/apache/lucene.git
LUCENE-1459: fix CachingWrapperFilter to do the right thing if the wrong type of bitset is in its cache
git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@719716 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
898cfe87cd
commit
129a630839
|
@ -18,6 +18,7 @@ package org.apache.lucene.search;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import org.apache.lucene.index.IndexReader;
|
import org.apache.lucene.index.IndexReader;
|
||||||
|
import org.apache.lucene.util.DocIdBitSet;
|
||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
import java.util.WeakHashMap;
|
import java.util.WeakHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -51,11 +52,17 @@ public class CachingWrapperFilter extends Filter {
|
||||||
cache = new WeakHashMap();
|
cache = new WeakHashMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Object cached = null;
|
||||||
synchronized (cache) { // check cache
|
synchronized (cache) { // check cache
|
||||||
BitSet cached = (BitSet) cache.get(reader);
|
cached = cache.get(reader);
|
||||||
if (cached != null) {
|
|
||||||
return cached;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cached != null) {
|
||||||
|
if (cached instanceof BitSet) {
|
||||||
|
return (BitSet) cached;
|
||||||
|
} else if (cached instanceof DocIdBitSet)
|
||||||
|
return ((DocIdBitSet) cached).getBitSet();
|
||||||
|
// It would be nice to handle the DocIdSet case, but that's not really possible
|
||||||
}
|
}
|
||||||
|
|
||||||
final BitSet bits = filter.bits(reader);
|
final BitSet bits = filter.bits(reader);
|
||||||
|
@ -72,11 +79,16 @@ public class CachingWrapperFilter extends Filter {
|
||||||
cache = new WeakHashMap();
|
cache = new WeakHashMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Object cached = null;
|
||||||
synchronized (cache) { // check cache
|
synchronized (cache) { // check cache
|
||||||
DocIdSet cached = (DocIdSet) cache.get(reader);
|
cached = cache.get(reader);
|
||||||
if (cached != null) {
|
|
||||||
return cached;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cached != null) {
|
||||||
|
if (cached instanceof DocIdSet)
|
||||||
|
return (DocIdSet) cached;
|
||||||
|
else
|
||||||
|
return new DocIdBitSet((BitSet) cached);
|
||||||
}
|
}
|
||||||
|
|
||||||
final DocIdSet docIdSet = filter.getDocIdSet(reader);
|
final DocIdSet docIdSet = filter.getDocIdSet(reader);
|
||||||
|
|
|
@ -39,6 +39,10 @@ public class TestCachingWrapperFilter extends LuceneTestCase {
|
||||||
cacher.getDocIdSet(reader);
|
cacher.getDocIdSet(reader);
|
||||||
assertTrue("first time", filter.wasCalled());
|
assertTrue("first time", filter.wasCalled());
|
||||||
|
|
||||||
|
// make sure no exception if cache is holding the wrong bitset
|
||||||
|
cacher.bits(reader);
|
||||||
|
cacher.getDocIdSet(reader);
|
||||||
|
|
||||||
// second time, nested filter should not be called
|
// second time, nested filter should not be called
|
||||||
filter.clear();
|
filter.clear();
|
||||||
cacher.getDocIdSet(reader);
|
cacher.getDocIdSet(reader);
|
||||||
|
|
Loading…
Reference in New Issue