blob: 8de7faf1b7bfabb1ff7b615235fcf41654e4a774 [file] [log] [blame]
Nils Diewaldf399a672013-11-18 17:55:22 +00001package de.ids_mannheim.korap.query;
2
3import java.io.IOException;
Nils Diewaldf399a672013-11-18 17:55:22 +00004import java.util.Map;
5
Nils Diewaldf399a672013-11-18 17:55:22 +00006import org.apache.lucene.index.AtomicReaderContext;
Nils Diewaldf399a672013-11-18 17:55:22 +00007import org.apache.lucene.index.IndexReader;
margaretha50c76332015-03-19 10:10:39 +01008import org.apache.lucene.index.Term;
Nils Diewaldf399a672013-11-18 17:55:22 +00009import org.apache.lucene.index.TermContext;
margaretha50c76332015-03-19 10:10:39 +010010import org.apache.lucene.search.Query;
11import org.apache.lucene.search.spans.SpanQuery;
12import org.apache.lucene.search.spans.Spans;
Nils Diewaldf399a672013-11-18 17:55:22 +000013import org.apache.lucene.util.Bits;
14import org.apache.lucene.util.ToStringUtils;
15
16import de.ids_mannheim.korap.query.spans.ClassSpans;
17
Nils Diewaldf399a672013-11-18 17:55:22 +000018/**
19 * Marks spans with a special class payload.
20 */
margaretha50c76332015-03-19 10:10:39 +010021public class SpanClassQuery extends SimpleSpanQuery {
22 protected byte number = 1;
Nils Diewaldf399a672013-11-18 17:55:22 +000023
Nils Diewaldbb33da22015-03-04 16:24:25 +000024
Nils Diewald56dc2582014-11-04 21:33:46 +000025 public SpanClassQuery (SpanQuery operand) {
margaretha50c76332015-03-19 10:10:39 +010026 super(operand, false);
Nils Diewaldf399a672013-11-18 17:55:22 +000027 };
28
Nils Diewaldbb33da22015-03-04 16:24:25 +000029
margaretha50c76332015-03-19 10:10:39 +010030 public SpanClassQuery (SpanQuery operand, byte number) {
31 super(operand, false);
32 this.number = number;
Nils Diewaldf399a672013-11-18 17:55:22 +000033 };
34
Nils Diewaldbb33da22015-03-04 16:24:25 +000035
Nils Diewaldf399a672013-11-18 17:55:22 +000036 @Override
37 public String toString (String field) {
Nils Diewaldbb33da22015-03-04 16:24:25 +000038 StringBuffer buffer = new StringBuffer("{");
39 short classNr = (short) this.number;
40 buffer.append(classNr & 0xFF).append(": ");
margaretha50c76332015-03-19 10:10:39 +010041 buffer.append(this.firstClause.toString()).append('}');
Nils Diewaldbb33da22015-03-04 16:24:25 +000042 buffer.append(ToStringUtils.boost(getBoost()));
43 return buffer.toString();
Nils Diewaldf399a672013-11-18 17:55:22 +000044 };
45
Nils Diewaldbb33da22015-03-04 16:24:25 +000046
Nils Diewaldf399a672013-11-18 17:55:22 +000047 @Override
Nils Diewaldbb33da22015-03-04 16:24:25 +000048 public Spans getSpans (final AtomicReaderContext context, Bits acceptDocs,
49 Map<Term, TermContext> termContexts) throws IOException {
margaretha50c76332015-03-19 10:10:39 +010050 return (Spans) new ClassSpans(this.firstClause, context, acceptDocs,
Nils Diewaldbb33da22015-03-04 16:24:25 +000051 termContexts, number);
Nils Diewaldf399a672013-11-18 17:55:22 +000052 };
53
Nils Diewaldbb33da22015-03-04 16:24:25 +000054
Nils Diewaldf399a672013-11-18 17:55:22 +000055 @Override
56 public Query rewrite (IndexReader reader) throws IOException {
Nils Diewaldbb33da22015-03-04 16:24:25 +000057 SpanClassQuery clone = null;
margaretha50c76332015-03-19 10:10:39 +010058 SpanQuery query = (SpanQuery) this.firstClause.rewrite(reader);
Nils Diewaldf399a672013-11-18 17:55:22 +000059
margaretha50c76332015-03-19 10:10:39 +010060 if (query != this.firstClause) {
Nils Diewaldbb33da22015-03-04 16:24:25 +000061 if (clone == null)
62 clone = this.clone();
margaretha50c76332015-03-19 10:10:39 +010063 clone.firstClause = query;
Nils Diewaldbb33da22015-03-04 16:24:25 +000064 };
Nils Diewaldf399a672013-11-18 17:55:22 +000065
Nils Diewaldbb33da22015-03-04 16:24:25 +000066 if (clone != null)
67 return clone;
Nils Diewaldf399a672013-11-18 17:55:22 +000068
Nils Diewaldbb33da22015-03-04 16:24:25 +000069 return this;
Nils Diewaldf399a672013-11-18 17:55:22 +000070 };
71
Nils Diewaldbb33da22015-03-04 16:24:25 +000072
Nils Diewaldf399a672013-11-18 17:55:22 +000073 @Override
Nils Diewaldbb33da22015-03-04 16:24:25 +000074 public SpanClassQuery clone () {
75 SpanClassQuery spanClassQuery = new SpanClassQuery(
margaretha50c76332015-03-19 10:10:39 +010076 (SpanQuery) this.firstClause.clone(), this.number);
Nils Diewaldbb33da22015-03-04 16:24:25 +000077 spanClassQuery.setBoost(getBoost());
78 return spanClassQuery;
Nils Diewaldf399a672013-11-18 17:55:22 +000079 };
80
81
82 /** Returns true iff <code>o</code> is equal to this. */
83 @Override
Nils Diewaldc025a232014-02-28 19:01:14 +000084 public boolean equals (Object o) {
Nils Diewaldbb33da22015-03-04 16:24:25 +000085 if (this == o)
86 return true;
87 if (!(o instanceof SpanClassQuery))
88 return false;
Nils Diewaldf399a672013-11-18 17:55:22 +000089
Nils Diewaldbb33da22015-03-04 16:24:25 +000090 final SpanClassQuery spanClassQuery = (SpanClassQuery) o;
Nils Diewaldf399a672013-11-18 17:55:22 +000091
margaretha50c76332015-03-19 10:10:39 +010092 if (!this.firstClause.equals(spanClassQuery.firstClause))
Nils Diewaldbb33da22015-03-04 16:24:25 +000093 return false;
94
95 if (this.number != spanClassQuery.number)
96 return false;
97
98 return getBoost() == spanClassQuery.getBoost();
Nils Diewaldf399a672013-11-18 17:55:22 +000099 };
100
101
102 // I don't know what I am doing here
103 @Override
Nils Diewaldbb33da22015-03-04 16:24:25 +0000104 public int hashCode () {
105 int result = 1;
margaretha50c76332015-03-19 10:10:39 +0100106 result = firstClause.hashCode();
Nils Diewaldbb33da22015-03-04 16:24:25 +0000107 result += (int) number;
108 result ^= (result << 15) | (result >>> 18);
109 result += Float.floatToRawIntBits(getBoost());
110 return result;
margaretha50c76332015-03-19 10:10:39 +0100111 }
112
113
114 public byte getNumber () {
115 return number;
116 }
117
118
119 public void setNumber (byte number) {
120 this.number = number;
Nils Diewaldf399a672013-11-18 17:55:22 +0000121 };
122};