blob: 72748260e314bcb728b12d72e6b3980824f29c99 [file] [log] [blame]
Nils Diewaldf399a672013-11-18 17:55:22 +00001package 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
9import java.io.IOException;
Nils Diewaldf399a672013-11-18 17:55:22 +000010import java.util.Map;
Nils Diewaldf399a672013-11-18 17:55:22 +000011
12import org.apache.lucene.index.AtomicReaderContext;
Nils Diewaldf399a672013-11-18 17:55:22 +000013import org.apache.lucene.index.Term;
14import org.apache.lucene.index.TermContext;
Nils Diewaldf399a672013-11-18 17:55:22 +000015import org.apache.lucene.search.spans.SpanQuery;
Nils Diewaldf399a672013-11-18 17:55:22 +000016import org.apache.lucene.search.spans.Spans;
Eliza Margaretha83b95372014-01-23 09:18:07 +000017import org.apache.lucene.util.Bits;
Eliza Margaretha609fcc62014-02-13 14:10:20 +000018import org.apache.lucene.util.ToStringUtils;
Nils Diewaldf399a672013-11-18 17:55:22 +000019
20import de.ids_mannheim.korap.query.spans.NextSpans;
21
Eliza Margarethaed3bb3b2014-01-14 10:53:56 +000022/** Matches spans which are directly next to each other.
Nils Diewaldad269342014-02-20 21:22:22 +000023 * this is identical to a phrase query with exactly two clauses.
Nils Diewaldf399a672013-11-18 17:55:22 +000024 */
Eliza Margarethaed3bb3b2014-01-14 10:53:56 +000025public class SpanNextQuery extends SimpleSpanQuery implements Cloneable {
Nils Diewaldf399a672013-11-18 17:55:22 +000026
Eliza Margaretha609fcc62014-02-13 14:10:20 +000027 // Constructor
Nils Diewald364eb642013-12-22 15:03:01 +000028 public SpanNextQuery(SpanQuery firstClause, SpanQuery secondClause) {
Eliza Margarethaed3bb3b2014-01-14 10:53:56 +000029 this(firstClause, secondClause, true);
Nils Diewaldf399a672013-11-18 17:55:22 +000030 };
31
32 // Constructor
Eliza Margarethaed3bb3b2014-01-14 10:53:56 +000033 public SpanNextQuery(SpanQuery firstClause, SpanQuery secondClause,
34 boolean collectPayloads) {
Eliza Margaretha609fcc62014-02-13 14:10:20 +000035 super(firstClause, secondClause, collectPayloads);
Nils Diewaldf399a672013-11-18 17:55:22 +000036 };
37
Eliza Margaretha656cb312014-08-14 12:42:26 +000038 public SpanNextQuery(SpanQuery firstClause, SpanQuery secondClause,
39 boolean isFirstNegated, boolean collectPayloads) {
40 super(firstClause, secondClause, collectPayloads);
41 }
42
43
Nils Diewaldf399a672013-11-18 17:55:22 +000044 @Override
Eliza Margarethaed3bb3b2014-01-14 10:53:56 +000045 public Spans getSpans (final AtomicReaderContext context, Bits acceptDocs,
46 Map<Term,TermContext> termContexts) throws IOException {
Eliza Margaretha72f20f02014-03-12 16:10:58 +000047 return (Spans) new NextSpans (this, context, acceptDocs, termContexts);
Nils Diewaldf399a672013-11-18 17:55:22 +000048 };
Nils Diewaldf399a672013-11-18 17:55:22 +000049
50 @Override
51 public SpanNextQuery clone() {
52 SpanNextQuery spanNextQuery = new SpanNextQuery(
53 (SpanQuery) firstClause.clone(),
54 (SpanQuery) secondClause.clone(),
Eliza Margarethae3910e92014-02-12 11:01:23 +000055 collectPayloads
Nils Diewaldf399a672013-11-18 17:55:22 +000056 );
57 spanNextQuery.setBoost(getBoost());
58 return spanNextQuery;
59 };
Eliza Margaretha609fcc62014-02-13 14:10:20 +000060
61 @Override
62 public String toString(String field) {
63 StringBuilder sb = new StringBuilder();
Eliza Margaretha656cb312014-08-14 12:42:26 +000064 sb.append("spanNext(");
Eliza Margaretha609fcc62014-02-13 14:10:20 +000065 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 Diewaldf399a672013-11-18 17:55:22 +000072
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 Margarethaed3bb3b2014-01-14 10:53:56 +000083 if (!firstClause.equals(spanNextQuery.firstClause)) return false;
Nils Diewaldf399a672013-11-18 17:55:22 +000084 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};