View Javadoc

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       * Constructs a filter which DOES NOT match documents matching
21       * <p/>
22       * <code>query</code>.
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          {  // check cache
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);  // set bit for hit
52              }
53          });
54  
55          bits.flip(0, reader.maxDoc());    // invert
56  
57          synchronized (cache)
58          {  // update cache
59              cache.put(reader, bits);
60          }
61  
62          return bits;
63      }
64  
65      public String toString()
66      {
67          return "InvertedQueryFilter(" + query + ")";
68      }
69  }