blob: 82792f25b0ba253cfe75f2853fa21f6b98528f1f [file] [log] [blame]
Eliza Margaretha9d1ebeb2014-08-12 11:42:58 +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 Margaretha9d1ebeb2014-08-12 11:42:58 +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;
12
13import de.ids_mannheim.korap.query.spans.SubSpans;
14
Eliza Margaretha7612bde2015-01-14 10:28:42 +000015/**
Nils Diewaldbb33da22015-03-04 16:24:25 +000016 * This query extracts a subspan from another span. The subspan starts
Eliza Margarethadc98dc12016-11-16 14:33:42 +010017 * from a startOffset until startOffset + length. A positive
18 * startOffset is counted from the start of the span, while a negative
19 * startOffset is calculated from the end of the span. <br />
Eliza Margaretha7612bde2015-01-14 10:28:42 +000020 * <br />
Nils Diewaldbb33da22015-03-04 16:24:25 +000021 * SpanSubspanQuery takes a SpanQuery as its input and creates
22 * subspans from the
Eliza Margaretha7612bde2015-01-14 10:28:42 +000023 * resulting spans of the SpanQuery. For instance:
Eliza Margaretha9d1ebeb2014-08-12 11:42:58 +000024 *
Eliza Margaretha7612bde2015-01-14 10:28:42 +000025 * <pre>
Nils Diewaldbb33da22015-03-04 16:24:25 +000026 * SpanElementQuery seq = new SpanElementQuery(new
27 * SpanElementQuery(&quot;tokens&quot;, &quot;s&quot;);
Eliza Margarethaafe98122015-01-23 17:37:57 +000028 * SpanSubspanQuery ssq = new SpanSubspanQuery(seq, 0, 2, true);
Eliza Margaretha7612bde2015-01-14 10:28:42 +000029 * </pre>
30 *
Nils Diewaldbb33da22015-03-04 16:24:25 +000031 * In this example, the SpanSubspanQuery creates subspans, that are
32 * the first
Akronf796b862016-04-29 18:51:25 +020033 * two tokens of all sentences.
Eliza Margaretha7612bde2015-01-14 10:28:42 +000034 *
35 * @author margaretha
Eliza Margaretha6f989202016-10-14 21:48:29 +020036 */
Eliza Margaretha7612bde2015-01-14 10:28:42 +000037public class SpanSubspanQuery extends SimpleSpanQuery {
Eliza Margaretha9d1ebeb2014-08-12 11:42:58 +000038
Eliza Margaretha7612bde2015-01-14 10:28:42 +000039 private int startOffset, length;
margaretha3865e522016-05-02 13:24:51 +020040 private int windowSize = 10;
Eliza Margaretha9d1ebeb2014-08-12 11:42:58 +000041
Nils Diewaldbb33da22015-03-04 16:24:25 +000042
Eliza Margaretha7612bde2015-01-14 10:28:42 +000043 /**
Nils Diewaldbb33da22015-03-04 16:24:25 +000044 * Creates a SpanSubspanQuery (subspan) from the given
45 * {@link SpanQuery} with the specified startOffset and length.
Eliza Margaretha7612bde2015-01-14 10:28:42 +000046 *
Nils Diewaldbb33da22015-03-04 16:24:25 +000047 * @param firstClause
48 * a SpanQuery
49 * @param startOffset
50 * the start offset of the subspan relative to the
51 * original span
52 * @param length
53 * the length of the subspan
54 * @param collectPayloads
55 * a boolean flag representing the value
56 * <code>true</code> if payloads are to be collected,
57 * otherwise
58 * <code>false</code>.
Eliza Margaretha7612bde2015-01-14 10:28:42 +000059 */
Eliza Margaretha6f989202016-10-14 21:48:29 +020060 public SpanSubspanQuery (SpanQuery firstClause, int startOffset, int length,
61 boolean collectPayloads) {
Eliza Margaretha7612bde2015-01-14 10:28:42 +000062 super(firstClause, collectPayloads);
63 this.startOffset = startOffset;
64 this.length = length;
65 }
Eliza Margaretha9d1ebeb2014-08-12 11:42:58 +000066
Nils Diewaldbb33da22015-03-04 16:24:25 +000067
Eliza Margaretha7612bde2015-01-14 10:28:42 +000068 @Override
Nils Diewaldbb33da22015-03-04 16:24:25 +000069 public SimpleSpanQuery clone () {
Eliza Margaretha7612bde2015-01-14 10:28:42 +000070 SpanSubspanQuery sq = new SpanSubspanQuery(this.getFirstClause(),
71 this.startOffset, this.length, this.collectPayloads);
72 sq.setBoost(this.getBoost());
73 return sq;
74 }
Eliza Margaretha9d1ebeb2014-08-12 11:42:58 +000075
Nils Diewaldbb33da22015-03-04 16:24:25 +000076
Eliza Margaretha7612bde2015-01-14 10:28:42 +000077 @Override
Akron700c1eb2015-09-25 16:57:30 +020078 public Spans getSpans (LeafReaderContext context, Bits acceptDocs,
Eliza Margaretha7612bde2015-01-14 10:28:42 +000079 Map<Term, TermContext> termContexts) throws IOException {
80 return new SubSpans(this, context, acceptDocs, termContexts);
81 }
Eliza Margaretha9d1ebeb2014-08-12 11:42:58 +000082
Nils Diewaldbb33da22015-03-04 16:24:25 +000083
Eliza Margaretha7612bde2015-01-14 10:28:42 +000084 @Override
Nils Diewaldbb33da22015-03-04 16:24:25 +000085 public String toString (String field) {
Eliza Margaretha7612bde2015-01-14 10:28:42 +000086 StringBuilder sb = new StringBuilder();
87 sb.append("subspan(");
88 sb.append(this.firstClause.toString());
Nils Diewaldbb33da22015-03-04 16:24:25 +000089 sb.append(", ");
Eliza Margaretha7612bde2015-01-14 10:28:42 +000090 sb.append(this.startOffset);
Nils Diewaldbb33da22015-03-04 16:24:25 +000091 sb.append(", ");
Eliza Margaretha7612bde2015-01-14 10:28:42 +000092 sb.append(this.length);
93 sb.append(")");
94 return sb.toString();
95 }
Eliza Margaretha9d1ebeb2014-08-12 11:42:58 +000096
Nils Diewaldbb33da22015-03-04 16:24:25 +000097
Eliza Margaretha7612bde2015-01-14 10:28:42 +000098 /**
99 * Returns the start offset.
100 *
101 * @return the start offset.
102 */
Nils Diewaldbb33da22015-03-04 16:24:25 +0000103 public int getStartOffset () {
Eliza Margaretha7612bde2015-01-14 10:28:42 +0000104 return startOffset;
105 }
Eliza Margaretha9d1ebeb2014-08-12 11:42:58 +0000106
Nils Diewaldbb33da22015-03-04 16:24:25 +0000107
Eliza Margaretha7612bde2015-01-14 10:28:42 +0000108 /**
109 * Sets the start offset.
110 *
Nils Diewaldbb33da22015-03-04 16:24:25 +0000111 * @param startOffset
112 * the start offset
Eliza Margaretha7612bde2015-01-14 10:28:42 +0000113 */
Nils Diewaldbb33da22015-03-04 16:24:25 +0000114 public void setStartOffset (int startOffset) {
Eliza Margaretha7612bde2015-01-14 10:28:42 +0000115 this.startOffset = startOffset;
116 }
117
Nils Diewaldbb33da22015-03-04 16:24:25 +0000118
Eliza Margaretha7612bde2015-01-14 10:28:42 +0000119 /**
120 * Returns the length of the subspan.
121 *
122 * @return the length of the subspan
123 */
Nils Diewaldbb33da22015-03-04 16:24:25 +0000124 public int getLength () {
Eliza Margaretha7612bde2015-01-14 10:28:42 +0000125 return length;
126 }
127
Nils Diewaldbb33da22015-03-04 16:24:25 +0000128
Eliza Margaretha7612bde2015-01-14 10:28:42 +0000129 /**
130 * Sets the length of the subspan.
131 *
Nils Diewaldbb33da22015-03-04 16:24:25 +0000132 * @param length
133 * the length of the subspan.
Eliza Margaretha7612bde2015-01-14 10:28:42 +0000134 */
Nils Diewaldbb33da22015-03-04 16:24:25 +0000135 public void setLength (int length) {
Eliza Margaretha7612bde2015-01-14 10:28:42 +0000136 this.length = length;
137 }
margaretha3865e522016-05-02 13:24:51 +0200138
139
Akronc12567c2016-06-03 00:40:52 +0200140 public int getWindowSize () {
margaretha3865e522016-05-02 13:24:51 +0200141 return windowSize;
142 }
143
Akronc12567c2016-06-03 00:40:52 +0200144
145 public void setWindowSize (int windowSize) {
margaretha3865e522016-05-02 13:24:51 +0200146 this.windowSize = windowSize;
147 }
Eliza Margaretha9d1ebeb2014-08-12 11:42:58 +0000148}