mirror of https://github.com/apache/lucene.git
- 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:
parent
2137fae116
commit
b831821324
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue