blob: 7e1442f653907454c8195698a74a011fe328b0e0 [file] [log] [blame]
package de.ids_mannheim.korap.search;
import java.util.*;
import java.io.*;
import java.net.URLDecoder;
import org.apache.lucene.search.spans.SpanQuery;
import de.ids_mannheim.korap.KrillIndex;
import de.ids_mannheim.korap.KrillQuery;
import de.ids_mannheim.korap.response.Result;
import de.ids_mannheim.korap.Krill;
import de.ids_mannheim.korap.response.Match;
import de.ids_mannheim.korap.query.QueryBuilder;
import de.ids_mannheim.korap.index.FieldDocument;
import de.ids_mannheim.korap.util.QueryException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.JsonNode;
import static de.ids_mannheim.korap.Test.*;
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 TestResult {
@Test
public void checkJSONResult () throws Exception {
KrillIndex ki = new KrillIndex();
FieldDocument fd = new FieldDocument();
fd.addString("ID", "doc-1");
fd.addString("UID", "1");
fd.addTV("base", "abab",
"[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]" + "[(1-2)s:b|i:b|_1#1-2]"
+ "[(2-3)s:a|i:c|_2#2-3]" + "[(3-4)s:b|i:a|_3#3-4]");
ki.addDoc(fd);
fd = new FieldDocument();
fd.addString("ID", "doc-2");
fd.addString("UID", "2");
fd.addTV("base", "aba", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]"
+ "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]");
ki.addDoc(fd);
// Commit!
ki.commit();
QueryBuilder kq = new QueryBuilder("base");
SpanQuery q = (SpanQuery) kq.or(kq._(1, kq.seg("s:a")))
.or(kq._(2, kq.seg("s:b"))).toQuery();
Result kr = ki.search(q);
assertEquals((long) 7, kr.getTotalResults());
ObjectMapper mapper = new ObjectMapper();
JsonNode res = mapper.readTree(kr.toJsonString());
assertEquals(7, res.at("/meta/totalResults").asInt());
assertEquals("spanOr([{1: base:s:a}, {2: base:s:b}])",
res.at("/meta/serialQuery").asText());
assertEquals(0, res.at("/startIndex").asInt());
assertEquals(25, res.at("/meta/itemsPerPage").asInt());
assertEquals("token", res.at("/meta/context/left/0").asText());
assertEquals(6, res.at("/meta/context/left/1").asInt());
assertEquals("token", res.at("/meta/context/right/0").asText());
assertEquals(6, res.at("/meta/context/right/1").asInt());
assertEquals("base", res.at("/matches/0/field").asText());
/*
Probably a Jackson bug
assertTrue(res.at("/matches/0/startMore").asBoolean());
assertTrue(res.at("/matches/0/endMore").asBoolean());
*/
assertEquals(1, res.at("/matches/0/UID").asInt());
assertEquals("doc-1", res.at("/matches/0/docID").asText());
assertEquals("match-doc-1-p0-1(1)0-0",
res.at("/matches/0/matchID").asText());
assertEquals(
"<span class=\"context-left\"></span><span class=\"match\"><mark><mark class=\"class-1 level-0\">a</mark></mark></span><span class=\"context-right\">bab</span>",
res.at("/matches/0/snippet").asText());
assertEquals("base", res.at("/matches/6/field").asText());
/*
Probably a Jackson bug
assertEquals(true, res.at("/matches/6/startMore").asBoolean());
assertEquals(true, res.at("/matches/6/endMore").asBoolean());
*/
assertEquals(2, res.at("/matches/6/UID").asInt());
assertEquals("doc-2", res.at("/matches/6/docID").asText());
assertEquals("match-doc-2-p2-3(1)2-2",
res.at("/matches/6/matchID").asText());
assertEquals(
"<span class=\"context-left\">ab</span><span class=\"match\"><mark><mark class=\"class-1 level-0\">a</mark></mark></span><span class=\"context-right\"></span>",
res.at("/matches/6/snippet").asText());
};
@Test
public void checkJSONResultWarningBug () throws Exception {
KrillIndex ki = new KrillIndex();
FieldDocument fd = new FieldDocument();
fd.addString("ID", "doc-1");
fd.addString("UID", "1");
fd.addTV("tokens", "abab",
"[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]" + "[(1-2)s:b|i:b|_1#1-2]"
+ "[(2-3)s:a|i:c|_2#2-3]" + "[(3-4)s:b|i:a|_3#3-4]");
ki.addDoc(fd);
ki.commit();
String json = getString(getClass()
.getResource("/queries/bugs/optionality_warning.jsonld")
.getFile());
Krill ks = new Krill(json);
Result kr = ks.apply(ki);
assertEquals((long) 2, kr.getTotalResults());
ObjectMapper mapper = new ObjectMapper();
JsonNode res = mapper.readTree(kr.toJsonString());
// Old:
// assertEquals("Optionality of query is ignored", res.at("/warning").asText());
assertEquals("Optionality of query is ignored",
res.at("/warnings/0/1").asText());
};
@Test
public void checkJSONResultForJSONInput () throws Exception {
KrillIndex ki = new KrillIndex();
FieldDocument fd = new FieldDocument();
fd.addString("ID", "doc-1");
fd.addString("UID", "1");
fd.addTV("tokens", "abab",
"[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]" + "[(1-2)s:b|i:b|_1#1-2]"
+ "[(2-3)s:a|i:c|_2#2-3]" + "[(3-4)s:b|i:a|_3#3-4]");
ki.addDoc(fd);
fd = new FieldDocument();
fd.addString("ID", "doc-2");
fd.addString("UID", "2");
fd.addTV("tokens", "aba", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]"
+ "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]");
ki.addDoc(fd);
// Commit!
ki.commit();
String json = getString(getClass()
.getResource("/queries/bsp-result-check.jsonld").getFile());
Krill ks = new Krill(json);
Result kr = ks.apply(ki);
assertEquals((long) 7, kr.getTotalResults());
ObjectMapper mapper = new ObjectMapper();
JsonNode res = mapper.readTree(kr.toJsonString());
assertEquals(7, res.at("/meta/totalResults").asInt());
assertEquals("spanOr([tokens:s:a, tokens:s:b])",
res.at("/meta/serialQuery").asText());
assertEquals(5, res.at("/meta/itemsPerPage").asInt());
assertEquals(0, res.at("/meta/startIndex").asInt());
// Request meta
// assertEquals(1, res.at("/meta/startPage").asInt());
assertEquals(5, res.at("/meta/count").asInt());
assertEquals("token", res.at("/meta/context/left/0").asText());
assertEquals(3, res.at("/meta/context/left/1").asInt());
assertEquals("char", res.at("/meta/context/right/0").asText());
assertEquals(6, res.at("/meta/context/right/1").asInt());
assertEquals("token", res.at("/meta/context/left/0").asText());
assertEquals(3, res.at("/meta/context/left/1").asInt());
assertEquals("char", res.at("/meta/context/right/0").asText());
assertEquals(6, res.at("/meta/context/right/1").asInt());
// Query
assertEquals("koral:group", res.at("/query/@type").asText());
assertEquals("operation:or", res.at("/query/operation").asText());
assertEquals("koral:token", res.at("/query/operands/0/@type").asText());
assertEquals("koral:term",
res.at("/query/operands/0/wrap/@type").asText());
assertEquals("orth", res.at("/query/operands/0/wrap/layer").asText());
assertEquals("a", res.at("/query/operands/0/wrap/key").asText());
assertEquals("match:eq",
res.at("/query/operands/0/wrap/match").asText());
assertEquals("koral:token", res.at("/query/operands/1/@type").asText());
assertEquals("koral:term",
res.at("/query/operands/1/wrap/@type").asText());
assertEquals("orth", res.at("/query/operands/1/wrap/layer").asText());
assertEquals("b", res.at("/query/operands/1/wrap/key").asText());
assertEquals("match:eq",
res.at("/query/operands/1/wrap/match").asText());
// Matches
assertEquals(1, res.at("/matches/0/UID").asInt());
assertEquals("doc-1", res.at("/matches/0/docID").asText());
assertEquals("match-doc-1-p0-1", res.at("/matches/0/matchID").asText());
assertEquals(
"<span class=\"context-left\"></span><span class=\"match\"><mark>a</mark></span><span class=\"context-right\">bab</span>",
res.at("/matches/0/snippet").asText());
// No primaryData serialization
assertTrue(res.at("/matches/0/primaryData").isMissingNode());
};
@Test
public void checkJSONTokenResult () throws Exception {
KrillIndex ki = new KrillIndex();
FieldDocument fd = new FieldDocument();
fd.addString("ID", "doc-1");
fd.addString("UID", "1");
fd.addTV("base", "abab",
"[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]" + "[(1-2)s:b|i:b|_1#1-2]"
+ "[(2-3)s:a|i:c|_2#2-3]" + "[(3-4)s:b|i:a|_3#3-4]");
ki.addDoc(fd);
fd = new FieldDocument();
fd.addString("ID", "doc-2");
fd.addString("UID", "2");
fd.addTV("base", "aba", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]"
+ "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]");
ki.addDoc(fd);
// Commit!
ki.commit();
QueryBuilder kq = new QueryBuilder("base");
SpanQuery q = (SpanQuery) kq.seq(kq.seg("s:a")).append(kq.seg("s:b"))
.toQuery();
Result kr = ki.search(q);
assertEquals((long) 3, kr.getTotalResults());
ObjectMapper mapper = new ObjectMapper();
JsonNode res = mapper.readTree(kr.toTokenListJsonString());
assertEquals(3, res.at("/meta/totalResults").asInt());
assertEquals("spanNext(base:s:a, base:s:b)",
res.at("/meta/serialQuery").asText());
assertEquals(0, res.at("/meta/startIndex").asInt());
assertEquals(25, res.at("/meta/itemsPerPage").asInt());
assertEquals("doc-1", res.at("/matches/0/textSigle").asText());
assertEquals(0, res.at("/matches/0/tokens/0/0").asInt());
assertEquals(1, res.at("/matches/0/tokens/0/1").asInt());
assertEquals(1, res.at("/matches/0/tokens/1/0").asInt());
assertEquals(2, res.at("/matches/0/tokens/1/1").asInt());
assertEquals("doc-1", res.at("/matches/1/textSigle").asText());
assertEquals(2, res.at("/matches/1/tokens/0/0").asInt());
assertEquals(3, res.at("/matches/1/tokens/0/1").asInt());
assertEquals(3, res.at("/matches/1/tokens/1/0").asInt());
assertEquals(4, res.at("/matches/1/tokens/1/1").asInt());
assertEquals("doc-2", res.at("/matches/2/textSigle").asText());
assertEquals(0, res.at("/matches/2/tokens/0/0").asInt());
assertEquals(1, res.at("/matches/2/tokens/0/1").asInt());
assertEquals(1, res.at("/matches/2/tokens/1/0").asInt());
assertEquals(2, res.at("/matches/2/tokens/1/1").asInt());
};
public static String getString (String path) {
StringBuilder contentBuilder = new StringBuilder();
try {
BufferedReader in = new BufferedReader(
new FileReader(URLDecoder.decode(path, "UTF-8")));
String str;
while ((str = in.readLine()) != null) {
contentBuilder.append(str);
};
in.close();
}
catch (IOException e) {
fail(e.getMessage());
}
return contentBuilder.toString();
};
};