| Eliza Margaretha | 269e5a6 | 2014-09-30 16:58:23 +0000 | [diff] [blame] | 1 | package de.ids_mannheim.korap.query; |
| 2 | |
| margaretha | 416394c | 2021-11-22 16:30:22 +0100 | [diff] [blame] | 3 | import static org.junit.Assert.assertEquals; |
| 4 | import static org.junit.Assert.assertFalse; |
| 5 | import static org.junit.Assert.assertNull; |
| 6 | import static org.junit.Assert.assertTrue; |
| 7 | import static org.junit.Assert.fail; |
| Nils Diewald | 164f8be | 2014-02-13 02:43:16 +0000 | [diff] [blame] | 8 | |
| Nils Diewald | 164f8be | 2014-02-13 02:43:16 +0000 | [diff] [blame] | 9 | import org.junit.Test; |
| Nils Diewald | 164f8be | 2014-02-13 02:43:16 +0000 | [diff] [blame] | 10 | import org.junit.runner.RunWith; |
| 11 | import org.junit.runners.JUnit4; |
| 12 | |
| margaretha | 416394c | 2021-11-22 16:30:22 +0100 | [diff] [blame] | 13 | import de.ids_mannheim.korap.query.wrap.SpanClassQueryWrapper; |
| 14 | import de.ids_mannheim.korap.query.wrap.SpanRepetitionQueryWrapper; |
| 15 | import de.ids_mannheim.korap.query.wrap.SpanSequenceQueryWrapper; |
| 16 | import de.ids_mannheim.korap.util.QueryException; |
| 17 | |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 18 | |
| 19 | /** |
| 20 | * @author margaretha, diewald |
| 21 | */ |
| Nils Diewald | 164f8be | 2014-02-13 02:43:16 +0000 | [diff] [blame] | 22 | @RunWith(JUnit4.class) |
| 23 | public class TestSpanSequenceQuery { |
| 24 | |
| 25 | @Test |
| Nils Diewald | be5943e | 2014-10-21 19:35:34 +0000 | [diff] [blame] | 26 | public void spanSequenceQuery () throws QueryException { |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 27 | SpanSequenceQueryWrapper sssq = new SpanSequenceQueryWrapper("field"); |
| 28 | assertNull(sssq.toQuery()); |
| 29 | assertFalse(sssq.hasConstraints()); |
| Nils Diewald | 164f8be | 2014-02-13 02:43:16 +0000 | [diff] [blame] | 30 | |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 31 | sssq.append("a").append("b"); |
| 32 | assertEquals("spanNext(field:a, field:b)", sssq.toQuery().toString()); |
| 33 | assertFalse(sssq.hasConstraints()); |
| Nils Diewald | 164f8be | 2014-02-13 02:43:16 +0000 | [diff] [blame] | 34 | |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 35 | sssq.append("c"); |
| Eliza Margaretha | 6f98920 | 2016-10-14 21:48:29 +0200 | [diff] [blame] | 36 | assertEquals("spanNext(spanNext(field:a, field:b), field:c)", |
| 37 | sssq.toQuery().toString()); |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 38 | assertFalse(sssq.hasConstraints()); |
| Nils Diewald | 164f8be | 2014-02-13 02:43:16 +0000 | [diff] [blame] | 39 | |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 40 | sssq = new SpanSequenceQueryWrapper("field"); |
| 41 | sssq.append("a"); |
| 42 | assertEquals("field:a", sssq.toQuery().toString()); |
| 43 | assertFalse(sssq.hasConstraints()); |
| Nils Diewald | 164f8be | 2014-02-13 02:43:16 +0000 | [diff] [blame] | 44 | |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 45 | sssq.append("b"); |
| 46 | assertEquals("spanNext(field:a, field:b)", sssq.toQuery().toString()); |
| 47 | assertFalse(sssq.hasConstraints()); |
| Nils Diewald | 164f8be | 2014-02-13 02:43:16 +0000 | [diff] [blame] | 48 | |
| Nils Diewald | bb33da2 | 2015-03-04 16:24:25 +0000 | [diff] [blame] | 49 | sssq.withConstraint(2, 3); |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 50 | assertTrue(sssq.hasConstraints()); |
| Nils Diewald | 164f8be | 2014-02-13 02:43:16 +0000 | [diff] [blame] | 51 | |
| Nils Diewald | bb33da2 | 2015-03-04 16:24:25 +0000 | [diff] [blame] | 52 | assertEquals( |
| 53 | "spanDistance(field:a, field:b, [(w[2:3], ordered, notExcluded)])", |
| 54 | sssq.toQuery().toString()); |
| Nils Diewald | 164f8be | 2014-02-13 02:43:16 +0000 | [diff] [blame] | 55 | |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 56 | sssq.append("c"); |
| Nils Diewald | bb33da2 | 2015-03-04 16:24:25 +0000 | [diff] [blame] | 57 | assertEquals( |
| 58 | "spanDistance(spanDistance(field:a, field:b, [(w[2:3], ordered, notExcluded)]), field:c, [(w[2:3], ordered, notExcluded)])", |
| 59 | sssq.toQuery().toString()); |
| 60 | sssq.withConstraint(6, 8, "s"); |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 61 | assertTrue(sssq.hasConstraints()); |
| Nils Diewald | 164f8be | 2014-02-13 02:43:16 +0000 | [diff] [blame] | 62 | |
| Nils Diewald | bb33da2 | 2015-03-04 16:24:25 +0000 | [diff] [blame] | 63 | assertEquals( |
| 64 | "spanMultipleDistance(spanMultipleDistance(field:a, field:b, [(w[2:3], ordered, notExcluded), (s[6:8], ordered, notExcluded)]), field:c, [(w[2:3], ordered, notExcluded), (s[6:8], ordered, notExcluded)])", |
| 65 | sssq.toQuery().toString()); |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 66 | }; |
| 67 | |
| Nils Diewald | bb33da2 | 2015-03-04 16:24:25 +0000 | [diff] [blame] | 68 | |
| Akron | 1533707 | 2017-01-13 19:02:35 +0100 | [diff] [blame] | 69 | @Test |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 70 | public void spanSequenceQueryWrapper () throws QueryException { |
| 71 | |
| 72 | SpanSequenceQueryWrapper ssqw, ssqw2; |
| 73 | SpanRepetitionQueryWrapper srqw; |
| 74 | SpanClassQueryWrapper scqw; |
| 75 | |
| 76 | // Synopsis 1 |
| Nils Diewald | bb33da2 | 2015-03-04 16:24:25 +0000 | [diff] [blame] | 77 | ssqw = new SpanSequenceQueryWrapper("tokens", "der", "Baum"); |
| Eliza Margaretha | 6f98920 | 2016-10-14 21:48:29 +0200 | [diff] [blame] | 78 | assertEquals("spanNext(tokens:der, tokens:Baum)", |
| 79 | ssqw.toQuery().toString()); |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 80 | |
| 81 | // Synopsis 2 |
| 82 | ssqw = new SpanSequenceQueryWrapper("tokens"); |
| 83 | ssqw.append("der").append("Baum"); |
| Eliza Margaretha | 6f98920 | 2016-10-14 21:48:29 +0200 | [diff] [blame] | 84 | assertEquals("spanNext(tokens:der, tokens:Baum)", |
| 85 | ssqw.toQuery().toString()); |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 86 | |
| 87 | // Append a sequence |
| 88 | ssqw = new SpanSequenceQueryWrapper("tokens"); |
| 89 | ssqw2 = new SpanSequenceQueryWrapper("tokens"); |
| 90 | ssqw.append("der").append("Baum"); |
| 91 | ssqw2.append("fiel").append("still"); |
| 92 | ssqw.append(ssqw2); |
| 93 | // This may not be final |
| 94 | assertEquals( |
| Nils Diewald | bb33da2 | 2015-03-04 16:24:25 +0000 | [diff] [blame] | 95 | "spanNext(spanNext(spanNext(tokens:der, tokens:Baum), tokens:fiel), tokens:still)", |
| 96 | ssqw.toQuery().toString()); |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 97 | |
| 98 | // Synopsis 3 |
| 99 | ssqw = new SpanSequenceQueryWrapper("tokens", "Baum"); |
| 100 | ssqw.prepend("der"); |
| Eliza Margaretha | 6f98920 | 2016-10-14 21:48:29 +0200 | [diff] [blame] | 101 | assertEquals("spanNext(tokens:der, tokens:Baum)", |
| 102 | ssqw.toQuery().toString()); |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 103 | |
| 104 | // Prepend a sequence |
| 105 | ssqw = new SpanSequenceQueryWrapper("tokens"); |
| 106 | ssqw2 = new SpanSequenceQueryWrapper("tokens"); |
| 107 | ssqw.append("fiel").append("still"); |
| 108 | ssqw2.append("der").append("Baum"); |
| 109 | ssqw.prepend(ssqw2); |
| 110 | |
| 111 | // This may change |
| 112 | assertEquals( |
| Nils Diewald | bb33da2 | 2015-03-04 16:24:25 +0000 | [diff] [blame] | 113 | "spanNext(spanNext(spanNext(tokens:der, tokens:Baum), tokens:fiel), tokens:still)", |
| 114 | ssqw.toQuery().toString()); |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 115 | |
| 116 | // Add constraint |
| Nils Diewald | bb33da2 | 2015-03-04 16:24:25 +0000 | [diff] [blame] | 117 | ssqw.withConstraint(2, 4); |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 118 | // This may change |
| Eliza Margaretha | 6f98920 | 2016-10-14 21:48:29 +0200 | [diff] [blame] | 119 | assertEquals( |
| 120 | "spanDistance(spanDistance(spanDistance(tokens:der, " |
| 121 | + "tokens:Baum, [(w[2:4], ordered, notExcluded)]), " |
| 122 | + "tokens:fiel, [(w[2:4], ordered, notExcluded)]), " |
| 123 | + "tokens:still, [(w[2:4], ordered, notExcluded)])", |
| 124 | ssqw.toQuery().toString()); |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 125 | |
| 126 | ssqw = new SpanSequenceQueryWrapper("tokens", "der", "Baum") |
| Nils Diewald | bb33da2 | 2015-03-04 16:24:25 +0000 | [diff] [blame] | 127 | .withConstraint(1, 1); |
| Eliza Margaretha | 6f98920 | 2016-10-14 21:48:29 +0200 | [diff] [blame] | 128 | assertEquals("spanNext(tokens:der, tokens:Baum)", |
| 129 | ssqw.toQuery().toString()); |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 130 | |
| Nils Diewald | bb33da2 | 2015-03-04 16:24:25 +0000 | [diff] [blame] | 131 | ssqw = new SpanSequenceQueryWrapper("tokens", "der", "Baum") |
| 132 | .withConstraint(1, 2, "s"); |
| 133 | assertEquals( |
| 134 | "spanElementDistance(tokens:der, tokens:Baum, [(s[1:2], ordered, notExcluded)])", |
| 135 | ssqw.toQuery().toString()); |
| 136 | |
| 137 | ssqw = new SpanSequenceQueryWrapper("tokens", "der", "Baum") |
| 138 | .withConstraint(1, 2, "s").withConstraint(2, 3, "x"); |
| Eliza Margaretha | 6f98920 | 2016-10-14 21:48:29 +0200 | [diff] [blame] | 139 | assertEquals( |
| 140 | "spanMultipleDistance(tokens:der, tokens:Baum, " |
| 141 | + "[(s[1:2], ordered, notExcluded), " |
| 142 | + "(x[2:3], ordered, notExcluded)])", |
| 143 | ssqw.toQuery().toString()); |
| Nils Diewald | bb33da2 | 2015-03-04 16:24:25 +0000 | [diff] [blame] | 144 | |
| 145 | ssqw = new SpanSequenceQueryWrapper("tokens").append("Baum") |
| 146 | .prepend("der").withConstraint(1, 2, "s", true) |
| 147 | .withConstraint(2, 3, "x"); |
| Eliza Margaretha | 6f98920 | 2016-10-14 21:48:29 +0200 | [diff] [blame] | 148 | assertEquals( |
| 149 | "spanMultipleDistance(tokens:der, " |
| 150 | + "tokens:Baum, [(s[1:2], ordered, excluded), " |
| 151 | + "(x[2:3], ordered, notExcluded)])", |
| 152 | ssqw.toQuery().toString()); |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 153 | |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 154 | // Support empty class ins sequence |
| 155 | ssqw = new SpanSequenceQueryWrapper("field", "Der"); |
| 156 | srqw = new SpanRepetitionQueryWrapper(); |
| 157 | scqw = new SpanClassQueryWrapper(srqw, (short) 3); |
| 158 | ssqw.append(scqw); |
| Akron | 1533707 | 2017-01-13 19:02:35 +0100 | [diff] [blame] | 159 | assertEquals("focus(254: spanContain(<field:base/s:t />, {254: spanExpansion(field:Der, []{1, 1}, right, class:3)}))", |
| 160 | ssqw.toQuery().toString()); |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 161 | |
| 162 | // Support empty class ins sequence |
| 163 | ssqw = new SpanSequenceQueryWrapper("field"); |
| 164 | srqw = new SpanRepetitionQueryWrapper(); |
| 165 | ssqw.append(srqw); |
| 166 | scqw = new SpanClassQueryWrapper(ssqw, (short) 2); |
| 167 | try { |
| 168 | scqw.toQuery(); |
| 169 | } |
| 170 | catch (Exception e) { |
| Nils Diewald | a14ecd6 | 2015-02-26 21:00:20 +0000 | [diff] [blame] | 171 | fail(e.getMessage() + " (Known issue)"); |
| Nils Diewald | 0cc4f2e | 2015-01-30 20:13:08 +0000 | [diff] [blame] | 172 | }; |
| Nils Diewald | 164f8be | 2014-02-13 02:43:16 +0000 | [diff] [blame] | 173 | }; |
| 174 | }; |