MtasSpanPrefixQuery.java

  1. package mtas.search.spans;

  2. import java.io.IOException;

  3. import mtas.analysis.token.MtasToken;
  4. import mtas.search.spans.util.MtasSpanQuery;

  5. import org.apache.lucene.index.IndexReader;
  6. import org.apache.lucene.index.Term;
  7. import org.apache.lucene.search.IndexSearcher;
  8. import org.apache.lucene.search.PrefixQuery;
  9. import org.apache.lucene.search.Query;
  10. import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
  11. import org.apache.lucene.search.spans.SpanOrQuery;
  12. import org.apache.lucene.search.spans.SpanQuery;
  13. import org.apache.lucene.search.spans.SpanTermQuery;
  14. import org.apache.lucene.search.spans.SpanWeight;

  15. /**
  16.  * The Class MtasSpanPrefixQuery.
  17.  */
  18. public class MtasSpanPrefixQuery extends MtasSpanQuery {

  19.   /** The prefix. */
  20.   private String prefix;

  21.   /** The value. */
  22.   private String value;

  23.   /** The single position. */
  24.   private boolean singlePosition;

  25.   /** The term. */
  26.   private Term term;

  27.   /** The query. */
  28.   private SpanMultiTermQueryWrapper<PrefixQuery> query;

  29.   /**
  30.    * Instantiates a new mtas span prefix query.
  31.    *
  32.    * @param term the term
  33.    */
  34.   public MtasSpanPrefixQuery(Term term) {
  35.     this(term, true);
  36.   }

  37.   /**
  38.    * Instantiates a new mtas span prefix query.
  39.    *
  40.    * @param term the term
  41.    * @param singlePosition the single position
  42.    */
  43.   public MtasSpanPrefixQuery(Term term, boolean singlePosition) {
  44.     super(singlePosition ? 1 : null, singlePosition ? 1 : null);
  45.     PrefixQuery pfq = new PrefixQuery(term);
  46.     query = new SpanMultiTermQueryWrapper<>(pfq);
  47.     this.term = term;
  48.     this.singlePosition = singlePosition;
  49.     int i = term.text().indexOf(MtasToken.DELIMITER);
  50.     if (i >= 0) {
  51.       prefix = term.text().substring(0, i);
  52.       value = term.text().substring((i + MtasToken.DELIMITER.length()));
  53.       value = (value.length() > 0) ? value : null;
  54.     } else {
  55.       prefix = term.text();
  56.       value = null;
  57.     }
  58.   }

  59.   /*
  60.    * (non-Javadoc)
  61.    *
  62.    * @see
  63.    * org.apache.lucene.search.Query#rewrite(org.apache.lucene.index.IndexReader)
  64.    */
  65.   @Override
  66.   public MtasSpanQuery rewrite(IndexReader reader) throws IOException {
  67.     Query q = query.rewrite(reader);
  68.     if (q instanceof SpanOrQuery) {
  69.       SpanQuery[] clauses = ((SpanOrQuery) q).getClauses();
  70.       MtasSpanQuery[] newClauses = new MtasSpanQuery[clauses.length];
  71.       for (int i = 0; i < clauses.length; i++) {
  72.         if (clauses[i] instanceof SpanTermQuery) {
  73.           newClauses[i] = new MtasSpanTermQuery((SpanTermQuery) clauses[i],
  74.               singlePosition).rewrite(reader);
  75.         } else {
  76.           throw new IOException("no SpanTermQuery after rewrite");
  77.         }
  78.       }
  79.       return new MtasSpanOrQuery(newClauses).rewrite(reader);
  80.     } else {
  81.       throw new IOException("no SpanOrQuery after rewrite");
  82.     }
  83.   }

  84.   /*
  85.    * (non-Javadoc)
  86.    *
  87.    * @see
  88.    * org.apache.lucene.search.spans.SpanTermQuery#toString(java.lang.String)
  89.    */
  90.   @Override
  91.   public String toString(String field) {
  92.     StringBuilder buffer = new StringBuilder();
  93.     buffer.append(this.getClass().getSimpleName() + "([");
  94.     if (value == null) {
  95.       buffer.append(this.query.getField() + ":" + prefix);
  96.     } else {
  97.       buffer.append(this.query.getField() + ":" + prefix + "=" + value);
  98.     }
  99.     buffer.append("," + singlePosition + "])");
  100.     return buffer.toString();
  101.   }

  102.   /*
  103.    * (non-Javadoc)
  104.    *
  105.    * @see org.apache.lucene.search.spans.SpanQuery#getField()
  106.    */
  107.   @Override
  108.   public String getField() {
  109.     return term.field();
  110.   }

  111.   /*
  112.    * (non-Javadoc)
  113.    *
  114.    * @see
  115.    * org.apache.lucene.search.spans.SpanQuery#createWeight(org.apache.lucene.
  116.    * search.IndexSearcher, boolean)
  117.    */
  118.   @Override
  119.   public SpanWeight createWeight(IndexSearcher searcher, boolean needsScores, float boost)
  120.       throws IOException {
  121.     return ((SpanQuery) searcher.rewrite(query)).createWeight(searcher,
  122.         needsScores, boost);
  123.   }

  124.   /*
  125.    * (non-Javadoc)
  126.    *
  127.    * @see org.apache.lucene.search.Query#equals(java.lang.Object)
  128.    */
  129.   @Override
  130.   public boolean equals(Object obj) {
  131.     if (this == obj)
  132.       return true;
  133.     if (obj == null)
  134.       return false;
  135.     if (getClass() != obj.getClass())
  136.       return false;
  137.     MtasSpanPrefixQuery other = (MtasSpanPrefixQuery) obj;
  138.     return other.term.equals(term) && (other.singlePosition == singlePosition);
  139.   }

  140.   /*
  141.    * (non-Javadoc)
  142.    *
  143.    * @see org.apache.lucene.search.Query#hashCode()
  144.    */
  145.   @Override
  146.   public int hashCode() {
  147.     int h = this.getClass().getSimpleName().hashCode();
  148.     h = (h * 7) ^ term.hashCode();
  149.     h += (singlePosition ? 1 : 0);
  150.     return h;
  151.   }
  152.  
  153.   @Override
  154.   public boolean isMatchAllPositionsQuery() {
  155.     return false;
  156.   }

  157. }