- LUCENE-857: Removed caching from QueryFilter and added QueryWrapperFilter that can be combined

with CachingWrapperFilter to provide caching.


git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@527291 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Otis Gospodnetic 2007-04-10 20:42:47 +00:00
parent 2137fae116
commit b831821324
4 changed files with 83 additions and 53 deletions

View File

@ -41,6 +41,11 @@ API Changes
MultiFieldQueryParser, in order to allow sub-classes to override them.
(Steven Parkes via Otis Gospodnetic)
7. LUCENE-857: Removed caching from QueryFilter and deprecated QueryFilter
in favour of QueryWrapperFilter or QueryWrapperFilter + CachingWrapperFilter
combination when caching is desired.
(Chris Hostetter, Otis Gospodnetic)
Bug fixes
1. LUCENE-804: Fixed build.xml to pack a fully compilable src dist. (Doron Cohen)

View File

@ -24,10 +24,8 @@ import java.util.Map;
import java.io.IOException;
/**
* Wraps another filter's result and caches it. The caching
* behavior is like {@link QueryFilter}. The purpose is to allow
* filters to simply filter, and then wrap with this class to add
* caching, keeping the two concerns decoupled yet composable.
* 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.
*/
public class CachingWrapperFilter extends Filter {
protected Filter filter;

View File

@ -17,72 +17,28 @@ package org.apache.lucene.search;
* limitations under the License.
*/
import java.io.IOException;
import java.util.WeakHashMap;
import java.util.BitSet;
import org.apache.lucene.index.IndexReader;
/** Constrains search results to only match those which also match a provided
* query. Results are cached, so that searches after the first on the same
* index using this filter are much faster.
*
* <p> This could be used, for example, with a {@link RangeQuery} on a suitably
* formatted date field to implement date filtering. One could re-use a single
* QueryFilter that matches, e.g., only documents modified within the last
* week. The QueryFilter and RangeQuery would only need to be reconstructed
* once per day.
*
* @version $Id$
* @deprecated use a CachingWrapperFilter with QueryWrapperFilter
*/
public class QueryFilter extends Filter {
private Query query;
private transient WeakHashMap cache = null;
public class QueryFilter extends QueryWrapperFilter {
/** Constructs a filter which only matches documents matching
* <code>query</code>.
*/
public QueryFilter(Query query) {
this.query = query;
}
public BitSet bits(IndexReader reader) throws IOException {
if (cache == null) {
cache = new WeakHashMap();
}
synchronized (cache) { // check cache
BitSet cached = (BitSet) cache.get(reader);
if (cached != null) {
return cached;
}
}
final BitSet bits = new BitSet(reader.maxDoc());
new IndexSearcher(reader).search(query, new HitCollector() {
public final void collect(int doc, float score) {
bits.set(doc); // set bit for hit
}
});
synchronized (cache) { // update cache
cache.put(reader, bits);
}
return bits;
}
public String toString() {
return "QueryFilter("+query+")";
super(query);
}
public boolean equals(Object o) {
if (!(o instanceof QueryFilter)) return false;
return this.query.equals(((QueryFilter)o).query);
return super.equals((QueryFilter)o);
}
public int hashCode() {
return query.hashCode() ^ 0x923F64B9;
return super.hashCode() ^ 0x923F64B9;
}
}

View File

@ -0,0 +1,71 @@
package org.apache.lucene.search;
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.io.IOException;
import java.util.BitSet;
import org.apache.lucene.index.IndexReader;
/**
* Constrains search results to only match those which also match a provided
* query.
*
* <p> This could be used, for example, with a {@link RangeQuery} on a suitably
* formatted date field to implement date filtering. One could re-use a single
* QueryFilter that matches, e.g., only documents modified within the last
* week. The QueryFilter and RangeQuery would only need to be reconstructed
* once per day.
*
* @version $Id:$
*/
public class QueryWrapperFilter extends Filter {
private Query query;
/** Constructs a filter which only matches documents matching
* <code>query</code>.
*/
public QueryWrapperFilter(Query query) {
this.query = query;
}
public BitSet bits(IndexReader reader) throws IOException {
final BitSet bits = new BitSet(reader.maxDoc());
new IndexSearcher(reader).search(query, new HitCollector() {
public final void collect(int doc, float score) {
bits.set(doc); // set bit for hit
}
});
return bits;
}
public String toString() {
return "QueryWrapperFilter(" + query + ")";
}
public boolean equals(Object o) {
if (!(o instanceof QueryWrapperFilter))
return false;
return this.query.equals(((QueryWrapperFilter)o).query);
}
public int hashCode() {
return query.hashCode() ^ 0x923F64B9;
}
}