| Nils Diewald | f399a67 | 2013-11-18 17:55:22 +0000 | [diff] [blame] | 1 | package de.ids_mannheim.korap.query; |
| 2 | |
| 3 | // Based on SpanNearQuery |
| 4 | |
| 5 | /* |
| 6 | Todo: Make one Spanarray and switch between the results of A and B. |
| 7 | */ |
| 8 | |
| 9 | import java.io.IOException; |
| Nils Diewald | f399a67 | 2013-11-18 17:55:22 +0000 | [diff] [blame] | 10 | import java.util.Map; |
| Nils Diewald | f399a67 | 2013-11-18 17:55:22 +0000 | [diff] [blame] | 11 | |
| 12 | import org.apache.lucene.index.AtomicReaderContext; |
| Nils Diewald | f399a67 | 2013-11-18 17:55:22 +0000 | [diff] [blame] | 13 | import org.apache.lucene.index.Term; |
| 14 | import org.apache.lucene.index.TermContext; |
| Nils Diewald | f399a67 | 2013-11-18 17:55:22 +0000 | [diff] [blame] | 15 | import org.apache.lucene.search.spans.SpanQuery; |
| Nils Diewald | f399a67 | 2013-11-18 17:55:22 +0000 | [diff] [blame] | 16 | import org.apache.lucene.search.spans.Spans; |
| Eliza Margaretha | 83b9537 | 2014-01-23 09:18:07 +0000 | [diff] [blame] | 17 | import org.apache.lucene.util.Bits; |
| Eliza Margaretha | 609fcc6 | 2014-02-13 14:10:20 +0000 | [diff] [blame] | 18 | import org.apache.lucene.util.ToStringUtils; |
| Nils Diewald | f399a67 | 2013-11-18 17:55:22 +0000 | [diff] [blame] | 19 | |
| 20 | import de.ids_mannheim.korap.query.spans.NextSpans; |
| 21 | |
| Eliza Margaretha | ed3bb3b | 2014-01-14 10:53:56 +0000 | [diff] [blame] | 22 | /** Matches spans which are directly next to each other. |
| Nils Diewald | ad26934 | 2014-02-20 21:22:22 +0000 | [diff] [blame] | 23 | * this is identical to a phrase query with exactly two clauses. |
| Nils Diewald | f399a67 | 2013-11-18 17:55:22 +0000 | [diff] [blame] | 24 | */ |
| Eliza Margaretha | ed3bb3b | 2014-01-14 10:53:56 +0000 | [diff] [blame] | 25 | public class SpanNextQuery extends SimpleSpanQuery implements Cloneable { |
| Nils Diewald | f399a67 | 2013-11-18 17:55:22 +0000 | [diff] [blame] | 26 | |
| Eliza Margaretha | 609fcc6 | 2014-02-13 14:10:20 +0000 | [diff] [blame] | 27 | // Constructor |
| Nils Diewald | 364eb64 | 2013-12-22 15:03:01 +0000 | [diff] [blame] | 28 | public SpanNextQuery(SpanQuery firstClause, SpanQuery secondClause) { |
| Eliza Margaretha | ed3bb3b | 2014-01-14 10:53:56 +0000 | [diff] [blame] | 29 | this(firstClause, secondClause, true); |
| Nils Diewald | f399a67 | 2013-11-18 17:55:22 +0000 | [diff] [blame] | 30 | }; |
| 31 | |
| 32 | // Constructor |
| Eliza Margaretha | ed3bb3b | 2014-01-14 10:53:56 +0000 | [diff] [blame] | 33 | public SpanNextQuery(SpanQuery firstClause, SpanQuery secondClause, |
| 34 | boolean collectPayloads) { |
| Eliza Margaretha | 609fcc6 | 2014-02-13 14:10:20 +0000 | [diff] [blame] | 35 | super(firstClause, secondClause, collectPayloads); |
| Nils Diewald | f399a67 | 2013-11-18 17:55:22 +0000 | [diff] [blame] | 36 | }; |
| 37 | |
| Eliza Margaretha | 656cb31 | 2014-08-14 12:42:26 +0000 | [diff] [blame] | 38 | public SpanNextQuery(SpanQuery firstClause, SpanQuery secondClause, |
| 39 | boolean isFirstNegated, boolean collectPayloads) { |
| 40 | super(firstClause, secondClause, collectPayloads); |
| 41 | } |
| 42 | |
| 43 | |
| Nils Diewald | f399a67 | 2013-11-18 17:55:22 +0000 | [diff] [blame] | 44 | @Override |
| Eliza Margaretha | ed3bb3b | 2014-01-14 10:53:56 +0000 | [diff] [blame] | 45 | public Spans getSpans (final AtomicReaderContext context, Bits acceptDocs, |
| 46 | Map<Term,TermContext> termContexts) throws IOException { |
| Eliza Margaretha | 72f20f0 | 2014-03-12 16:10:58 +0000 | [diff] [blame] | 47 | return (Spans) new NextSpans (this, context, acceptDocs, termContexts); |
| Nils Diewald | f399a67 | 2013-11-18 17:55:22 +0000 | [diff] [blame] | 48 | }; |
| Nils Diewald | f399a67 | 2013-11-18 17:55:22 +0000 | [diff] [blame] | 49 | |
| 50 | @Override |
| 51 | public SpanNextQuery clone() { |
| 52 | SpanNextQuery spanNextQuery = new SpanNextQuery( |
| 53 | (SpanQuery) firstClause.clone(), |
| 54 | (SpanQuery) secondClause.clone(), |
| Eliza Margaretha | e3910e9 | 2014-02-12 11:01:23 +0000 | [diff] [blame] | 55 | collectPayloads |
| Nils Diewald | f399a67 | 2013-11-18 17:55:22 +0000 | [diff] [blame] | 56 | ); |
| 57 | spanNextQuery.setBoost(getBoost()); |
| 58 | return spanNextQuery; |
| 59 | }; |
| Eliza Margaretha | 609fcc6 | 2014-02-13 14:10:20 +0000 | [diff] [blame] | 60 | |
| 61 | @Override |
| 62 | public String toString(String field) { |
| 63 | StringBuilder sb = new StringBuilder(); |
| Eliza Margaretha | 656cb31 | 2014-08-14 12:42:26 +0000 | [diff] [blame] | 64 | sb.append("spanNext("); |
| Eliza Margaretha | 609fcc6 | 2014-02-13 14:10:20 +0000 | [diff] [blame] | 65 | sb.append(firstClause.toString(field)); |
| 66 | sb.append(", "); |
| 67 | sb.append(secondClause.toString(field)); |
| 68 | sb.append(")"); |
| 69 | sb.append(ToStringUtils.boost(getBoost())); |
| 70 | return sb.toString(); |
| 71 | } |
| Nils Diewald | f399a67 | 2013-11-18 17:55:22 +0000 | [diff] [blame] | 72 | |
| 73 | |
| 74 | /** Returns true iff <code>o</code> is equal to this. */ |
| 75 | @Override |
| 76 | public boolean equals(Object o) { |
| 77 | if (this == o) return true; |
| 78 | if (!(o instanceof SpanNextQuery)) return false; |
| 79 | |
| 80 | final SpanNextQuery spanNextQuery = (SpanNextQuery) o; |
| 81 | |
| 82 | if (collectPayloads != spanNextQuery.collectPayloads) return false; |
| Eliza Margaretha | ed3bb3b | 2014-01-14 10:53:56 +0000 | [diff] [blame] | 83 | if (!firstClause.equals(spanNextQuery.firstClause)) return false; |
| Nils Diewald | f399a67 | 2013-11-18 17:55:22 +0000 | [diff] [blame] | 84 | if (!secondClause.equals(spanNextQuery.secondClause)) return false; |
| 85 | |
| 86 | return getBoost() == spanNextQuery.getBoost(); |
| 87 | }; |
| 88 | |
| 89 | |
| 90 | // I don't know what I am doing here |
| 91 | @Override |
| 92 | public int hashCode() { |
| 93 | int result; |
| 94 | result = firstClause.hashCode() + secondClause.hashCode(); |
| 95 | result ^= (result << 31) | (result >>> 2); // reversible |
| 96 | result += Float.floatToRawIntBits(getBoost()); |
| 97 | return result; |
| 98 | }; |
| 99 | }; |