1 package com.atlassian.bonnie.search;
2
3
4 import org.apache.lucene.index.IndexReader;
5 import org.apache.lucene.search.Filter;
6 import org.apache.lucene.search.Query;
7 import org.apache.lucene.search.IndexSearcher;
8 import org.apache.lucene.search.HitCollector;
9
10 import java.io.IOException;
11 import java.util.BitSet;
12 import java.util.WeakHashMap;
13
14 public class InvertedQueryFilter extends Filter
15 {
16 private Query query;
17 private transient WeakHashMap cache = null;
18
19
20
21
22
23
24 public InvertedQueryFilter(Query query)
25 {
26 this.query = query;
27 }
28
29 public BitSet bits(IndexReader reader) throws IOException
30 {
31 if (cache == null)
32 {
33 cache = new WeakHashMap();
34 }
35
36 synchronized (cache)
37 {
38 BitSet cached = (BitSet) cache.get(reader);
39 if (cached != null)
40 {
41 return cached;
42 }
43 }
44
45 final BitSet bits = new BitSet(reader.maxDoc());
46
47 new IndexSearcher(reader).search(query, new HitCollector()
48 {
49 public final void collect(int doc, float score)
50 {
51 bits.set(doc);
52 }
53 });
54
55 bits.flip(0, reader.maxDoc());
56
57 synchronized (cache)
58 {
59 cache.put(reader, bits);
60 }
61
62 return bits;
63 }
64
65 public String toString()
66 {
67 return "InvertedQueryFilter(" + query + ")";
68 }
69 }