MtasSpanStartQuery.java

  1. package mtas.search.spans;

  2. import java.io.IOException;
  3. import java.util.Map;
  4. import java.util.Set;

  5. import org.apache.lucene.index.IndexReader;
  6. import org.apache.lucene.index.LeafReaderContext;
  7. import org.apache.lucene.index.Term;
  8. import org.apache.lucene.index.TermContext;
  9. import org.apache.lucene.search.IndexSearcher;
  10. import org.apache.lucene.search.spans.SpanQuery;
  11. import org.apache.lucene.search.spans.SpanWeight;
  12. import mtas.search.spans.util.MtasSpanQuery;
  13. import mtas.search.spans.util.MtasSpanWeight;
  14. import mtas.search.spans.util.MtasSpans;

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

  19.   /** The clause. */
  20.   private MtasSpanQuery clause;

  21.   /**
  22.    * Instantiates a new mtas span start query.
  23.    *
  24.    * @param query the query
  25.    */
  26.   public MtasSpanStartQuery(MtasSpanQuery query) {
  27.     super(0, 0);
  28.     clause = query;
  29.   }

  30.   /*
  31.    * (non-Javadoc)
  32.    *
  33.    * @see
  34.    * org.apache.lucene.search.Query#rewrite(org.apache.lucene.index.IndexReader)
  35.    */
  36.   @Override
  37.   public MtasSpanQuery rewrite(IndexReader reader) throws IOException {
  38.     MtasSpanQuery newClause = clause.rewrite(reader);
  39.     if (!newClause.equals(clause)) {
  40.       return new MtasSpanStartQuery(newClause).rewrite(reader);
  41.     } else if (newClause.getMaximumWidth() != null
  42.         && newClause.getMaximumWidth() == 0) {
  43.       return newClause;
  44.     } else {
  45.       return super.rewrite(reader);
  46.     }
  47.   }

  48.   /*
  49.    * (non-Javadoc)
  50.    *
  51.    * @see
  52.    * org.apache.lucene.search.spans.SpanTermQuery#toString(java.lang.String)
  53.    */
  54.   @Override
  55.   public String toString(String field) {
  56.     StringBuilder buffer = new StringBuilder();
  57.     buffer.append(this.getClass().getSimpleName() + "([");
  58.     buffer.append(clause.toString(field));
  59.     buffer.append("])");
  60.     return buffer.toString();
  61.   }

  62.   /*
  63.    * (non-Javadoc)
  64.    *
  65.    * @see org.apache.lucene.search.spans.SpanQuery#getField()
  66.    */
  67.   @Override
  68.   public String getField() {
  69.     return clause.getField();
  70.   }

  71.   /*
  72.    * (non-Javadoc)
  73.    *
  74.    * @see
  75.    * org.apache.lucene.search.spans.SpanQuery#createWeight(org.apache.lucene.
  76.    * search.IndexSearcher, boolean)
  77.    */
  78.   @Override
  79.   public MtasSpanWeight createWeight(IndexSearcher searcher,
  80.       boolean needsScores, float boost) throws IOException {
  81.     SpanWeight spanWeight = ((SpanQuery) searcher.rewrite(clause))
  82.         .createWeight(searcher, needsScores, boost);
  83.     return new SpanTermWeight(spanWeight, searcher, boost);
  84.   }

  85.   /**
  86.    * The Class SpanTermWeight.
  87.    */
  88.   protected class SpanTermWeight extends MtasSpanWeight {

  89.     /** The span weight. */
  90.     SpanWeight spanWeight;

  91.     /**
  92.      * Instantiates a new span term weight.
  93.      *
  94.      * @param spanWeight the span weight
  95.      * @param searcher the searcher
  96.      * @throws IOException Signals that an I/O exception has occurred.
  97.      */
  98.     public SpanTermWeight(SpanWeight spanWeight, IndexSearcher searcher, float boost)
  99.         throws IOException {
  100.       super(MtasSpanStartQuery.this, searcher, null, boost);
  101.       this.spanWeight = spanWeight;
  102.     }

  103.     /*
  104.      * (non-Javadoc)
  105.      *
  106.      * @see
  107.      * org.apache.lucene.search.spans.SpanWeight#extractTermContexts(java.util.
  108.      * Map)
  109.      */
  110.     @Override
  111.     public void extractTermContexts(Map<Term, TermContext> contexts) {
  112.       spanWeight.extractTermContexts(contexts);
  113.     }

  114.     /*
  115.      * (non-Javadoc)
  116.      *
  117.      * @see
  118.      * org.apache.lucene.search.spans.SpanWeight#getSpans(org.apache.lucene.
  119.      * index.LeafReaderContext,
  120.      * org.apache.lucene.search.spans.SpanWeight.Postings)
  121.      */
  122.     @Override
  123.     public MtasSpans getSpans(LeafReaderContext ctx, Postings requiredPostings)
  124.         throws IOException {
  125.       return new MtasSpanStartSpans(MtasSpanStartQuery.this,
  126.           spanWeight.getSpans(ctx, requiredPostings));
  127.     }

  128.     /*
  129.      * (non-Javadoc)
  130.      *
  131.      * @see org.apache.lucene.search.Weight#extractTerms(java.util.Set)
  132.      */
  133.     @Override
  134.     public void extractTerms(Set<Term> terms) {
  135.       spanWeight.extractTerms(terms);
  136.     }
  137.    
  138. //    @Override
  139. //    public boolean isCacheable(LeafReaderContext arg0) {
  140. //      return spanWeight.isCacheable(arg0);
  141. //    }

  142.   }

  143.   /*
  144.    * (non-Javadoc)
  145.    *
  146.    * @see org.apache.lucene.search.Query#equals(java.lang.Object)
  147.    */
  148.   @Override
  149.   public boolean equals(Object obj) {
  150.     if (this == obj)
  151.       return true;
  152.     if (obj == null)
  153.       return false;
  154.     if (getClass() != obj.getClass())
  155.       return false;
  156.     final MtasSpanStartQuery that = (MtasSpanStartQuery) obj;
  157.     return clause.equals(that.clause);
  158.   }

  159.   /*
  160.    * (non-Javadoc)
  161.    *
  162.    * @see org.apache.lucene.search.Query#hashCode()
  163.    */
  164.   @Override
  165.   public int hashCode() {
  166.     int h = this.getClass().getSimpleName().hashCode();
  167.     h = (h * 7) ^ clause.hashCode();
  168.     return h;
  169.   }

  170.   /*
  171.    * (non-Javadoc)
  172.    *
  173.    * @see mtas.search.spans.util.MtasSpanQuery#disableTwoPhaseIterator()
  174.    */
  175.   @Override
  176.   public void disableTwoPhaseIterator() {
  177.     super.disableTwoPhaseIterator();
  178.     clause.disableTwoPhaseIterator();
  179.   }

  180.   @Override
  181.   public boolean isMatchAllPositionsQuery() {
  182.     return false;
  183.   }
  184.  
  185. }