| package de.ids_mannheim.korap.query; |
| |
| import java.util.*; |
| import java.io.*; |
| import static de.ids_mannheim.korap.TestSimple.*; |
| |
| import org.apache.lucene.search.spans.SpanQuery; |
| import de.ids_mannheim.korap.query.wrap.SpanQueryWrapper; |
| |
| import de.ids_mannheim.korap.KrillQuery; |
| import de.ids_mannheim.korap.query.QueryBuilder; |
| import de.ids_mannheim.korap.util.QueryException; |
| |
| import static org.junit.Assert.*; |
| import org.junit.Test; |
| import org.junit.Ignore; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.JUnit4; |
| |
| @RunWith(JUnit4.class) |
| public class TestKrillQueryJSON { |
| |
| @Test |
| public void queryJSONBsp1 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp1.jsonld").getFile()); |
| |
| // There is a repetition in here |
| // ([base=foo]|[base=bar])[base=foobar] |
| assertEquals(sqwi.toQuery().toString(), |
| "spanOr([tokens:base:foo, spanRepetition(spanNext(tokens:base:foo, tokens:base:bar){1,100})])"); |
| assertTrue(sqwi.isOptional()); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp1Disjunction () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp1c.jsonld").getFile()); |
| |
| // There is a repetition in here |
| // ([base=foo]|[base=bar])[base=foobar] |
| assertEquals(sqwi.toQuery().toString(), |
| "spanOr([tokens:base:foo, spanRepetition(spanNext(tokens:base:foo, tokens:base:bar){1,100})])"); |
| assertTrue(sqwi.isOptional()); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp1b () throws QueryException { |
| |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp1b.jsonld").getFile()); |
| |
| // [base=foo]|([base=foo][base=bar]) meta author=Goethe&year=1815 |
| assertEquals(sqwi.toQuery().toString(), |
| "spanOr([tokens:mate/l:foo, spanNext(tokens:mate/l:foo, tokens:mate/l:bar)])"); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp2 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp2.jsonld").getFile()); |
| |
| // ([base=foo]|[base=bar])[base=foobar] |
| assertEquals(sqwi.toQuery().toString(), |
| "spanNext(spanOr([tokens:mate/l:foo, tokens:mate/l:bar]), tokens:mate/l:foobar)"); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp3 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp3.jsonld").getFile()); |
| |
| // focus({[base=Mann]}) |
| assertEquals(sqwi.toQuery().toString(), |
| "focus(1: {1: tokens:mate/l:Mann})"); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp4 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp4.jsonld").getFile()); |
| |
| // focus({[base=foo]}[orth=bar]) |
| assertEquals(sqwi.toQuery().toString(), |
| "focus(1: spanNext({1: tokens:mate/l:foo}, tokens:s:bar))"); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp5 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp5.jsonld").getFile()); |
| |
| // focus(1:[base=Der]{1:[base=Mann]}) |
| assertEquals(sqwi.toQuery().toString(), |
| "focus(1: spanNext(tokens:mate/l:Der, {1: tokens:mate/l:Mann}))"); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp6 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp6.jsonld").getFile()); |
| |
| // [base=katze] |
| assertEquals(sqwi.toQuery().toString(), "tokens:mate/l:Katze"); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp7 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp7.jsonld").getFile()); |
| |
| // [!base=Katze] |
| assertEquals("tokens:mate/l:Katze", sqwi.toQuery().toString()); |
| assertTrue(sqwi.isNegative()); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp9 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp9.jsonld").getFile()); |
| |
| // [base=Katze&orth=Katzen] |
| assertEquals(sqwi.toQuery().toString(), |
| "spanSegment(tokens:mate/l:Katze, tokens:s:Katzen)"); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp9b () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp9b.jsonld").getFile()); |
| |
| // [base=Katze&orth=Katzen] |
| assertEquals(sqwi.toQuery().toString(), |
| "spanSegment(tokens:mate/m:number:pl, tokens:tt/p:NN)"); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp10 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp10.jsonld").getFile()); |
| |
| // [base=Katze][orth=und][orth=Hunde] |
| assertEquals(sqwi.toQuery().toString(), |
| "spanNext(spanNext(tokens:mate/l:Katze, tokens:s:und), tokens:s:Hunde)"); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp11 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp11.jsonld").getFile()); |
| |
| // [base!=Katze | orth!=Katzen] |
| /* |
| Imagine a([^b]|[^c])d |
| Matches abd and acd |
| Interpretation would be not(spanAnd(...)) |
| */ |
| assertEquals(sqwi.toQuery().toString(), |
| "spanOr([tokens:mate/l:Katze, tokens:s:Katzen])"); |
| assertTrue(sqwi.isNegative()); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp12 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp12.jsonld").getFile()); |
| |
| // contains(<np>,[base=Mann]) |
| assertEquals(sqwi.toQuery().toString(), |
| "spanContain(<tokens:np />, tokens:mate/l:Mann)"); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp13 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp13.jsonld").getFile()); |
| |
| assertEquals(sqwi.toQuery().toString(), |
| "spanStartsWith(<tokens:np />, tokens:p:Det)"); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp13b () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp13b.jsonld").getFile()); |
| |
| // startswith(<np>,[pos=Det]) |
| assertEquals(sqwi.toQuery().toString(), |
| "spanStartsWith(<tokens:np />, tokens:mate/p:Det)"); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp14 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp14.jsonld").getFile()); |
| |
| // 'vers{2,3}uch' |
| assertEquals(sqwi.toQuery().toString(), |
| "SpanMultiTermQueryWrapper(tokens:/s:vers{2,3}uch/)"); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp15 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp15.jsonld").getFile()); |
| |
| // [orth='vers.*ch'] |
| assertEquals(sqwi.toQuery().toString(), |
| "SpanMultiTermQueryWrapper(tokens:/s:vers.*ch/)"); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp16 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp16.jsonld").getFile()); |
| |
| // [(base=bar|base=foo)&orth=foobar] |
| assertEquals(sqwi.toQuery().toString(), |
| "spanSegment(spanOr([tokens:mate/l:bar, tokens:mate/l:foo]), tokens:s:foobar)"); |
| }; |
| |
| |
| @Test |
| public void queryJSONBsp17 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp17.jsonld").getFile()); |
| |
| // within(<np>,[base=Mann]) |
| assertEquals(sqwi.toQuery().toString(), |
| "spanContain(<tokens:np />, tokens:mate/l:Mann)"); |
| }; |
| |
| |
| @Test |
| public void queryJSONDemo () throws QueryException { |
| SpanQueryWrapper sqwi = new KrillQuery("tokens").fromKoral( |
| "{ \"query\" : { \"@type\" : \"koral:token\", \"wrap\" : { \"@type\" : \"koral:term\", \"foundry\" : \"base\", \"layer\" : \"p\", \"key\" : \"foo\", \"match\" : \"match:eq\" }}}"); |
| |
| assertEquals(sqwi.toQuery().toString(), "tokens:base/p:foo"); |
| }; |
| |
| |
| @Test |
| public void queryJSONBspClass () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bsp-class.jsonld").getFile()); |
| |
| // within(<np>,[base=Mann]) |
| assertEquals(sqwi.toQuery().toString(), |
| "{1: spanNext(tokens:tt/p:ADJA, tokens:mate/p:NN)}"); |
| }; |
| |
| |
| @Test |
| public void queryJSONcosmas3 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/cosmas3.json").getFile()); |
| |
| // "das /+w1:3 Buch" |
| assertEquals(sqwi.toQuery().toString(), |
| "spanDistance(tokens:s:das, tokens:s:Buch, [(w[1:3], ordered, notExcluded)])"); |
| }; |
| |
| |
| @Test |
| public void queryJSONcosmas4 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/cosmas4.json").getFile()); |
| |
| // "das /+w1:3,s1:1 Buch" |
| assertEquals(sqwi.toQuery().toString(), |
| "spanMultipleDistance(tokens:s:das, tokens:s:Buch, [(w[1:3], ordered, notExcluded), (base/s:s[1:1], ordered, notExcluded)])"); |
| }; |
| |
| |
| @Test |
| public void queryJSONcosmas4b () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/cosmas4b.json").getFile()); |
| |
| // "das /+w1:3,s1 Buch" |
| assertEquals(sqwi.toQuery().toString(), |
| "spanMultipleDistance(tokens:s:das, tokens:s:Buch, [(w[1:3], ordered, notExcluded), (base/s:s[0:1], ordered, notExcluded)])"); |
| }; |
| |
| |
| @Test |
| public void queryJSONcosmas10 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/cosmas10.json").getFile()); |
| |
| // "Institut für $deutsche Sprache" |
| assertEquals(sqwi.toQuery().toString(), |
| "spanNext(spanNext(spanNext(tokens:s:Institut, tokens:s:für), tokens:i:deutsche), tokens:s:Sprache)"); |
| }; |
| |
| |
| @Test |
| public void queryJSONcosmas10b () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/cosmas10b.json").getFile()); |
| |
| // "Institut $FÜR $deutsche Sprache" |
| assertEquals(sqwi.toQuery().toString(), |
| "spanNext(spanNext(spanNext(tokens:s:Institut, tokens:i:für), tokens:i:deutsche), tokens:s:Sprache)"); |
| }; |
| |
| |
| @Test |
| public void queryJSONcosmas16 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/cosmas16.json").getFile()); |
| |
| // "$wegen #IN(L) <s>" |
| assertEquals(sqwi.toQuery().toString(), |
| "focus(1: spanStartsWith(<tokens:s />, {1: tokens:i:wegen}))"); |
| }; |
| |
| |
| @Test |
| public void queryJSONcosmas17 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/cosmas17.json").getFile()); |
| |
| // "#BED($wegen , +sa)" |
| assertEquals(sqwi.toQuery().toString(), |
| "spanStartsWith(<tokens:s />, tokens:i:wegen)"); |
| }; |
| |
| |
| @Test |
| public void queryJSONcosmas20 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/cosmas20.json").getFile()); |
| |
| // "MORPH(V) #IN(R) #ELEM(S)" |
| assertEquals(sqwi.toQuery().toString(), |
| "focus(1: spanEndsWith(<tokens:s />, {1: tokens:p:V}))"); |
| }; |
| |
| |
| @Test |
| public void queryJSONrepetition () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery(getClass() |
| .getResource("/queries/bsp-repetition.jsonld").getFile()); |
| |
| // der[cnx/p=A]{0,2}[tt/p=NN] |
| assertEquals(sqwi.toQuery().toString(), |
| "spanNext(tokens:s:der, spanOr([tokens:tt/p:NN, spanNext(spanRepetition(tokens:cnx/p:A{1,2}), tokens:tt/p:NN)]))"); |
| }; |
| |
| |
| @Test |
| public void queryJSONboundaryBug () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery(getClass() |
| .getResource("/queries/bsp-boundary.jsonld").getFile()); |
| |
| // Tal []{1,} Wald |
| assertEquals(sqwi.toQuery().toString(), |
| "spanDistance(tokens:s:Tal, tokens:s:Wald, [(w[2:101], ordered, notExcluded)])"); |
| }; |
| |
| |
| @Test |
| public void queryJSONcosmasBoundaryBug () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery(getClass() |
| .getResource("/queries/bugs/cosmas_boundary.jsonld").getFile()); |
| |
| // Namen /s1 Leben |
| assertEquals(sqwi.toQuery().toString(), |
| "focus(129: spanElementDistance({129: tokens:s:Namen}, {129: tokens:s:Leben}, [(base/s:s[0:1], notOrdered, notExcluded)]))"); |
| }; |
| |
| |
| @Test |
| public void queryJSONfoundryForOrthBug () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/bugs/foundry_for_orth.jsonld") |
| .getFile()); |
| |
| // opennlp/orth:Baum |
| assertEquals(sqwi.toQuery().toString(), "tokens:s:Baum"); |
| }; |
| |
| |
| @Test |
| public void queryJSONfoundryForOrthBug2 () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery(getClass() |
| .getResource("/queries/bugs/foundry_for_orth_2.jsonld") |
| .getFile()); |
| |
| // baum/i |
| assertEquals(sqwi.toQuery().toString(), "tokens:i:baum"); |
| }; |
| |
| |
| @Test |
| public void queryJSONunderspecifiedTokenBug () { |
| // ((MORPH(APPR) ODER MORPH(APPRART)) /+w1 Urlaub |
| try { |
| String json = getJsonString(getClass() |
| .getResource("/queries/bugs/underspecified_token.jsonld") |
| .getFile()); |
| new KrillQuery("tokens").fromKoral(json); |
| } |
| catch (QueryException e) { |
| assertEquals(701, e.getErrorCode()); |
| }; |
| }; |
| |
| |
| @Test |
| public void queryJSONspecialLayerBug () throws QueryException { |
| SpanQueryWrapper sqwi = getJsonQuery(getClass() |
| .getResource("/queries/bugs/special_layer.jsonld").getFile()); |
| assertEquals(sqwi.toQuery().toString(), |
| "spanNext(spanNext(spanNext(tokens:s:Baum, tokens:cnx/p:CC), tokens:tt/l:Baum), <tokens:xip/c:MC />)"); |
| }; |
| |
| |
| @Test |
| public void queryJSONrepetitionGroupRewriteBug () throws QueryException { |
| // ([cnx/p="A"][]){2} |
| SpanQueryWrapper sqwi = getJsonQuery(getClass() |
| .getResource("/queries/bugs/repetition_group_rewrite.jsonld") |
| .getFile()); |
| |
| assertEquals(sqwi.toQuery().toString(), |
| "spanRepetition(spanExpansion(SpanMultiTermQueryWrapper(tokens:/cnx/p:A/), []{1, 1}, right){2,2})"); |
| }; |
| |
| |
| @Test |
| public void queryJSONoverlapsFrameWorkaround () throws QueryException { |
| // overlaps(<s>,[tt/p=CARD][tt/p="N.*"]) |
| SpanQueryWrapper sqwi = getJsonQuery(getClass() |
| .getResource("/queries/bugs/overlaps_frame_workaround.jsonld") |
| .getFile()); |
| |
| assertEquals(sqwi.toQuery().toString(), |
| "spanOverlap(<tokens:s />, spanNext(tokens:tt/p:CARD, SpanMultiTermQueryWrapper(tokens:/tt/p:N.*/)))"); |
| }; |
| |
| |
| @Test |
| public void queryJSONflags1 () throws QueryException { |
| // buchstabe/i |
| SpanQueryWrapper sqwi = getJsonQuery( |
| getClass().getResource("/queries/flags/caseInsensitive.jsonld") |
| .getFile()); |
| |
| assertEquals(sqwi.toQuery().toString(), "tokens:i:buchstabe"); |
| }; |
| |
| |
| @Test |
| public void queryJSONspanWrapDeserializationBug () throws QueryException { |
| // contains(<s>, Erde []* Sonne) |
| SpanQueryWrapper sqwi = getJsonQuery(getClass() |
| .getResource("/queries/bugs/unspecified_key_bug.jsonld") |
| .getFile()); |
| |
| assertEquals(sqwi.toQuery().toString(), |
| "spanContain(<tokens:s />, spanDistance(tokens:s:Erde, tokens:s:Sonne, [(w[1:101], ordered, notExcluded)]))"); |
| }; |
| |
| |
| @Test |
| public void queryJSONflags2 () throws QueryException { |
| // buchstabe/i |
| try { |
| String json = getJsonString(getClass() |
| .getResource("/queries/flags/unknown1.jsonld").getFile()); |
| KrillQuery kq = new KrillQuery("tokens"); |
| assertEquals(kq.fromKoral(json).toQuery().toString(), |
| "tokens:s:buchstabe"); |
| assertEquals(kq.getWarning(0).getCode(), 748); |
| |
| json = getJsonString(getClass() |
| .getResource("/queries/flags/unknown2.jsonld").getFile()); |
| kq = new KrillQuery("tokens"); |
| assertEquals(kq.fromKoral(json).toQuery().toString(), |
| "tokens:i:buchstabe"); |
| assertEquals(kq.getWarning(0).getCode(), 748); |
| |
| json = getJsonString(getClass() |
| .getResource("/queries/flags/unknown3.jsonld").getFile()); |
| kq = new KrillQuery("tokens"); |
| assertEquals(kq.fromKoral(json).toQuery().toString(), |
| "tokens:i:buchstabe"); |
| assertEquals(kq.getWarning(0).getCode(), 748); |
| |
| } |
| catch (QueryException e) { |
| fail(e.getMessage()); |
| }; |
| }; |
| |
| |
| @Test |
| public void queryJSONelement () throws QueryException { |
| // <base/s=s> |
| try { |
| String json = getJsonString(getClass() |
| .getResource("/queries/element/simple-element.jsonld") |
| .getFile()); |
| KrillQuery kq = new KrillQuery("tokens"); |
| |
| assertEquals(kq.fromKoral(json).toQuery().toString(), |
| "<tokens:base/s:s />"); |
| } |
| catch (QueryException e) { |
| fail(e.getMessage()); |
| }; |
| }; |
| |
| |
| @Test |
| public void queryJSONinfiniteExpansion () throws QueryException { |
| // der []* |
| try { |
| String json = getJsonString(getClass() |
| .getResource("/queries/bugs/expansion_bug_3.jsonld") |
| .getFile()); |
| KrillQuery kq = new KrillQuery("tokens"); |
| |
| assertEquals(kq.fromKoral(json).toQuery().toString(), |
| "focus(254: spanContain(<tokens:base/s:t />, {254: spanExpansion(tokens:s:c, []{0, 4}, right)}))"); |
| } |
| catch (QueryException e) { |
| fail(e.getMessage()); |
| }; |
| }; |
| |
| |
| @Test |
| public void queryJSONcomplexSpanOrTerm () throws QueryException { |
| // startsWith(<base/s=s>, { lassen | laufen }) |
| try { |
| String json = getJsonString(getClass() |
| .getResource("/queries/bugs/span_or_bug.jsonld").getFile()); |
| KrillQuery kq = new KrillQuery("tokens"); |
| |
| assertEquals(kq.fromKoral(json).toQuery().toString(), |
| "spanStartsWith(<tokens:base/s:s />, spanOr([tokens:s:Er, tokens:s:Sie]))"); |
| } |
| catch (QueryException e) { |
| fail(e.getMessage()); |
| }; |
| }; |
| |
| |
| @Test |
| public void queryJSONdistancesWithRegexes () throws QueryException { |
| // "der" []{2,3} [opennlp/p="NN"] |
| try { |
| String json = getJsonString(getClass() |
| .getResource( |
| "/queries/bugs/distances_with_regex_bug.jsonld") |
| .getFile()); |
| KrillQuery kq = new KrillQuery("tokens"); |
| |
| assertEquals(kq.fromKoral(json).toQuery().toString(), |
| "spanDistance(SpanMultiTermQueryWrapper(tokens:/s:der/), SpanMultiTermQueryWrapper(tokens:/opennlp/p:NN/), [(w[3:4], ordered, notExcluded)])"); |
| } |
| catch (QueryException e) { |
| fail(e.getMessage()); |
| }; |
| }; |
| |
| |
| @Test |
| public void queryJSONregexRewrite1 () throws QueryException { |
| // "der" [.+?] |
| String json = getJsonString(getClass() |
| .getResource("/queries/sequence/regex-rewrite-1.jsonld") |
| .getFile()); |
| KrillQuery kq = new KrillQuery("tokens"); |
| |
| assertEquals(kq.fromKoral(json).toQuery().toString(), |
| "focus(254: spanContain(<tokens:base/s:t />, {254: spanExpansion(tokens:s:der, []{1, 1}, right)}))"); |
| }; |
| |
| |
| @Test |
| public void queryJSONmerge () throws QueryException { |
| // treat merging gracefully |
| String json = getJsonString(getClass() |
| .getResource("/queries/merge.jsonld") |
| .getFile()); |
| KrillQuery kq = new KrillQuery("tokens"); |
| assertEquals(kq.fromKoral(json).toQuery().toString(), |
| "spanNext(tokens:s:der, tokens:s:Baum)"); |
| assertEquals(kq.getWarning(0).getCode(), 774); |
| }; |
| }; |