blob: e232499cebf3c9cf83bbb1a43b1f5f709b2ab5dd [file] [log] [blame]
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +00001package de.ids_mannheim.korap.index;
2
Eliza Margaretha51fd5c22014-10-14 13:12:33 +00003import static org.junit.Assert.assertEquals;
4
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +00005import java.io.IOException;
6
7import org.apache.lucene.index.Term;
margarethaf09fdd42017-12-19 17:47:50 +01008import org.apache.lucene.sandbox.queries.regex.RegexQuery;
9import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
Eliza Margaretha2db5e232015-03-04 10:20:01 +000010import org.apache.lucene.search.spans.SpanQuery;
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +000011import org.apache.lucene.search.spans.SpanTermQuery;
12import org.junit.Test;
13
Nils Diewalda14ecd62015-02-26 21:00:20 +000014import de.ids_mannheim.korap.KrillIndex;
margarethaf09fdd42017-12-19 17:47:50 +010015import de.ids_mannheim.korap.constants.RelationDirection;
Eliza Margaretha98c200e2014-10-15 13:59:58 +000016import de.ids_mannheim.korap.query.SpanAttributeQuery;
margarethaf70addb2015-04-27 13:17:18 +020017import de.ids_mannheim.korap.query.SpanClassQuery;
Eliza Margaretha3e50bc42014-10-22 15:29:15 +000018import de.ids_mannheim.korap.query.SpanElementQuery;
Eliza Margaretha2db5e232015-03-04 10:20:01 +000019import de.ids_mannheim.korap.query.SpanFocusQuery;
margarethaf70addb2015-04-27 13:17:18 +020020import de.ids_mannheim.korap.query.SpanRelationMatchQuery;
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +000021import de.ids_mannheim.korap.query.SpanRelationQuery;
margaretha32d2bee2016-04-22 16:06:53 +020022import de.ids_mannheim.korap.query.SpanSegmentQuery;
Eliza Margarethad12cabb2014-10-27 17:45:34 +000023import de.ids_mannheim.korap.query.SpanTermWithIdQuery;
Eliza Margaretha98c200e2014-10-15 13:59:58 +000024import de.ids_mannheim.korap.query.SpanWithAttributeQuery;
Eliza Margaretha2db5e232015-03-04 10:20:01 +000025import de.ids_mannheim.korap.response.Result;
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +000026
Nils Diewaldbb33da22015-03-04 16:24:25 +000027/*
margaretha362c18b2018-01-17 17:30:56 +010028 *
29 * within(x,y)
30 *
31 * SpanRelationQuery->
32 * rel("SUBJ", query1, query2)
33 *
34 * 1. return all words that are subjects of (that are linked by the
35 * “SUBJ” relation to) the string “beginnt”
36 * xip/syntax-dep_rel:beginnt >[func=”SUBJ”] xip/syntax-dep_rel:.*
37 * -> rel("SUBJ", highlight(query1), new TermQuery("s:beginnt"))
38 *
39 *
40 * SUBJ ist modelliert mit offset für den gesamten Bereich
41 *
42 * https://de.wikipedia.org/wiki/Dependenzgrammatik
43 *
44 * im regiert Wasser
45 * dass die Kinder im Wasser gespielt haben
46 * 3. im#16-18$
47 * 3. >:COORD#16-25$3,4
48 * 4. Wasser#19-25$
49 * 4. <:COORD#16-25$3,4
50 *
51 * # okay: return all main verbs that have no “SUBJ” relation
52 * specified
53 *
54 *
55 * # Not okay: 5. return all verbs with (at least?) 3 outgoing
56 * relations [think of ditransitives such as give]
57 *
58 * xip/morph_pos:VERB & xip/token:.* & xip/token:.* & xip/token:.* &
59 * xip/token:.* & #1 _=_#2 & #2 >[func=$x] #3 & #2 >[func=$x]#4 & #2
60 * >[func=$x] #5
61 *
62 * # Okay: return all verbs that have singular SUBJects and dative
63 * OBJects
64 *
65 * xip/morph_pos:VERB & mpt/morph_msd:Sg & mpt/morph_msd:Dat & #1
66 * >[func=”SUBJ”] #2 & #1 >[func=”OBJ”] #3
67 *
68 * -> [p:VVFIN](>SUBJ[nr:sg] & >OBJ[c:dat])
69 *
70 *
Nils Diewaldbb33da22015-03-04 16:24:25 +000071 */
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +000072
73public class TestRelationIndex {
Nils Diewaldbb33da22015-03-04 16:24:25 +000074 private KrillIndex ki;
75 private Result kr;
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +000076
Nils Diewaldbb33da22015-03-04 16:24:25 +000077
78 public TestRelationIndex () throws IOException {
79 ki = new KrillIndex();
80 }
81
82
Akronc12567c2016-06-03 00:40:52 +020083 public static FieldDocument createFieldDoc0 () {
Nils Diewaldbb33da22015-03-04 16:24:25 +000084 FieldDocument fd = new FieldDocument();
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +000085 fd.addString("ID", "doc-0");
Eliza Margaretha6f989202016-10-14 21:48:29 +020086 fd.addTV("base", "ceccecdeed", "[(0-1)s:c$<s>1|_0$<i>0<i>1"
87 + "|>:xip/syntax-dep_rel$<b>32<i>6<s>1<s>1<s>0]"
88 + "[(1-2)s:e$<s>1|_1$<i>1<i>2|"
89 + "<:xip/syntax-dep_rel$<b>32<i>9<s>1<s>1<s>0|"
90 + ">:xip/syntax-dep_rel$<b>32<i>4<s>1<s>1<s>0]"
91 + "[(2-3)s:c|_2$<i>2<i>3]"
92 + "[(3-4)s:c$<s>1|s:b$<s>2|_3$<i>3<i>4|<:xip/syntax-dep_rel$<b>32<i>9<s>1<s>1<s>0]"
93 + "[(4-5)s:e$<s>1|s:d$<s>2|_4$<i>4<i>5|<:xip/syntax-dep_rel$<b>32<i>1<s>1<s>1<s>0]"
94 + "[(5-6)s:c|_5$<i>5<i>6]"
95 + "[(6-7)s:d$<s>1|_6$<i>6<i>7|<:xip/syntax-dep_rel$<b>32<i>1<s>1<s>1<s>0]"
96 + "[(7-8)s:e|_7$<i>7<i>8]" + "[(8-9)s:e|s:b|_8$<i>8<i>9]"
97 + "[(9-10)s:d$<s>1|_9$<i>9<i>10|"
98 + ">:xip/syntax-dep_rel$<b>32<i>1<s>1<s>1<s>0|"
99 + ">:xip/syntax-dep_rel$<b>32<i>3<s>1<s>1<s>0]");
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +0000100 return fd;
101 }
Nils Diewaldbb33da22015-03-04 16:24:25 +0000102
103
Akronc12567c2016-06-03 00:40:52 +0200104 public static FieldDocument createFieldDoc1 () {
Nils Diewaldbb33da22015-03-04 16:24:25 +0000105 FieldDocument fd = new FieldDocument();
Eliza Margaretha51fd5c22014-10-14 13:12:33 +0000106 fd.addString("ID", "doc-1");
Eliza Margaretha6f989202016-10-14 21:48:29 +0200107 fd.addTV("base", "ceccecdeed",
margaretha7ee65952015-12-14 15:39:12 +0100108 "[(0-1)s:c$<s>2|<>:p$<b>64<i>0<i>3<i>3<b>0<s>1|_0$<i>0<i>1|"
margaretha29a39112016-04-04 12:10:11 +0200109 + ">:xip/syntax-dep_rel$<b>35<i>0<i>1<i>1<i>2<i>3<i>6<i>9<s>1<s>1<s>2|"
110 + ">:xip/syntax-dep_rel$<b>33<i>1<i>2<i>6<i>9<s>2<s>1<s>0|"
margaretha7ee65952015-12-14 15:39:12 +0100111 + "@:func=subj$<b>18<s>2]"
112 + "[(1-2)s:e|_1$<i>1<i>2|<>:p$<b>64<i>1<i>3<i>3<b>0<s>1]"
113 + "[(2-3)s:c|_2$<i>2<i>3]"
114 + "[(3-4)s:c|s:b|_3$<i>3<i>4]"
115 + "[(4-5)s:e|s:d|_4$<i>4<i>5]"
116 + "[(5-6)s:c|_5$<i>5<i>6]"
Akron42993552016-02-04 13:24:24 +0100117 + "[(6-7)s:d$<s>2|<>:p$<b>64<i>6<i>9<i>9<b>0<s>1|_6$<i>6<i>7|"
margaretha29a39112016-04-04 12:10:11 +0200118 + ">:xip/syntax-dep_rel$<b>34<i>3<i>4<i>9<i>9<s>1<s>1<s>0|"
119 + "<:xip/syntax-dep_rel$<b>35<i>3<i>4<i>4<i>5<i>9<i>1<i>3<s>1<s>1<s>2|"
120 + "<:xip/syntax-dep_rel$<b>34<i>5<i>6<i>9<i>1<s>1<s>2<s>0|"
Eliza Margaretha6f989202016-10-14 21:48:29 +0200121 + "@:func=obj$<b>18<s>2]" + "[(7-8)s:e|_7$<i>7<i>8]"
margaretha7ee65952015-12-14 15:39:12 +0100122 + "[(8-9)s:e|s:b|_8$<i>8<i>9]"
Akron42993552016-02-04 13:24:24 +0100123 + "[(9-10)s:d$<s>1|_9$<i>9<i>10|<"
margaretha29a39112016-04-04 12:10:11 +0200124 + ":xip/syntax-dep_rel$<b>33<i>6<i>7<i>6<i>9<s>2<s>1<s>0]");
Eliza Margaretha51fd5c22014-10-14 13:12:33 +0000125 return fd;
126 }
margaretha362c18b2018-01-17 17:30:56 +0100127
margarethaf09fdd42017-12-19 17:47:50 +0100128 public static FieldDocument createFieldDoc3 () {
129 FieldDocument fd = new FieldDocument();
130 fd.addString("ID", "doc-1");
131 fd.addTV("base", "ceccecdeed",
132 "[(0-1)s:c$<s>2|<>:p$<b>64<i>0<i>3<i>3<b>0<s>1|_0$<i>0<i>1|"
133 + ">:xip/dep_rel$<b>35<i>0<i>1<i>1<i>2<i>3<i>6<i>9<s>1<s>1<s>2|"
134 + ">:xip/dep_rel$<b>33<i>1<i>2<i>6<i>9<s>2<s>1<s>0|"
135 + "@:func=subj$<b>18<s>2]"
136 + "[(1-2)s:e|_1$<i>1<i>2|<>:p$<b>64<i>1<i>3<i>3<b>0<s>1]"
137 + "[(2-3)s:c|_2$<i>2<i>3]"
138 + "[(3-4)s:c|s:b|_3$<i>3<i>4]"
139 + "[(4-5)s:e|s:d|_4$<i>4<i>5]"
140 + "[(5-6)s:c|_5$<i>5<i>6]"
141 + "[(6-7)s:d$<s>2|<>:p$<b>64<i>6<i>9<i>9<b>0<s>1|_6$<i>6<i>7|"
142 + ">:xip/dep_rel$<b>34<i>3<i>4<i>9<i>9<s>1<s>1<s>0|"
143 + "<:xip/dep_rel$<b>35<i>3<i>4<i>4<i>5<i>9<i>1<i>3<s>1<s>1<s>2|"
144 + "<:xip/dep_rel$<b>34<i>5<i>6<i>9<i>1<s>1<s>2<s>0|"
145 + "@:func=obj$<b>18<s>2]" + "[(7-8)s:e|_7$<i>7<i>8]"
146 + "[(8-9)s:e|s:b|_8$<i>8<i>9]"
147 + "[(9-10)s:d$<s>1|_9$<i>9<i>10|<"
148 + ":xip/dep_rel$<b>33<i>6<i>7<i>6<i>9<s>2<s>1<s>0]");
149 return fd;
150 }
Nils Diewaldbb33da22015-03-04 16:24:25 +0000151
152
margarethab097bac2015-04-15 11:37:02 +0200153 public static FieldDocument createFieldDoc2 () {
Nils Diewaldbb33da22015-03-04 16:24:25 +0000154 FieldDocument fd = new FieldDocument();
Eliza Margaretha98c200e2014-10-15 13:59:58 +0000155 fd.addString("ID", "doc-2");
Eliza Margaretha6f989202016-10-14 21:48:29 +0200156 fd.addTV("base", "Ich kaufe die Blümen für meine Mutter.",
margaretha7ee65952015-12-14 15:39:12 +0100157 "[(0-3)s:Ich|_0$<i>0<i>3|pos:NN$<s>1|<>:s$<b>64<i>0<i>38<i>7<b>0<s>2|<>:np$<b>64<i>0<i>3<i>1<b>0<s>3|"
margaretha29a39112016-04-04 12:10:11 +0200158 + ">:child-of$<b>33<i>0<i>38<i>0<i>7<s>3<s>2<s>4|"
159 + ">:child-of$<b>33<i>0<i>3<i>0<i>1<s>1<s>3<s>0|"
160 + "<:child-of$<b>32<i>0<s>3<s>1<s>0|"
161 + "<:child-of$<b>35<i>0<i>38<i>0<i>3<i>7<i>0<i>1<s>2<s>3<s>0|"
162 + "<:child-of$<b>35<i>0<i>38<i>4<i>9<i>7<i>1<i>7<s>2<s>2<s>0|"
163 + "<:dep$<b>32<i>0<s>1<s>1<s>0|"
Akronfa8b2282020-06-18 07:41:46 +0200164 + "@:func=sbj$<b>18<s>4<i>7|" // attribute belongs to a relation
165 + "@:case=nominative$<b>18<s>3<i>1]" // attribute belongs to a relation node
Nils Diewaldbb33da22015-03-04 16:24:25 +0000166
margaretha24d2d012016-04-13 18:43:30 +0200167 + "[(1-2)s:kaufe|_1$<i>4<i>9|pos:V$<s>1|<>:vp$<b>64<i>4<i>38<i>7<b>0<s>2|"
margaretha29a39112016-04-04 12:10:11 +0200168 + ">:child-of$<b>35<i>4<i>38<i>0<i>38<i>7<i>0<i>7<s>2<s>2<s>0|"
169 + ">:child-of$<b>33<i>4<i>9<i>1<i>7<s>2<s>7<s>0|"
170 + "<:child-of$<b>34<i>4<i>38<i>7<i>2<s>2<s>1<s>0|"
171 + "<:child-of$<b>35<i>4<i>38<i>10<i>38<i>7<i>2<i>7<s>2<s>4<s>0|"
172 + ">:dep$<b>32<i>0<s>1<s>1<s>0|"
Akron6759b042016-04-28 01:25:00 +0200173 + ">:dep$<b>32<i>3<s>1<s>1<s>0]"
Nils Diewaldbb33da22015-03-04 16:24:25 +0000174
margaretha24d2d012016-04-13 18:43:30 +0200175 + "[(2-3)s:die|_2$<i>10<i>13|pos:ART$<s>1|tt:DET$<s>2|"
Akron42993552016-02-04 13:24:24 +0100176 + "<>:np$<b>64<i>10<i>20<i>4<b>0<s>3|<>:np$<b>64<i>10<i>38<i>7<b>0<s>4|"
margaretha29a39112016-04-04 12:10:11 +0200177 + ">:child-of$<b>35<i>10<i>24<i>10<i>38<i>4<i>2<i>7<s>3<s>4<s>0|"
margaretha32d2bee2016-04-22 16:06:53 +0200178
margaretha29a39112016-04-04 12:10:11 +0200179 + ">:child-of$<b>33<i>10<i>24<i>2<i>4<s>1<s>3<s>0|"
margaretha32d2bee2016-04-22 16:06:53 +0200180
margaretha29a39112016-04-04 12:10:11 +0200181 + ">:child-of$<b>35<i>10<i>38<i>4<i>38<i>7<i>1<i>7<s>4<s>2<s>0|"
182 + "<:child-of$<b>34<i>10<i>24<i>4<i>2<s>3<s>1<s>0|"
183 + "<:child-of$<b>34<i>10<i>24<i>4<i>3<s>3<s>1<s>0|"
184 + "<:child-of$<b>35<i>10<i>38<i>10<i>24<i>7<i>2<i>4<s>4<s>3<s>0|"
185 + "<:child-of$<b>35<i>10<i>38<i>21<i>38<i>7<i>4<i>7<s>4<s>2<s>0|"
186 + ">:parent-of$<b>35<i>10<i>38<i>21<i>38<i>7<i>4<i>7<s>4<s>2<s>0|"
Akron42993552016-02-04 13:24:24 +0100187 + "<:dep$<b>32<i>3<s>1<s>1<s>3|"
Akronfa8b2282020-06-18 07:41:46 +0200188 + "@:func=head$<b>18<s>3<i>4|"
189 + "@:case=accusative$<b>18<s>3<i>4|" // attribute belongs to a relation node
190 + "@:case=accusative$<b>18<s>2<i>7]" // attribute belongs to a relation node
Nils Diewaldbb33da22015-03-04 16:24:25 +0000191
margaretha7ee65952015-12-14 15:39:12 +0100192 + "[(3-4)s:Blümen|_3$<i>14<i>20|pos:NN$<s>1|"
margaretha29a39112016-04-04 12:10:11 +0200193 + ">:child-of$<b>33<i>10<i>24<i>2<i>4<s>1<s>3<s>0|"
194 + "<:dep$<b>32<i>1<s>1<s>1<s>0|"
Akron42993552016-02-04 13:24:24 +0100195 + ">:dep$<b>32<i>2<s>1<s>1<s>2|"
margaretha29a39112016-04-04 12:10:11 +0200196 + ">:dep$<b>32<i>4<s>1<s>1<s>0|"
Akronfa8b2282020-06-18 07:41:46 +0200197 + "@:func=obj$<b>18<s>2<i>4]"
Nils Diewaldbb33da22015-03-04 16:24:25 +0000198
margaretha7ee65952015-12-14 15:39:12 +0100199 + "[(4-5)s:für|_4$<i>21<i>24|pos:PREP$<s>1|<>:pp$<b>64<i>21<i>38<i>7<b>0<s>2|"
margaretha29a39112016-04-04 12:10:11 +0200200 + ">:child-of$<b>33<i>21<i>38<i>4<i>7<s>1<s>2<s>0|"
201 + ">:child-of$<b>35<i>21<i>38<i>10<i>38<i>7<i>2<i>7<s>2<s>4<s>0|"
202 + "<:child-of$<b>34<i>21<i>38<i>7<i>5<s>2<s>1<s>0|"
203 + "<:child-of$<b>35<i>21<i>38<i>25<i>38<i>7<i>5<i>7<s>2<s>2<s>0|"
204 + "<:dep$<b>32<i>3<s>1<s>1<s>0|"
205 + ">:dep$<b>32<i>6<s>1<s>1<s>0]"
Nils Diewaldbb33da22015-03-04 16:24:25 +0000206
margaretha24d2d012016-04-13 18:43:30 +0200207 + "[(5-6)s:meine|_5$<i>25<i>30|pos:ART$<s>1|<>:np$<b>64<i>25<i>38<i>7<b>0<s>2|"
margaretha32d2bee2016-04-22 16:06:53 +0200208
margaretha29a39112016-04-04 12:10:11 +0200209 + ">:child-of$<b>33<i>25<i>38<i>5<i>7<s>1<s>2<s>0|"
margaretha32d2bee2016-04-22 16:06:53 +0200210
margaretha29a39112016-04-04 12:10:11 +0200211 + ">:child-of$<b>35<i>25<i>38<i>21<i>38<i>7<i>4<i>7<s>2<s>2<s>0|"
212 + "<:child-of$<b>34<i>25<i>38<i>7<i>5<s>2<s>1<s>0|"
213 + "<:child-of$<b>34<i>25<i>38<i>7<i>6<s>2<s>1<s>0|"
214 + "<:dep$<b>32<i>6<s>1<s>1<s>3<s>0|"
Akronfa8b2282020-06-18 07:41:46 +0200215 + "@:func=head$<b>18<s>3<i>7|"
216 + "@:case=accusative$<b>18<s>2<i>7]" // attribute belongs to a relation node
Akron42993552016-02-04 13:24:24 +0100217
margaretha7ee65952015-12-14 15:39:12 +0100218 + "[(6-7)s:Mutter.|_6$<i>31<i>38|pos:NN$<s>1|"
margaretha29a39112016-04-04 12:10:11 +0200219 + ">:child-of$<b>33<i>25<i>38<i>5<i>7<s>1<s>2<s>0|"
220 + ">:dep$<b>32<i>5<s>1<s>1<s>0|"
221 + "<:dep$<b>32<i>4<s>1<s>1<s>0]");
Akron42993552016-02-04 13:24:24 +0100222
Eliza Margaretha98c200e2014-10-15 13:59:58 +0000223 return fd;
224 }
margaretha362c18b2018-01-17 17:30:56 +0100225
226
227 public static FieldDocument createFieldDoc4 () {
228 FieldDocument fd = new FieldDocument();
229 fd.addString("ID", "doc-0");
230 fd.addTV("base", "element term",
231 "[(0-1)s:element|_0$<i>0<i>7|<>:s$<b>64<i>0<i>7<i>0<b>0<s>1|"
232 // this relation is missing TUIs for source, target and relation ids
233 + ">:dep$<b>34<i>0<i>7<i>0<i>1|"
234 //+ ">:dep$<b>34<i>0<i>7<i>0<i>1<s>1<s>2<s>3|"
235 + "[(1-2)s:term$<b>128<s>2|_1$<i>8<i>12|]");
236 return fd;
237 }
238
239 @Test
240 public void testRelationMissingPayloads () throws IOException {
241 ki.addDoc(createFieldDoc4());
242 ki.commit();
243
244 SpanRelationQuery sq = new SpanRelationQuery(
245 new SpanTermQuery(new Term("base", ">:dep")), true,
246 RelationDirection.RIGHT);
247 kr = ki.search(sq, (short) 10);
248
249 assertEquals((long) 1, kr.getTotalResults());
250 assertEquals(0, kr.getMatch(0).getStartPos());
251 assertEquals(0, kr.getMatch(0).getEndPos());
252
253 SpanFocusQuery fq = new SpanFocusQuery(sq, sq.getTempClassNumbers());
254 fq.setMatchTemporaryClass(true);
255 fq.setRemoveTemporaryClasses(true);
256 fq.setSorted(false);
257
258 kr = ki.search(fq, (short) 20);
259 assertEquals((long) 1, kr.getTotalResults());
260 assertEquals(0, kr.getMatch(0).getStartPos());
261 assertEquals(2, kr.getMatch(0).getEndPos());
262 }
263
margarethaf09fdd42017-12-19 17:47:50 +0100264 @Test
265 public void testRelationWithRegex () throws IOException {
266 ki.addDoc(createFieldDoc0());
267 ki.addDoc(createFieldDoc3());
268 ki.commit();
269
margaretha362c18b2018-01-17 17:30:56 +0100270 SpanQuery sq;
margarethaf09fdd42017-12-19 17:47:50 +0100271 sq = new SpanRelationQuery(
272 new SpanMultiTermQueryWrapper<RegexQuery>(
273 new RegexQuery(new Term("base", ">:xip/.*"))),
274 true, RelationDirection.RIGHT);
275 kr = ki.search(sq, (short) 10);
margaretha362c18b2018-01-17 17:30:56 +0100276
margarethaf09fdd42017-12-19 17:47:50 +0100277 assertEquals((long) 7, kr.getTotalResults());
margaretha362c18b2018-01-17 17:30:56 +0100278
margarethaf09fdd42017-12-19 17:47:50 +0100279 sq = new SpanRelationQuery(
280 new SpanMultiTermQueryWrapper<RegexQuery>(
281 new RegexQuery(new Term("base", "<:xip/.*"))),
282 true, RelationDirection.LEFT);
283 kr = ki.search(sq, (short) 10);
margaretha362c18b2018-01-17 17:30:56 +0100284
margarethaf09fdd42017-12-19 17:47:50 +0100285 assertEquals((long) 7, kr.getTotalResults());
286 }
margaretha362c18b2018-01-17 17:30:56 +0100287
Nils Diewaldbb33da22015-03-04 16:24:25 +0000288 /**
289 * Relations: token to token, token to span, span to span
Eliza Margaretha6f989202016-10-14 21:48:29 +0200290 */
Nils Diewaldbb33da22015-03-04 16:24:25 +0000291 @Test
292 public void testCase1 () throws IOException {
293 ki.addDoc(createFieldDoc0());
294 ki.addDoc(createFieldDoc1());
295 ki.commit();
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000296
Eliza Margaretha6f989202016-10-14 21:48:29 +0200297 SpanRelationQuery sq = new SpanRelationQuery(
298 new SpanTermQuery(new Term("base", ">:xip/syntax-dep_rel")),
margarethaf09fdd42017-12-19 17:47:50 +0100299 true, RelationDirection.RIGHT);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000300 kr = ki.search(sq, (short) 10);
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000301
Nils Diewaldbb33da22015-03-04 16:24:25 +0000302 assertEquals((long) 7, kr.getTotalResults());
margaretha7ee65952015-12-14 15:39:12 +0100303
Nils Diewaldbb33da22015-03-04 16:24:25 +0000304 // token to token
305 assertEquals(0, kr.getMatch(0).getLocalDocID());
306 assertEquals(0, kr.getMatch(0).getStartPos());
307 assertEquals(1, kr.getMatch(0).getEndPos());
308 assertEquals(1, kr.getMatch(1).getStartPos());
309 assertEquals(2, kr.getMatch(1).getEndPos());
310 assertEquals(9, kr.getMatch(2).getStartPos());
311 assertEquals(10, kr.getMatch(2).getEndPos());
312 assertEquals(9, kr.getMatch(3).getStartPos());
313 assertEquals(10, kr.getMatch(3).getEndPos());
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000314
Nils Diewaldbb33da22015-03-04 16:24:25 +0000315 // token to span
316 assertEquals(1, kr.getMatch(4).getLocalDocID());
317 assertEquals(0, kr.getMatch(4).getStartPos());
318 assertEquals(1, kr.getMatch(4).getEndPos());
319 assertEquals(0, kr.getMatch(5).getStartPos());
320 assertEquals(3, kr.getMatch(5).getEndPos());
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000321
Nils Diewaldbb33da22015-03-04 16:24:25 +0000322 // span to span
323 assertEquals(6, kr.getMatch(6).getStartPos());
324 assertEquals(9, kr.getMatch(6).getEndPos());
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000325
Nils Diewaldbb33da22015-03-04 16:24:25 +0000326 // check target
Nils Diewaldbb33da22015-03-04 16:24:25 +0000327 }
328
329
330 /**
331 * Relation span to token
Eliza Margaretha6f989202016-10-14 21:48:29 +0200332 */
Nils Diewaldbb33da22015-03-04 16:24:25 +0000333 @Test
334 public void testCase2 () throws IOException {
335 ki.addDoc(createFieldDoc0());
336 ki.addDoc(createFieldDoc1());
337 ki.commit();
338
Eliza Margaretha6f989202016-10-14 21:48:29 +0200339 SpanRelationQuery sq = new SpanRelationQuery(
340 new SpanTermQuery(new Term("base", "<:xip/syntax-dep_rel")),
margarethaf09fdd42017-12-19 17:47:50 +0100341 true, RelationDirection.LEFT);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000342 kr = ki.search(sq, (short) 10);
343
344 assertEquals((long) 7, kr.getTotalResults());
345 // token to token
346 assertEquals(0, kr.getMatch(0).getLocalDocID());
347 assertEquals(1, kr.getMatch(0).getStartPos());
348 assertEquals(2, kr.getMatch(0).getEndPos());
349 assertEquals(3, kr.getMatch(1).getStartPos());
350 assertEquals(4, kr.getMatch(1).getEndPos());
351 assertEquals(4, kr.getMatch(2).getStartPos());
352 assertEquals(5, kr.getMatch(2).getEndPos());
353 assertEquals(6, kr.getMatch(3).getStartPos());
354 assertEquals(7, kr.getMatch(3).getEndPos());
355
356 assertEquals(1, kr.getMatch(4).getLocalDocID());
357 // span to token
358 assertEquals(6, kr.getMatch(4).getStartPos());
359 assertEquals(9, kr.getMatch(4).getEndPos());
360 assertEquals(6, kr.getMatch(5).getStartPos());
361 assertEquals(9, kr.getMatch(5).getEndPos());
362 // span to span
363 assertEquals(9, kr.getMatch(6).getStartPos());
364 assertEquals(10, kr.getMatch(6).getEndPos());
365 }
366
367
368 /**
margarethaf70addb2015-04-27 13:17:18 +0200369 * Relations only
Eliza Margaretha6f989202016-10-14 21:48:29 +0200370 */
margaretha50c76332015-03-19 10:10:39 +0100371 @Test
372 public void testCase3 () throws IOException {
373 ki.addDoc(createFieldDoc2());
374 ki.commit();
Nils Diewaldbb33da22015-03-04 16:24:25 +0000375
margaretha50c76332015-03-19 10:10:39 +0100376 // child-of relations
Eliza Margaretha6f989202016-10-14 21:48:29 +0200377 SpanRelationQuery srq = new SpanRelationQuery(
margaretha362c18b2018-01-17 17:30:56 +0100378 new SpanTermQuery(new Term("base", ">:child-of")), true,
379 RelationDirection.RIGHT);
margaretha50c76332015-03-19 10:10:39 +0100380 kr = ki.search(srq, (short) 20);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000381
margaretha50c76332015-03-19 10:10:39 +0100382 assertEquals((long) 13, kr.getTotalResults());
383 assertEquals(0, kr.getMatch(0).getStartPos());
384 assertEquals(1, kr.getMatch(0).getEndPos());
385 assertEquals(0, kr.getMatch(1).getStartPos());
386 assertEquals(1, kr.getMatch(1).getEndPos());
387 assertEquals(1, kr.getMatch(2).getStartPos());
388 assertEquals(2, kr.getMatch(2).getEndPos());
389 assertEquals(1, kr.getMatch(3).getStartPos());
390 assertEquals(7, kr.getMatch(3).getEndPos());
391 assertEquals(2, kr.getMatch(4).getStartPos());
392 assertEquals(3, kr.getMatch(4).getEndPos());
393 assertEquals(2, kr.getMatch(5).getStartPos());
394 assertEquals(4, kr.getMatch(5).getEndPos());
Nils Diewaldbb33da22015-03-04 16:24:25 +0000395 }
Nils Diewaldbb33da22015-03-04 16:24:25 +0000396
Akronbb5d1732015-06-22 01:22:40 +0200397
margarethaf70addb2015-04-27 13:17:18 +0200398 /**
399 * Relations only with/out attribute
Eliza Margaretha6f989202016-10-14 21:48:29 +0200400 */
margaretha50c76332015-03-19 10:10:39 +0100401 @Test
402 public void testCase4 () throws IOException {
403 ki.addDoc(createFieldDoc2());
404 ki.commit();
405
Eliza Margaretha6f989202016-10-14 21:48:29 +0200406 SpanRelationQuery srq = new SpanRelationQuery(
margaretha362c18b2018-01-17 17:30:56 +0100407 new SpanTermQuery(new Term("base", ">:child-of")), true,
408 RelationDirection.RIGHT);
margaretha50c76332015-03-19 10:10:39 +0100409
margarethaf70addb2015-04-27 13:17:18 +0200410 SpanFocusQuery fq = new SpanFocusQuery(srq, srq.getTempClassNumbers());
411 fq.setMatchTemporaryClass(true);
412 fq.setRemoveTemporaryClasses(true);
413 fq.setSorted(false);
margaretha29a39112016-04-04 12:10:11 +0200414 // kr = ki.search(fq, (short) 20);
415 // for (Match m : kr.getMatches()) {
416 // System.out.println(m.getStartPos() + " " + m.getEndPos());
417 // }
Akron6759b042016-04-28 01:25:00 +0200418
Eliza Margaretha6f989202016-10-14 21:48:29 +0200419 SpanAttributeQuery saq = new SpanAttributeQuery(
420 new SpanTermQuery(new Term("base", "@:func=sbj")), true);
margaretha29a39112016-04-04 12:10:11 +0200421 // kr = ki.search(saq, (short) 20);
margaretha7ee65952015-12-14 15:39:12 +0100422
margarethaf70addb2015-04-27 13:17:18 +0200423 // child-of with attr func=sbj
Akron42993552016-02-04 13:24:24 +0100424 SpanWithAttributeQuery wq;
margaretha29a39112016-04-04 12:10:11 +0200425 wq = new SpanWithAttributeQuery(fq, saq, true);
Akron42993552016-02-04 13:24:24 +0100426 // kr = ki.search(wq, (short) 20);
427 // assertEquals((long) 1, kr.getTotalResults());
428 // assertEquals(0, kr.getMatch(0).getStartPos()); // token
429 // assertEquals(7, kr.getMatch(0).getEndPos());
margaretha50c76332015-03-19 10:10:39 +0100430
431 // child-of without attr func=sbj
Eliza Margaretha6f989202016-10-14 21:48:29 +0200432 wq = new SpanWithAttributeQuery(fq,
433 new SpanAttributeQuery(
434 new SpanTermQuery(new Term("base", "@:func=sbj")), true,
435 true),
margaretha7ee65952015-12-14 15:39:12 +0100436 true);
margaretha50c76332015-03-19 10:10:39 +0100437 kr = ki.search(wq, (short) 20);
438 assertEquals((long) 12, kr.getTotalResults());
439 }
440
441
Nils Diewaldbb33da22015-03-04 16:24:25 +0000442 /**
margarethaf70addb2015-04-27 13:17:18 +0200443 * Relation directions <br/>
444 * Relation with specific sources, return the sources
Eliza Margaretha6f989202016-10-14 21:48:29 +0200445 */
Nils Diewaldbb33da22015-03-04 16:24:25 +0000446 @Test
margaretha50c76332015-03-19 10:10:39 +0100447 public void testCase6 () throws IOException {
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000448 ki.addDoc(createFieldDoc2());
449 ki.commit();
Nils Diewaldbb33da22015-03-04 16:24:25 +0000450
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000451 // return all children that are NP
margarethaf70addb2015-04-27 13:17:18 +0200452 SpanElementQuery seq1 = new SpanElementQuery("base", "np");
453 SpanClassQuery scq1 = new SpanClassQuery(seq1, (byte) 1);
454
Eliza Margaretha6f989202016-10-14 21:48:29 +0200455 SpanRelationQuery srq = new SpanRelationQuery(
margaretha362c18b2018-01-17 17:30:56 +0100456 new SpanTermQuery(new Term("base", ">:child-of")), true,
457 RelationDirection.RIGHT);
margarethaf70addb2015-04-27 13:17:18 +0200458
459 SpanRelationMatchQuery rm = new SpanRelationMatchQuery(srq, scq1, true);
460 SpanFocusQuery rv = new SpanFocusQuery(rm, (byte) 1);
461 rv.setSorted(false);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000462
margarethab9ee3e52015-05-04 12:42:23 +0200463 assertEquals(
Akrona26184e2018-12-05 15:37:34 +0100464 "focus(1: focus(#[1,2]spanSegment(spanRelation(base:>:child-of), {1: <base:np />}),sorting),sorting)",
margarethab9ee3e52015-05-04 12:42:23 +0200465 rv.toString());
466
Nils Diewaldbb33da22015-03-04 16:24:25 +0000467 kr = ki.search(rv, (short) 10);
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000468
469 assertEquals(4, kr.getTotalResults());
Nils Diewaldbb33da22015-03-04 16:24:25 +0000470 assertEquals(0, kr.getMatch(0).getStartPos());
471 assertEquals(1, kr.getMatch(0).getEndPos());
472 assertEquals(2, kr.getMatch(1).getStartPos());
473 assertEquals(4, kr.getMatch(1).getEndPos());
474 assertEquals(2, kr.getMatch(2).getStartPos());
475 assertEquals(7, kr.getMatch(2).getEndPos());
476 assertEquals(5, kr.getMatch(3).getStartPos());
477 assertEquals(7, kr.getMatch(3).getEndPos());
478
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000479 // return all parents that are NP
Eliza Margaretha6f989202016-10-14 21:48:29 +0200480 srq = new SpanRelationQuery(
margaretha362c18b2018-01-17 17:30:56 +0100481 new SpanTermQuery(new Term("base", "<:child-of")), true,
482 RelationDirection.LEFT);
margarethaf70addb2015-04-27 13:17:18 +0200483 rm = new SpanRelationMatchQuery(srq, scq1, true);
484 rv = new SpanFocusQuery(rm, (byte) 1);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000485 kr = ki.search(rv, (short) 10);
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000486
487 assertEquals(7, kr.getTotalResults());
Nils Diewaldbb33da22015-03-04 16:24:25 +0000488 assertEquals(0, kr.getMatch(0).getStartPos());
489 assertEquals(1, kr.getMatch(0).getEndPos());
490 assertEquals(2, kr.getMatch(1).getStartPos());
491 assertEquals(4, kr.getMatch(1).getEndPos());
492 assertEquals(2, kr.getMatch(2).getStartPos());
493 assertEquals(4, kr.getMatch(2).getEndPos());
494 assertEquals(2, kr.getMatch(3).getStartPos());
495 assertEquals(7, kr.getMatch(3).getEndPos());
496 assertEquals(2, kr.getMatch(4).getStartPos());
497 assertEquals(7, kr.getMatch(4).getEndPos());
498 assertEquals(5, kr.getMatch(5).getStartPos());
499 assertEquals(7, kr.getMatch(5).getEndPos());
500 assertEquals(5, kr.getMatch(6).getStartPos());
501 assertEquals(7, kr.getMatch(6).getEndPos());
502 }
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000503
Akronbb5d1732015-06-22 01:22:40 +0200504
margarethaf70addb2015-04-27 13:17:18 +0200505 /**
506 * Dependency relations with attribute
Eliza Margaretha6f989202016-10-14 21:48:29 +0200507 */
margarethaf70addb2015-04-27 13:17:18 +0200508 @Test
Akronbb5d1732015-06-22 01:22:40 +0200509 public void testCase5 () throws IOException {
margarethaf70addb2015-04-27 13:17:18 +0200510 ki.addDoc(createFieldDoc2());
511 ki.commit();
512
513 // target of a dependency relation
Eliza Margaretha6f989202016-10-14 21:48:29 +0200514 SpanRelationQuery srq = new SpanRelationQuery(
margaretha362c18b2018-01-17 17:30:56 +0100515 new SpanTermQuery(new Term("base", "<:dep")), true,
margarethaf09fdd42017-12-19 17:47:50 +0100516 RelationDirection.LEFT);
margarethaf70addb2015-04-27 13:17:18 +0200517 kr = ki.search(srq, (short) 10);
518 assertEquals((long) 6, kr.getTotalResults());
519
520 SpanFocusQuery fq = new SpanFocusQuery(srq, srq.getTempClassNumbers());
521 fq.setMatchTemporaryClass(true);
522 fq.setRemoveTemporaryClasses(true);
523 // fq.setSorted(false);
524
525 kr = ki.search(fq, (short) 10);
526 assertEquals((long) 6, kr.getTotalResults());
margaretha7ee65952015-12-14 15:39:12 +0100527
Eliza Margaretha6f989202016-10-14 21:48:29 +0200528 SpanAttributeQuery aq = new SpanAttributeQuery(
529 new SpanTermQuery(new Term("base", "@:func=head")), true);
margarethaf70addb2015-04-27 13:17:18 +0200530 kr = ki.search(aq, (short) 10);
531
532 // dependency relation, which is also a head
margaretha7ee65952015-12-14 15:39:12 +0100533 SpanWithAttributeQuery wq = new SpanWithAttributeQuery(fq, aq, true);
margarethaf70addb2015-04-27 13:17:18 +0200534
535 kr = ki.search(wq, (short) 20);
536
537 assertEquals((long) 2, kr.getTotalResults());
538 assertEquals(2, kr.getMatch(0).getStartPos());
539 assertEquals(4, kr.getMatch(0).getEndPos());
540 assertEquals(5, kr.getMatch(1).getStartPos());
541 assertEquals(7, kr.getMatch(1).getEndPos());
542
543 }
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000544
Akronbb5d1732015-06-22 01:22:40 +0200545
Nils Diewaldbb33da22015-03-04 16:24:25 +0000546 /**
margarethab9ee3e52015-05-04 12:42:23 +0200547 * Relation with specific sources, return any targets
Eliza Margaretha6f989202016-10-14 21:48:29 +0200548 */
margaretha50c76332015-03-19 10:10:39 +0100549 @Test
550 public void testCase7 () throws IOException {
551 ki.addDoc(createFieldDoc2());
552 ki.commit();
Eliza Margarethad12cabb2014-10-27 17:45:34 +0000553
margarethab9ee3e52015-05-04 12:42:23 +0200554 // match all children that are NP
margarethaf70addb2015-04-27 13:17:18 +0200555 SpanElementQuery seq1 = new SpanElementQuery("base", "np");
556 SpanClassQuery scq1 = new SpanClassQuery(seq1, (byte) 1);
557
Eliza Margaretha6f989202016-10-14 21:48:29 +0200558 SpanRelationQuery srq = new SpanRelationQuery(
margaretha362c18b2018-01-17 17:30:56 +0100559 new SpanTermQuery(new Term("base", ">:child-of")), true,
margarethaf09fdd42017-12-19 17:47:50 +0100560 RelationDirection.RIGHT);
margarethaf70addb2015-04-27 13:17:18 +0200561 srq.setTargetClass((byte) 2);
562
563 SpanRelationMatchQuery rm = new SpanRelationMatchQuery(srq, scq1, true);
margarethab9ee3e52015-05-04 12:42:23 +0200564 // SpanQuery rv = new SpanFocusQuery(rm, (byte) 1);
margaretha50c76332015-03-19 10:10:39 +0100565
566 //return all parents of np
margarethab9ee3e52015-05-04 12:42:23 +0200567 SpanFocusQuery rv2 = new SpanFocusQuery(rm, (byte) 2);
margaretha50c76332015-03-19 10:10:39 +0100568 rv2.setSorted(false);
margarethab9ee3e52015-05-04 12:42:23 +0200569
570 assertEquals(
Akrona26184e2018-12-05 15:37:34 +0100571 "focus(2: focus(#[1,2]spanSegment({2: target:spanRelation(base:>:child-of)}, {1: <base:np />}),sorting),sorting)",
margarethab9ee3e52015-05-04 12:42:23 +0200572 rv2.toString());
573
margaretha50c76332015-03-19 10:10:39 +0100574 kr = ki.search(rv2, (short) 10);
575
576 assertEquals((long) 4, kr.getTotalResults());
577 assertEquals(0, kr.getMatch(0).getStartPos());
578 assertEquals(7, kr.getMatch(0).getEndPos());
579 assertEquals(1, kr.getMatch(1).getStartPos());
580 assertEquals(7, kr.getMatch(1).getEndPos());
581 assertEquals(2, kr.getMatch(2).getStartPos());
582 assertEquals(7, kr.getMatch(2).getEndPos());
583 assertEquals(4, kr.getMatch(3).getStartPos());
584 assertEquals(7, kr.getMatch(3).getEndPos());
585 // id problem (solved)
586
587 // return all parents of np that are PP
588
Nils Diewaldbb33da22015-03-04 16:24:25 +0000589 }
margaretha50c76332015-03-19 10:10:39 +0100590
591
592 /**
593 * Relations whose source/target do not embed
594 * its counterparts.
Eliza Margaretha6f989202016-10-14 21:48:29 +0200595 */
Nils Diewaldbb33da22015-03-04 16:24:25 +0000596 @Test
597 public void testCase8 () throws IOException {
598 ki.addDoc(createFieldDoc2());
599 ki.commit();
600
601 //return source of dep relations to pos:NN
Akronbb5d1732015-06-22 01:22:40 +0200602
margaretha362c18b2018-01-17 17:30:56 +0100603 SpanTermWithIdQuery tq =
604 new SpanTermWithIdQuery(new Term("base", "pos:NN"), true);
Eliza Margaretha6f989202016-10-14 21:48:29 +0200605 SpanRelationQuery srq = new SpanRelationQuery(
margaretha362c18b2018-01-17 17:30:56 +0100606 new SpanTermQuery(new Term("base", "<:dep")), true,
margarethaf09fdd42017-12-19 17:47:50 +0100607 RelationDirection.LEFT);
margarethaf70addb2015-04-27 13:17:18 +0200608 srq.setSourceClass((byte) 1);
609 SpanRelationMatchQuery rm = new SpanRelationMatchQuery(srq, tq, true);
610 SpanQuery rv = new SpanFocusQuery(rm, (byte) 1);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000611
612 kr = ki.search(rv, (short) 10);
613 assertEquals((long) 3, kr.getTotalResults());
margarethaf70addb2015-04-27 13:17:18 +0200614 assertEquals(0, kr.getMatch(0).getStartPos());
615 assertEquals(1, kr.getMatch(0).getEndPos());
Nils Diewaldbb33da22015-03-04 16:24:25 +0000616 assertEquals(1, kr.getMatch(1).getStartPos());
617 assertEquals(2, kr.getMatch(1).getEndPos());
618 assertEquals(4, kr.getMatch(2).getStartPos());
619 assertEquals(5, kr.getMatch(2).getEndPos());
620
margarethaf70addb2015-04-27 13:17:18 +0200621 // return target of dep relations from pos:NN
622 srq = new SpanRelationQuery(
margaretha362c18b2018-01-17 17:30:56 +0100623 new SpanTermQuery(new Term("base", ">:dep")), true,
margarethaf09fdd42017-12-19 17:47:50 +0100624 RelationDirection.RIGHT);
margarethaf70addb2015-04-27 13:17:18 +0200625 srq.setTargetClass((byte) 1);
626 rm = new SpanRelationMatchQuery(srq, tq, true);
627 rv = new SpanFocusQuery(rm, (byte) 1);
628
Nils Diewaldbb33da22015-03-04 16:24:25 +0000629 kr = ki.search(rv, (short) 10);
630 assertEquals((long) 3, kr.getTotalResults());
631 assertEquals(2, kr.getMatch(0).getStartPos());
632 assertEquals(3, kr.getMatch(0).getEndPos());
633 assertEquals(4, kr.getMatch(1).getStartPos());
634 assertEquals(5, kr.getMatch(1).getEndPos());
635 assertEquals(5, kr.getMatch(2).getStartPos());
636 assertEquals(6, kr.getMatch(2).getEndPos());
637
638 }
639
margaretha50c76332015-03-19 10:10:39 +0100640
641 /**
margarethaf70addb2015-04-27 13:17:18 +0200642 * Relation with specific sources and return any targets <br/>
Akronbb5d1732015-06-22 01:22:40 +0200643 * Relation with specific sources and targets, return the targets
644 * <br/>
margarethaf70addb2015-04-27 13:17:18 +0200645 * Relation with specific sources and targets, return the sources
margaretha50c76332015-03-19 10:10:39 +0100646 *
647 * @throws IOException
Eliza Margaretha6f989202016-10-14 21:48:29 +0200648 */
margaretha50c76332015-03-19 10:10:39 +0100649 @Test
650 public void testCase9 () throws IOException {
651 ki.addDoc(createFieldDoc2());
652 ki.commit();
653
654 // return all children of np
margarethaf70addb2015-04-27 13:17:18 +0200655 SpanElementQuery seq1 = new SpanElementQuery("base", "np");
656 SpanClassQuery scq1 = new SpanClassQuery(seq1, (byte) 1);
Eliza Margaretha6f989202016-10-14 21:48:29 +0200657 SpanRelationQuery srq = new SpanRelationQuery(
margaretha362c18b2018-01-17 17:30:56 +0100658 new SpanTermQuery(new Term("base", "<:child-of")), true,
659 RelationDirection.LEFT);
margarethaf70addb2015-04-27 13:17:18 +0200660 srq.setSourceClass((byte) 2);
661 SpanRelationMatchQuery rm = new SpanRelationMatchQuery(srq, scq1, true);
662 SpanFocusQuery rv = new SpanFocusQuery(rm, (byte) 2);
margaretha50c76332015-03-19 10:10:39 +0100663 rv.setSorted(false);
664
margarethab9ee3e52015-05-04 12:42:23 +0200665 assertEquals(
Akrona26184e2018-12-05 15:37:34 +0100666 "focus(2: focus(#[1,2]spanSegment({2: source:spanRelation(base:<:child-of)}, {1: <base:np />}),sorting),sorting)",
margarethab9ee3e52015-05-04 12:42:23 +0200667 rv.toString());
668
margaretha50c76332015-03-19 10:10:39 +0100669 kr = ki.search(rv, (short) 10);
670
671 assertEquals((long) 7, kr.getTotalResults());
672 assertEquals(0, kr.getMatch(0).getStartPos());
673 assertEquals(1, kr.getMatch(0).getEndPos());
674 assertEquals(2, kr.getMatch(1).getStartPos());
675 assertEquals(3, kr.getMatch(1).getEndPos());
676 assertEquals(2, kr.getMatch(2).getStartPos());
677 assertEquals(4, kr.getMatch(2).getEndPos());
678 assertEquals(3, kr.getMatch(3).getStartPos());
679 assertEquals(4, kr.getMatch(3).getEndPos());
680 assertEquals(4, kr.getMatch(4).getStartPos());
681 assertEquals(7, kr.getMatch(4).getEndPos());
682 assertEquals(5, kr.getMatch(5).getStartPos());
683 assertEquals(6, kr.getMatch(5).getEndPos());
684 assertEquals(6, kr.getMatch(6).getStartPos());
685 assertEquals(7, kr.getMatch(6).getEndPos());
margaretha32d2bee2016-04-22 16:06:53 +0200686 }
margaretha50c76332015-03-19 10:10:39 +0100687
Akron6759b042016-04-28 01:25:00 +0200688
margaretha32d2bee2016-04-22 16:06:53 +0200689 @Test
Akron6759b042016-04-28 01:25:00 +0200690 public void testCase9b () throws IOException {
margaretha32d2bee2016-04-22 16:06:53 +0200691 ki.addDoc(createFieldDoc2());
692 ki.commit();
margarethaf70addb2015-04-27 13:17:18 +0200693
margaretha362c18b2018-01-17 17:30:56 +0100694 SpanTermWithIdQuery tiq =
695 new SpanTermWithIdQuery(new Term("base", "pos:ART"), true);
margaretha32d2bee2016-04-22 16:06:53 +0200696 SpanClassQuery scq1 = new SpanClassQuery(tiq, (byte) 1);
697 SpanElementQuery seq = new SpanElementQuery("base", "np");
698 SpanClassQuery scq2 = new SpanClassQuery(seq, (byte) 2);
margarethaf70addb2015-04-27 13:17:18 +0200699
Eliza Margaretha6f989202016-10-14 21:48:29 +0200700 SpanRelationQuery srq = new SpanRelationQuery(
margaretha362c18b2018-01-17 17:30:56 +0100701 new SpanTermQuery(new Term("base", ">:child-of")), true,
702 RelationDirection.RIGHT);
margaretha32d2bee2016-04-22 16:06:53 +0200703 srq.setSourceClass((byte) 1);
704 srq.setTargetClass((byte) 2);
margarethaf70addb2015-04-27 13:17:18 +0200705
margaretha362c18b2018-01-17 17:30:56 +0100706 SpanRelationMatchQuery rm =
707 new SpanRelationMatchQuery(srq, scq1, scq2, true);
margaretha32d2bee2016-04-22 16:06:53 +0200708
709 // return all nps whose children are articles
710 SpanFocusQuery rv = new SpanFocusQuery(rm, (byte) 2);
711 rv.setSorted(false);
margarethab9ee3e52015-05-04 12:42:23 +0200712
margarethaf70addb2015-04-27 13:17:18 +0200713 kr = ki.search(rv, (short) 10);
margaretha32d2bee2016-04-22 16:06:53 +0200714 assertEquals((long) 2, kr.getTotalResults());
715 assertEquals(2, kr.getMatch(0).getStartPos());
716 assertEquals(4, kr.getMatch(0).getEndPos());
717 assertEquals(5, kr.getMatch(1).getStartPos());
718 assertEquals(7, kr.getMatch(1).getEndPos());
719
720 // for (Match m : kr.getMatches()) {
721 // System.out.println(m.getStartPos() + " " + m.getEndPos());
722 // }
723 }
724
Akron6759b042016-04-28 01:25:00 +0200725
margaretha32d2bee2016-04-22 16:06:53 +0200726 @Test
Akron6759b042016-04-28 01:25:00 +0200727 public void testCase9c () throws IOException {
margaretha32d2bee2016-04-22 16:06:53 +0200728 ki.addDoc(createFieldDoc2());
729 ki.commit();
730
margaretha362c18b2018-01-17 17:30:56 +0100731 SpanTermWithIdQuery tiq =
732 new SpanTermWithIdQuery(new Term("base", "pos:ART"), true);
margaretha32d2bee2016-04-22 16:06:53 +0200733 SpanClassQuery scq1 = new SpanClassQuery(tiq, (byte) 1);
734
735 kr = ki.search(scq1, (short) 10);
736 assertEquals((long) 2, kr.getTotalResults());
737 assertEquals(2, kr.getMatch(0).getStartPos());
738 assertEquals(3, kr.getMatch(0).getEndPos());
739 assertEquals(5, kr.getMatch(1).getStartPos());
740 assertEquals(6, kr.getMatch(1).getEndPos());
741
Eliza Margaretha6f989202016-10-14 21:48:29 +0200742 SpanRelationQuery srq = new SpanRelationQuery(
margaretha362c18b2018-01-17 17:30:56 +0100743 new SpanTermQuery(new Term("base", ">:child-of")), true,
744 RelationDirection.RIGHT);
margaretha32d2bee2016-04-22 16:06:53 +0200745 srq.setSourceClass((byte) 1);
746 srq.setTargetClass((byte) 2);
747
748 // match articles as relation sources (left side)
749 SpanSegmentQuery ssq1 = new SpanSegmentQuery(srq, scq1);
750 // NOTE: SegmentSpans can only always adopt the relation left
751 // side id.
752
753 kr = ki.search(ssq1, (short) 10);
754 assertEquals(2, kr.getMatch(0).getStartPos());
755 assertEquals(3, kr.getMatch(0).getEndPos());
756 assertEquals(5, kr.getMatch(1).getStartPos());
757 assertEquals(6, kr.getMatch(1).getEndPos());
758
759 // return all parents of articles
760 SpanFocusQuery sfq = new SpanFocusQuery(ssq1, (byte) 2);
761 sfq.setSorted(false);
762
763 kr = ki.search(sfq, (short) 10);
764 assertEquals((long) 2, kr.getTotalResults());
765 assertEquals(2, kr.getMatch(0).getStartPos());
766 assertEquals(4, kr.getMatch(0).getEndPos());
767 assertEquals(5, kr.getMatch(1).getStartPos());
768 assertEquals(7, kr.getMatch(1).getEndPos());
769
770 SpanElementQuery seq = new SpanElementQuery("base", "np");
771 SpanClassQuery scq2 = new SpanClassQuery(seq, (byte) 2);
772
773 kr = ki.search(scq2, (short) 10);
774 assertEquals((long) 4, kr.getTotalResults());
775 assertEquals(0, kr.getMatch(0).getStartPos());
776 assertEquals(1, kr.getMatch(0).getEndPos());
777 assertEquals(2, kr.getMatch(1).getStartPos());
778 assertEquals(4, kr.getMatch(1).getEndPos());
779 assertEquals(2, kr.getMatch(2).getStartPos());
780 assertEquals(7, kr.getMatch(2).getEndPos());
781 assertEquals(5, kr.getMatch(3).getStartPos());
782 assertEquals(7, kr.getMatch(3).getEndPos());
783
784 // match nps as relation targets (right side)
785 // return all nps whose children are articles
786 SpanSegmentQuery ssq2 = new SpanSegmentQuery(sfq, scq2);
787 kr = ki.search(ssq2, (short) 10);
788 assertEquals((long) 2, kr.getTotalResults());
789 assertEquals(2, kr.getMatch(0).getStartPos());
790 assertEquals(4, kr.getMatch(0).getEndPos());
791 assertEquals(5, kr.getMatch(1).getStartPos());
792 assertEquals(7, kr.getMatch(1).getEndPos());
793
794 // NOTE: cannot match the span id of the embedded relation
795 // target and the np. So the segment match here is only by
796 // positions. All nps in the same position will be matches.
797
798 // return the articles whos parents are nps
799 SpanFocusQuery sfq2 = new SpanFocusQuery(ssq2, (byte) 1);
800 sfq2.setSorted(false);
801 assertEquals("focus(1: spanSegment(focus(2: spanSegment({1: source:"
802 + "{2: target:spanRelation(base:>:child-of)}}, "
Akrona26184e2018-12-05 15:37:34 +0100803 + "{1: spanTermWithId(base:pos:ART)}),sorting), "
804 + "{2: <base:np />}),sorting)", sfq2.toString());
margaretha32d2bee2016-04-22 16:06:53 +0200805
806 kr = ki.search(sfq2, (short) 10);
margaretha50c76332015-03-19 10:10:39 +0100807
808 assertEquals((long) 2, kr.getTotalResults());
809 assertEquals(2, kr.getMatch(0).getStartPos());
810 assertEquals(3, kr.getMatch(0).getEndPos());
811 assertEquals(5, kr.getMatch(1).getStartPos());
812 assertEquals(6, kr.getMatch(1).getEndPos());
813
margaretha32d2bee2016-04-22 16:06:53 +0200814 // for (Match m : kr.getMatches()) {
815 // System.out.println(m.getStartPos() + " " + m.getEndPos());
816 // }
margaretha50c76332015-03-19 10:10:39 +0100817 }
818
Akron6759b042016-04-28 01:25:00 +0200819
margaretha24d2d012016-04-13 18:43:30 +0200820 /**
821 * Relation whose nodes have a specific attribute.
822 *
Eliza Margaretha6f989202016-10-14 21:48:29 +0200823 */
margarethaf70addb2015-04-27 13:17:18 +0200824 @Test
Akron6759b042016-04-28 01:25:00 +0200825 public void testCase10a () throws IOException {
margarethaf70addb2015-04-27 13:17:18 +0200826 ki.addDoc(createFieldDoc2());
827 ki.commit();
margaretha24d2d012016-04-13 18:43:30 +0200828
Eliza Margaretha6f989202016-10-14 21:48:29 +0200829 SpanAttributeQuery aq = new SpanAttributeQuery(
830 new SpanTermQuery(new Term("base", "@:case=accusative")), true);
margaretha24d2d012016-04-13 18:43:30 +0200831 kr = ki.search(aq, (short) 10);
margaretha32d2bee2016-04-22 16:06:53 +0200832 assertEquals((long) 3, kr.getTotalResults());
margarethaf70addb2015-04-27 13:17:18 +0200833
Eliza Margaretha6f989202016-10-14 21:48:29 +0200834 SpanRelationQuery srq = new SpanRelationQuery(
margaretha362c18b2018-01-17 17:30:56 +0100835 new SpanTermQuery(new Term("base", ">:child-of")), true,
836 RelationDirection.RIGHT);
margaretha24d2d012016-04-13 18:43:30 +0200837 srq.setSourceClass((byte) 1);
838 srq.setTargetClass((byte) 2);
839 kr = ki.search(srq, (short) 20);
840 assertEquals((long) 13, kr.getTotalResults());
margarethaf70addb2015-04-27 13:17:18 +0200841
margaretha24d2d012016-04-13 18:43:30 +0200842 // Matching relation source node with an attribute
843 SpanFocusQuery sfq1 = new SpanFocusQuery(srq, (byte) 1);
margaretha362c18b2018-01-17 17:30:56 +0100844 SpanWithAttributeQuery swaq =
845 new SpanWithAttributeQuery(sfq1, aq, true);
Akron6759b042016-04-28 01:25:00 +0200846
margaretha24d2d012016-04-13 18:43:30 +0200847 kr = ki.search(swaq, (short) 10);
848 assertEquals((long) 2, kr.getTotalResults());
849 assertEquals(2, kr.getMatch(0).getStartPos());
850 assertEquals(4, kr.getMatch(0).getEndPos());
851 assertEquals(5, kr.getMatch(1).getStartPos());
margarethaf70addb2015-04-27 13:17:18 +0200852 assertEquals(7, kr.getMatch(1).getEndPos());
Akron6759b042016-04-28 01:25:00 +0200853
854 // Returning relations whose source has a specific attribute
margaretha362c18b2018-01-17 17:30:56 +0100855 SpanFocusQuery fqr =
856 new SpanFocusQuery(swaq, srq.getTempClassNumbers());
Akron6759b042016-04-28 01:25:00 +0200857 fqr.setMatchTemporaryClass(true);
858 fqr.setRemoveTemporaryClasses(true);
Eliza Margaretha6f989202016-10-14 21:48:29 +0200859 assertEquals(
860 "focus(#[1,2]spanRelationWithAttribute(focus(1: "
861 + "{1: source:{2: target:spanRelation(base:>:child-of)}}), "
862 + "spanAttribute(base:@:case=accusative)))",
863 fqr.toString());
Akron6759b042016-04-28 01:25:00 +0200864
865 kr = ki.search(fqr, (short) 10);
866 assertEquals((long) 2, kr.getTotalResults());
867 assertEquals(2, kr.getMatch(0).getStartPos());
868 assertEquals(7, kr.getMatch(0).getEndPos());
869 assertEquals(4, kr.getMatch(1).getStartPos());
870 assertEquals(7, kr.getMatch(1).getEndPos());
margaretha24d2d012016-04-13 18:43:30 +0200871
872 // Matching relation target nodes with an attribute
873 SpanFocusQuery sfq2 = new SpanFocusQuery(srq, (byte) 2);
margaretha32d2bee2016-04-22 16:06:53 +0200874 sfq2.setSorted(false);
margaretha362c18b2018-01-17 17:30:56 +0100875 SpanWithAttributeQuery swaq2 =
876 new SpanWithAttributeQuery(sfq2, aq, true);
margaretha24d2d012016-04-13 18:43:30 +0200877
margaretha32d2bee2016-04-22 16:06:53 +0200878 kr = ki.search(aq, (short) 20);
879
880 // for (Match m : kr.getMatches()) {
881 // System.out.println(m.getStartPos() + " " + m.getEndPos());
882 // }
883 kr = ki.search(swaq2, (short) 10);
884 assertEquals((long) 2, kr.getTotalResults());
885 assertEquals(5, kr.getMatch(1).getStartPos());
886 assertEquals(7, kr.getMatch(1).getEndPos());
887
margaretha24d2d012016-04-13 18:43:30 +0200888 // Returning relations whose target has a specific attribute
margaretha362c18b2018-01-17 17:30:56 +0100889 SpanFocusQuery fqr2 =
890 new SpanFocusQuery(swaq2, srq.getTempClassNumbers());
margaretha24d2d012016-04-13 18:43:30 +0200891 fqr2.setMatchTemporaryClass(true);
892 fqr2.setRemoveTemporaryClasses(true);
893
894 kr = ki.search(fqr2, (short) 10);
margaretha32d2bee2016-04-22 16:06:53 +0200895 assertEquals((long) 2, kr.getTotalResults());
896 assertEquals(2, kr.getMatch(0).getStartPos());
897 assertEquals(7, kr.getMatch(0).getEndPos());
898 assertEquals(5, kr.getMatch(1).getStartPos());
899 assertEquals(7, kr.getMatch(1).getEndPos());
900 }
margaretha24d2d012016-04-13 18:43:30 +0200901
Akron6759b042016-04-28 01:25:00 +0200902
margaretha32d2bee2016-04-22 16:06:53 +0200903 /**
904 * Relation whose nodes have a specific attribute. Alternative
905 * query (actually used in serialization)
Eliza Margaretha6f989202016-10-14 21:48:29 +0200906 */
margaretha32d2bee2016-04-22 16:06:53 +0200907 @Test
Akron6759b042016-04-28 01:25:00 +0200908 public void testCase10b () throws IOException {
margaretha32d2bee2016-04-22 16:06:53 +0200909 ki.addDoc(createFieldDoc2());
910 ki.commit();
margaretha24d2d012016-04-13 18:43:30 +0200911
Eliza Margaretha6f989202016-10-14 21:48:29 +0200912 SpanAttributeQuery aq = new SpanAttributeQuery(
913 new SpanTermQuery(new Term("base", "@:case=accusative")), true);
margaretha32d2bee2016-04-22 16:06:53 +0200914 kr = ki.search(aq, (short) 10);
915 assertEquals((long) 3, kr.getTotalResults());
916
Eliza Margaretha6f989202016-10-14 21:48:29 +0200917 SpanRelationQuery srq = new SpanRelationQuery(
margaretha362c18b2018-01-17 17:30:56 +0100918 new SpanTermQuery(new Term("base", ">:child-of")), true,
919 RelationDirection.RIGHT);
margaretha32d2bee2016-04-22 16:06:53 +0200920 srq.setSourceClass((byte) 1);
921 srq.setTargetClass((byte) 2);
922 kr = ki.search(srq, (short) 20);
923 assertEquals((long) 13, kr.getTotalResults());
924
925 // Matching relation source node with an attribute
926 SpanWithAttributeQuery swaq = new SpanWithAttributeQuery(aq, true);
927 SpanSegmentQuery ssq = new SpanSegmentQuery(srq, swaq);
928
929 assertEquals(
930 "spanSegment({1: source:{2: target:spanRelation(base:>:child-of)}}, "
931 + "spanWithAttribute(spanAttribute(base:@:case=accusative)))",
932 ssq.toString());
933
934 kr = ki.search(ssq, (short) 10);
margaretha24d2d012016-04-13 18:43:30 +0200935 assertEquals((long) 2, kr.getTotalResults());
936 assertEquals(2, kr.getMatch(0).getStartPos());
937 assertEquals(4, kr.getMatch(0).getEndPos());
938 assertEquals(5, kr.getMatch(1).getStartPos());
939 assertEquals(7, kr.getMatch(1).getEndPos());
margaretha32d2bee2016-04-22 16:06:53 +0200940
941 // Matching relation target nodes with an attribute
942 // NOTE: swaq must be the first parameter
943 SpanFocusQuery sfq2 = new SpanFocusQuery(srq, (byte) 2);
944 sfq2.setSorted(false);
945 SpanSegmentQuery ssq2 = new SpanSegmentQuery(swaq, sfq2);
946
947 kr = ki.search(ssq2, (short) 10);
948 assertEquals((long) 2, kr.getTotalResults());
949 assertEquals(2, kr.getMatch(0).getStartPos());
950 assertEquals(7, kr.getMatch(0).getEndPos());
951 assertEquals(5, kr.getMatch(1).getStartPos());
952 assertEquals(7, kr.getMatch(1).getEndPos());
953
954 // Matching specific relation source node with an attribute
955 SpanElementQuery seq = new SpanElementQuery("base", "np");
956 swaq = new SpanWithAttributeQuery(seq, aq, true);
957 ssq = new SpanSegmentQuery(srq, swaq);
958
959 assertEquals(
960 "spanSegment({1: source:{2: target:spanRelation(base:>:child-of)}}, "
961 + "spanElementWithAttribute(<base:np />, "
962 + "spanAttribute(base:@:case=accusative)))",
963 ssq.toString());
964
965 kr = ki.search(ssq, (short) 10);
966 assertEquals((long) 2, kr.getTotalResults());
967 assertEquals(2, kr.getMatch(0).getStartPos());
968 assertEquals(4, kr.getMatch(0).getEndPos());
969 assertEquals(5, kr.getMatch(1).getStartPos());
970 assertEquals(7, kr.getMatch(1).getEndPos());
971 }
972
Akron6759b042016-04-28 01:25:00 +0200973
margaretha32d2bee2016-04-22 16:06:53 +0200974 /**
975 * Matching both relation nodes whose a specific attribute
Eliza Margaretha6f989202016-10-14 21:48:29 +0200976 */
margaretha32d2bee2016-04-22 16:06:53 +0200977 @Test
Akron6759b042016-04-28 01:25:00 +0200978 public void testCase11 () throws IOException {
margaretha32d2bee2016-04-22 16:06:53 +0200979 ki.addDoc(createFieldDoc2());
980 ki.commit();
981
Eliza Margaretha6f989202016-10-14 21:48:29 +0200982 SpanAttributeQuery aq = new SpanAttributeQuery(
983 new SpanTermQuery(new Term("base", "@:case=accusative")), true);
margaretha32d2bee2016-04-22 16:06:53 +0200984 kr = ki.search(aq, (short) 10);
985 assertEquals((long) 3, kr.getTotalResults());
986
Eliza Margaretha6f989202016-10-14 21:48:29 +0200987 SpanAttributeQuery aq2 = new SpanAttributeQuery(
988 new SpanTermQuery(new Term("base", "@:case=accusative")), true);
margaretha32d2bee2016-04-22 16:06:53 +0200989 kr = ki.search(aq2, (short) 10);
990 assertEquals((long) 3, kr.getTotalResults());
991
Eliza Margaretha6f989202016-10-14 21:48:29 +0200992 SpanRelationQuery srq = new SpanRelationQuery(
margaretha362c18b2018-01-17 17:30:56 +0100993 new SpanTermQuery(new Term("base", ">:child-of")), true,
994 RelationDirection.RIGHT);
margaretha32d2bee2016-04-22 16:06:53 +0200995 srq.setSourceClass((byte) 1);
996 srq.setTargetClass((byte) 2);
997 kr = ki.search(srq, (short) 20);
998 assertEquals((long) 13, kr.getTotalResults());
Akron6759b042016-04-28 01:25:00 +0200999
margaretha32d2bee2016-04-22 16:06:53 +02001000 SpanWithAttributeQuery swaq1 = new SpanWithAttributeQuery(aq, true);
1001 SpanWithAttributeQuery swaq2 = new SpanWithAttributeQuery(aq2, true);
1002
1003 kr = ki.search(swaq1, (short) 10);
1004 assertEquals((long) 3, kr.getTotalResults());
1005
margaretha362c18b2018-01-17 17:30:56 +01001006 SpanRelationMatchQuery srmq =
1007 new SpanRelationMatchQuery(srq, swaq1, swaq2, true);
margaretha32d2bee2016-04-22 16:06:53 +02001008 assertEquals(
1009 "focus(#[1,2]spanSegment(spanWithAttribute(spanAttribute(base:@:case=accusative)), "
1010 + "focus(#2: spanSegment({1: source:{2: target:spanRelation(base:>:child-of)}}, "
Akrona26184e2018-12-05 15:37:34 +01001011 + "spanWithAttribute(spanAttribute(base:@:case=accusative))),sorting)),sorting)",
margaretha32d2bee2016-04-22 16:06:53 +02001012 srmq.toString());
1013 kr = ki.search(srmq, (short) 10);
1014 assertEquals((long) 1, kr.getTotalResults());
1015 assertEquals(2, kr.getMatch(0).getStartPos());
1016 assertEquals(7, kr.getMatch(0).getEndPos());
margarethaf70addb2015-04-27 13:17:18 +02001017 }
margarethac44b2282016-04-26 16:40:01 +02001018
Akron700c1eb2015-09-25 16:57:30 +02001019}