blob: dc7c81d3966ec5f88e9cb46fc57f564d9b52b4cf [file] [log] [blame]
Eliza Margarethaed3bb3b2014-01-14 10:53:56 +00001package de.ids_mannheim.korap.query;
2
3import java.io.IOException;
4import java.util.Map;
5
Akron700c1eb2015-09-25 16:57:30 +02006import org.apache.lucene.index.LeafReaderContext;
Eliza Margarethaed3bb3b2014-01-14 10:53:56 +00007import org.apache.lucene.index.Term;
8import org.apache.lucene.index.TermContext;
9import org.apache.lucene.search.spans.SpanQuery;
10import org.apache.lucene.search.spans.Spans;
11import org.apache.lucene.util.Bits;
Eliza Margaretha609fcc62014-02-13 14:10:20 +000012import org.apache.lucene.util.ToStringUtils;
Eliza Margarethaed3bb3b2014-01-14 10:53:56 +000013
14import de.ids_mannheim.korap.query.spans.SegmentSpans;
15
Eliza Margaretha7612bde2015-01-14 10:28:42 +000016/**
Nils Diewaldbb33da22015-03-04 16:24:25 +000017 * SpanSegmentQuery matches two spans having exactly the same start
18 * and end
Eliza Margaretha7612bde2015-01-14 10:28:42 +000019 * positions, for instance:
20 *
21 * <pre>
Nils Diewaldbb33da22015-03-04 16:24:25 +000022 * sq = new SpanSegmentQuery(new SpanTermQuery(new
23 * Term(&quot;tokens&quot;, &quot;s:Hund&quot;)),
24 * new SpanTermQuery(new Term(&quot;tokens&quot;,
25 * &quot;tt/p:NN&quot;)));
Eliza Margaretha7612bde2015-01-14 10:28:42 +000026 * </pre>
Eliza Margarethaf0171c52015-01-14 17:38:16 +000027 *
Eliza Margaretha7612bde2015-01-14 10:28:42 +000028 * @author margaretha
Eliza Margaretha6f989202016-10-14 21:48:29 +020029 */
Eliza Margaretha7612bde2015-01-14 10:28:42 +000030public class SpanSegmentQuery extends SimpleSpanQuery {
31
Nils Diewaldbb33da22015-03-04 16:24:25 +000032 private boolean isRelation;
33
Eliza Margaretha2db5e232015-03-04 10:20:01 +000034
Eliza Margaretha7612bde2015-01-14 10:28:42 +000035 /**
Nils Diewaldbb33da22015-03-04 16:24:25 +000036 * Constructs a SpanSegmentQuery from the two given SpanQueries,
37 * by default
Eliza Margaretha7612bde2015-01-14 10:28:42 +000038 * payloads are to be collected.
39 *
Nils Diewaldbb33da22015-03-04 16:24:25 +000040 * @param firstClause
41 * a {@link SpanQuery}
42 * @param secondClause
43 * a {@link SpanQuery}
Eliza Margaretha7612bde2015-01-14 10:28:42 +000044 */
Nils Diewaldbb33da22015-03-04 16:24:25 +000045 public SpanSegmentQuery (SpanQuery firstClause, SpanQuery secondClause) {
Eliza Margaretha7612bde2015-01-14 10:28:42 +000046 this(firstClause, secondClause, true);
Eliza Margaretha609fcc62014-02-13 14:10:20 +000047 }
Eliza Margaretha7612bde2015-01-14 10:28:42 +000048
Akronbb5d1732015-06-22 01:22:40 +020049
Eliza Margaretha7612bde2015-01-14 10:28:42 +000050 /**
Eliza Margarethaf0171c52015-01-14 17:38:16 +000051 * Constructs a SpanSegmentQuery from the two given SpanQueries.
52 *
Nils Diewaldbb33da22015-03-04 16:24:25 +000053 * @param firstClause
54 * a {@link SpanQuery}
55 * @param secondClause
56 * a {@link SpanQuery}
57 * @param collectPayloads
58 * a boolean flag representing the value
59 * <code>true</code> if payloads are to be collected,
60 * otherwise
61 * <code>false</code>.
Eliza Margaretha7612bde2015-01-14 10:28:42 +000062 */
Nils Diewaldbb33da22015-03-04 16:24:25 +000063 public SpanSegmentQuery (SpanQuery firstClause, SpanQuery secondClause,
Akronbb5d1732015-06-22 01:22:40 +020064 boolean collectPayloads) {
Eliza Margaretha7612bde2015-01-14 10:28:42 +000065 super(firstClause, secondClause, collectPayloads);
margarethaf70addb2015-04-27 13:17:18 +020066 if (firstClause instanceof SpanRelationQuery) {
67 isRelation = true;
68 }
Eliza Margaretha2db5e232015-03-04 10:20:01 +000069 }
Nils Diewaldbb33da22015-03-04 16:24:25 +000070
71
Eliza Margaretha7612bde2015-01-14 10:28:42 +000072 @Override
Akron700c1eb2015-09-25 16:57:30 +020073 public Spans getSpans (LeafReaderContext context, Bits acceptDocs,
Eliza Margaretha7612bde2015-01-14 10:28:42 +000074 Map<Term, TermContext> termContexts) throws IOException {
Eliza Margaretha6f989202016-10-14 21:48:29 +020075 return (Spans) new SegmentSpans(this, context, acceptDocs,
76 termContexts);
Eliza Margaretha7612bde2015-01-14 10:28:42 +000077 }
78
Nils Diewaldbb33da22015-03-04 16:24:25 +000079
Eliza Margaretha7612bde2015-01-14 10:28:42 +000080 @Override
Nils Diewaldbb33da22015-03-04 16:24:25 +000081 public SpanSegmentQuery clone () {
Eliza Margaretha7612bde2015-01-14 10:28:42 +000082 SpanSegmentQuery spanSegmentQuery = new SpanSegmentQuery(
83 (SpanQuery) firstClause.clone(),
84 (SpanQuery) secondClause.clone(), collectPayloads);
85 spanSegmentQuery.setBoost(getBoost());
86 return spanSegmentQuery;
87 }
88
Nils Diewaldbb33da22015-03-04 16:24:25 +000089
Eliza Margaretha7612bde2015-01-14 10:28:42 +000090 @Override
Nils Diewaldbb33da22015-03-04 16:24:25 +000091 public String toString (String field) {
Eliza Margaretha7612bde2015-01-14 10:28:42 +000092 StringBuilder sb = new StringBuilder();
93 sb.append("spanSegment(");
94 sb.append(firstClause.toString(field));
95 sb.append(", ");
96 sb.append(secondClause.toString(field));
97 sb.append(")");
98 sb.append(ToStringUtils.boost(getBoost()));
99 return sb.toString();
100 }
101
Nils Diewaldbb33da22015-03-04 16:24:25 +0000102
Eliza Margarethaed3bb3b2014-01-14 10:53:56 +0000103 @Override
Nils Diewaldbb33da22015-03-04 16:24:25 +0000104 public boolean equals (Object o) {
Eliza Margaretha7612bde2015-01-14 10:28:42 +0000105 if (this == o)
106 return true;
107 if (!(o instanceof SpanSegmentQuery))
108 return false;
109
110 SpanSegmentQuery spanSegmentQuery = (SpanSegmentQuery) o;
111
112 if (collectPayloads != spanSegmentQuery.collectPayloads)
113 return false;
114 if (!firstClause.equals(spanSegmentQuery.firstClause))
115 return false;
116 if (!secondClause.equals(spanSegmentQuery.secondClause))
117 return false;
118
119 return getBoost() == spanSegmentQuery.getBoost();
Eliza Margarethadc98dc12016-11-16 14:33:42 +0100120 }
Eliza Margarethaed3bb3b2014-01-14 10:53:56 +0000121
Nils Diewaldbb33da22015-03-04 16:24:25 +0000122
Eliza Margarethaed3bb3b2014-01-14 10:53:56 +0000123 @Override
Nils Diewaldbb33da22015-03-04 16:24:25 +0000124 public int hashCode () {
Eliza Margaretha7612bde2015-01-14 10:28:42 +0000125 int result;
126 result = firstClause.hashCode() + secondClause.hashCode();
127 result ^= (31 * result) + (result >>> 3);
128 result += Float.floatToRawIntBits(getBoost());
129 return result;
Nils Diewaldbb33da22015-03-04 16:24:25 +0000130 }
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000131
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000132
Nils Diewaldbb33da22015-03-04 16:24:25 +0000133 public boolean isRelation () {
134 return isRelation;
135 }
136
137
138 public void setRelation (boolean isRelation) {
139 this.isRelation = isRelation;
Eliza Margarethadc98dc12016-11-16 14:33:42 +0100140 }
Eliza Margarethaed3bb3b2014-01-14 10:53:56 +0000141}