blob: fe9d3b39f755bb51be126779a848ad9520b7980e [file] [log] [blame]
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +00001package de.ids_mannheim.korap.query;
2
3import java.io.IOException;
margarethaf70addb2015-04-27 13:17:18 +02004import java.util.Arrays;
5import java.util.List;
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +00006import java.util.Map;
7
Akron700c1eb2015-09-25 16:57:30 +02008import org.apache.lucene.index.LeafReaderContext;
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +00009import org.apache.lucene.index.Term;
10import org.apache.lucene.index.TermContext;
11import org.apache.lucene.search.spans.SpanQuery;
12import org.apache.lucene.search.spans.Spans;
13import org.apache.lucene.util.Bits;
14import org.apache.lucene.util.ToStringUtils;
15
margarethaf09fdd42017-12-19 17:47:50 +010016import de.ids_mannheim.korap.constants.RelationDirection;
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +000017import de.ids_mannheim.korap.query.spans.RelationSpans;
18
Eliza Margaretha19cecc62014-12-19 17:10:06 +000019/**
Nils Diewaldbb33da22015-03-04 16:24:25 +000020 * SpanRelationQuery retrieves spans representing a relation between
Eliza Margarethadc98dc12016-11-16 14:33:42 +010021 * tokens, elements, or a-token-and-an-element. Relation are marked
22 * with prefix "<" or ">". The direction of the angle bracket
23 * represents the direction of the corresponding relation. By default,
24 * the relation is set ">".
Akron6759b042016-04-28 01:25:00 +020025 * <br/><br/>
Eliza Margaretha19cecc62014-12-19 17:10:06 +000026 *
27 * This class provides two types of query:
28 * <ol>
Nils Diewaldbb33da22015-03-04 16:24:25 +000029 * <li>querying any relations, for instance dependency relation
30 * "<:xip/syntax-dep_rel".
Eliza Margaretha19cecc62014-12-19 17:10:06 +000031 *
32 * <pre>SpanRelationQuery sq = new SpanRelationQuery(
Nils Diewaldbb33da22015-03-04 16:24:25 +000033 * new SpanTermQuery(
34 * new Term("tokens","<:xip/syntax-dep_rel")),
35 * true);
Eliza Margaretha19cecc62014-12-19 17:10:06 +000036 * </pre>
37 * </li>
Nils Diewaldbb33da22015-03-04 16:24:25 +000038 * <li>querying relations matching a certain type of sources/targets,
Eliza Margarethadc98dc12016-11-16 14:33:42 +010039 * that are the left or the right sides of the relations. This query
40 * is used within {@link SpanRelationPartQuery}, for instance, to
41 * retrieve all dependency relations "<:xip/syntax-dep_rel" whose
42 * sources (right side) are noun phrases.
Eliza Margaretha19cecc62014-12-19 17:10:06 +000043 * <pre>
44 * SpanRelationPartQuery rv =
Nils Diewaldbb33da22015-03-04 16:24:25 +000045 * new SpanRelationPartQuery(sq, new SpanElementQuery("tokens","np"),
46 * true,
47 * false, true);
Eliza Margaretha19cecc62014-12-19 17:10:06 +000048 * </pre>
49 * </li>
50 *
51 * </ol>
52 *
53 * @author margaretha
Eliza Margaretha6f989202016-10-14 21:48:29 +020054 */
margaretha50c76332015-03-19 10:10:39 +010055public class SpanRelationQuery extends SimpleSpanQuery {
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +000056
margarethaf09fdd42017-12-19 17:47:50 +010057 private RelationDirection direction;
margarethaf70addb2015-04-27 13:17:18 +020058 private byte tempSourceNum = 1;
59 private byte tempTargetNum = 2;
60 private byte sourceClass;
61 private byte targetClass;
Nils Diewaldbb33da22015-03-04 16:24:25 +000062
Akronbb5d1732015-06-22 01:22:40 +020063 private List<Byte> tempClassNumbers = Arrays.asList(tempSourceNum,
64 tempTargetNum);
65
66
Eliza Margaretha2b0a5642015-03-04 10:33:51 +000067 /**
68 * Constructs a SpanRelationQuery based on the given span query.
69 *
Nils Diewaldbb33da22015-03-04 16:24:25 +000070 * @param firstClause
71 * a SpanQuery.
Eliza Margaretha2b0a5642015-03-04 10:33:51 +000072 * @param collectPayloads
Nils Diewaldbb33da22015-03-04 16:24:25 +000073 * a boolean flag representing the value
74 * <code>true</code> if
75 * payloads are to be collected, otherwise
76 * <code>false</code>.
Eliza Margaretha2b0a5642015-03-04 10:33:51 +000077 */
margarethaf09fdd42017-12-19 17:47:50 +010078 public SpanRelationQuery (SpanQuery firstClause, boolean collectPayloads,
79 RelationDirection direction) {
Eliza Margaretha19cecc62014-12-19 17:10:06 +000080 super(firstClause, collectPayloads);
margarethaf09fdd42017-12-19 17:47:50 +010081 this.direction = direction;
82// SpanTermQuery st = (SpanTermQuery) firstClause;
83// String direction = st.getTerm().text().substring(0, 1);
84// if (direction.equals("<")) {
85// this.direction = 1;
86// }
Eliza Margaretha19cecc62014-12-19 17:10:06 +000087 }
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +000088
Akronbb5d1732015-06-22 01:22:40 +020089
margarethaf09fdd42017-12-19 17:47:50 +010090// public SpanRelationQuery (SpanQuery firstClause, List<Byte> classNumbers,
91// boolean collectPayloads) {
92// this(firstClause, collectPayloads);
93// this.tempClassNumbers = classNumbers;
94// this.tempSourceNum = classNumbers.get(0);
95// this.tempTargetNum = classNumbers.get(1);
96// }
Nils Diewaldbb33da22015-03-04 16:24:25 +000097
Akronbb5d1732015-06-22 01:22:40 +020098
Eliza Margaretha19cecc62014-12-19 17:10:06 +000099 @Override
Nils Diewaldbb33da22015-03-04 16:24:25 +0000100 public SimpleSpanQuery clone () {
Eliza Margaretha19cecc62014-12-19 17:10:06 +0000101 SimpleSpanQuery sq = new SpanRelationQuery(
margarethaf09fdd42017-12-19 17:47:50 +0100102 (SpanQuery) this.firstClause.clone(), this.collectPayloads,
103 this.direction);
Eliza Margaretha19cecc62014-12-19 17:10:06 +0000104 return sq;
105 }
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +0000106
Nils Diewaldbb33da22015-03-04 16:24:25 +0000107
Eliza Margaretha19cecc62014-12-19 17:10:06 +0000108 @Override
Akron700c1eb2015-09-25 16:57:30 +0200109 public Spans getSpans (LeafReaderContext context, Bits acceptDocs,
Eliza Margaretha19cecc62014-12-19 17:10:06 +0000110 Map<Term, TermContext> termContexts) throws IOException {
111 return new RelationSpans(this, context, acceptDocs, termContexts);
112 }
113
Nils Diewaldbb33da22015-03-04 16:24:25 +0000114
Eliza Margaretha19cecc62014-12-19 17:10:06 +0000115 @Override
Nils Diewaldbb33da22015-03-04 16:24:25 +0000116 public String toString (String field) {
Eliza Margaretha19cecc62014-12-19 17:10:06 +0000117 StringBuilder sb = new StringBuilder();
margarethaf70addb2015-04-27 13:17:18 +0200118 if (sourceClass > 0) {
119 sb.append("{");
120 sb.append(sourceClass);
121 sb.append(": source:");
122 }
123 if (targetClass > 0) {
124 sb.append("{");
125 sb.append(targetClass);
126 sb.append(": target:");
127 }
Eliza Margaretha19cecc62014-12-19 17:10:06 +0000128 sb.append("spanRelation(");
129 sb.append(firstClause.toString(field));
130 sb.append(")");
margarethaf70addb2015-04-27 13:17:18 +0200131 if (sourceClass > 0) {
132 sb.append("}");
133 }
134 if (targetClass > 0) {
135 sb.append("}");
136 }
Eliza Margaretha19cecc62014-12-19 17:10:06 +0000137 sb.append(ToStringUtils.boost(getBoost()));
138 return sb.toString();
139 }
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +0000140
Akronbb5d1732015-06-22 01:22:40 +0200141
margarethaf09fdd42017-12-19 17:47:50 +0100142 public RelationDirection getDirection () {
margarethaca8d6222015-04-15 13:46:41 +0200143 return direction;
144 }
145
Akronbb5d1732015-06-22 01:22:40 +0200146
margarethaf09fdd42017-12-19 17:47:50 +0100147 public void setDirection (RelationDirection direction) {
margarethaca8d6222015-04-15 13:46:41 +0200148 this.direction = direction;
149 }
150
Akronbb5d1732015-06-22 01:22:40 +0200151
152 public List<Byte> getTempClassNumbers () {
margarethaf70addb2015-04-27 13:17:18 +0200153 return tempClassNumbers;
154 }
155
Akronbb5d1732015-06-22 01:22:40 +0200156
157 public void setTempClassNumbers (List<Byte> classNumbers) {
margarethaf70addb2015-04-27 13:17:18 +0200158 this.tempClassNumbers = classNumbers;
159 }
160
Akronbb5d1732015-06-22 01:22:40 +0200161
162 public byte getTempSourceNum () {
margarethaf70addb2015-04-27 13:17:18 +0200163 return tempSourceNum;
164 }
165
Akronbb5d1732015-06-22 01:22:40 +0200166
167 public void setTempSourceNum (byte sourceNum) {
margarethaf70addb2015-04-27 13:17:18 +0200168 this.tempSourceNum = sourceNum;
169 }
170
Akronbb5d1732015-06-22 01:22:40 +0200171
172 public byte getTempTargetNum () {
margarethaf70addb2015-04-27 13:17:18 +0200173 return tempTargetNum;
174 }
175
Akronbb5d1732015-06-22 01:22:40 +0200176
177 public void setTempTargetNum (byte targetNum) {
margarethaf70addb2015-04-27 13:17:18 +0200178 this.tempTargetNum = targetNum;
179 }
180
Akronbb5d1732015-06-22 01:22:40 +0200181
182 public byte getSourceClass () {
margarethaf70addb2015-04-27 13:17:18 +0200183 return sourceClass;
184 }
185
Akronbb5d1732015-06-22 01:22:40 +0200186
187 public void setSourceClass (byte sourceClass)
margarethaf70addb2015-04-27 13:17:18 +0200188 throws IllegalArgumentException {
189 if (sourceClass < 1) {
190 throw new IllegalArgumentException(
191 "Class number must be bigger than 0.");
192 }
193
194 this.sourceClass = sourceClass;
195 }
196
Akronbb5d1732015-06-22 01:22:40 +0200197
198 public byte getTargetClass () {
margarethaf70addb2015-04-27 13:17:18 +0200199 return targetClass;
200 }
201
Akronbb5d1732015-06-22 01:22:40 +0200202
203 public void setTargetClass (byte targetClass)
margarethaf70addb2015-04-27 13:17:18 +0200204 throws IllegalArgumentException {
205 if (targetClass < 1) {
206 throw new IllegalArgumentException(
207 "Class number must be bigger than 0.");
208 }
209 this.targetClass = targetClass;
210 }
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +0000211}