Further query serialization tests
diff --git a/src/main/java/de/ids_mannheim/korap/KorapQuery.java b/src/main/java/de/ids_mannheim/korap/KorapQuery.java
index 4044bfc..c37ebd1 100644
--- a/src/main/java/de/ids_mannheim/korap/KorapQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/KorapQuery.java
@@ -101,12 +101,41 @@
throw new QueryException("Operation needs position specification");
// temporary
- if (json.get("position").asText().equals("contains") || json.get("position").asText().equals("within")) {
+ String position = json.get("position").asText();
+ switch (position) {
+ case "contains":
+ return new SpanWithinQueryWrapper(
+ this.fromJSON(json.get("operands").get(0)),
+ this.fromJSON(json.get("operands").get(1))
+ );
+ case "within":
return new SpanWithinQueryWrapper(
this.fromJSON(json.get("operands").get(0)),
this.fromJSON(json.get("operands").get(1))
);
+
+ case "startswith":
+ return new SpanWithinQueryWrapper(
+ this.fromJSON(json.get("operands").get(0)),
+ this.fromJSON(json.get("operands").get(1)),
+ (short) 1
+ );
+
+ case "endswith":
+ return new SpanWithinQueryWrapper(
+ this.fromJSON(json.get("operands").get(0)),
+ this.fromJSON(json.get("operands").get(1)),
+ (short) 2
+ );
+
+ case "match":
+ return new SpanWithinQueryWrapper(
+ this.fromJSON(json.get("operands").get(0)),
+ this.fromJSON(json.get("operands").get(1)),
+ (short) 3
+ );
};
+
throw new QueryException("Unknown position type "+json.get("position").asText());
case "shrink":
@@ -120,21 +149,7 @@
throw new QueryException("Unknown group relation");
case "korap:token":
- JsonNode value = json.get("@value");
- SpanSegmentQueryWrapper ssegqw = new SpanSegmentQueryWrapper(this.field);
- type = value.get("@type").asText();
- if (type.equals("korap:term")) {
- switch (value.get("relation").asText()) {
- case "=":
- ssegqw.with(value.get("@value").asText());
- return ssegqw;
- case "!=":
- throw new QueryException("Term relation != not yet supported");
- };
- throw new QueryException("Unknown term relation");
- };
- throw new QueryException("Unknown token type");
-
+ return this._segFromJSON(json.get("@value"));
case "korap:sequence":
if (!json.has("operands"))
@@ -145,11 +160,53 @@
sseqqw.append(this.fromJSON(operand));
};
return sseqqw;
+
+ case "korap:element":
+ String value = json.get("@value").asText().replace('=',':');
+ return this.tag(value);
};
throw new QueryException("Unknown serialized query type: " + type);
};
+ private SpanQueryWrapperInterface _segFromJSON (JsonNode json) throws QueryException {
+ String type = json.get("@type").asText();
+ switch (type) {
+ case "korap:term":
+ switch (json.get("relation").asText()) {
+ case "=":
+ return this.seg(json.get("@value").asText());
+ case "!=":
+ throw new QueryException("Term relation != not yet supported");
+ };
+ throw new QueryException("Unknown term relation");
+ case "korap:group":
+ SpanSegmentQueryWrapper ssegqw = new SpanSegmentQueryWrapper(this.field);
+ switch (json.get("relation").asText()) {
+ case "and":
+ for (JsonNode operand : json.get("operands")) {
+ SpanQueryWrapperInterface part = this._segFromJSON(operand);
+ if (part instanceof SpanAlterQueryWrapper) {
+ ssegqw.with((SpanAlterQueryWrapper) part);
+ }
+ else if (part instanceof SpanRegexQueryWrapper) {
+ ssegqw.with((SpanRegexQueryWrapper) part);
+ }
+ else if (part instanceof SpanSegmentQueryWrapper) {
+ ssegqw.with((SpanSegmentQueryWrapper) part);
+ }
+ else {
+ throw new QueryException("Object not supported in segment queries");
+ };
+ };
+ return ssegqw;
+ };
+ };
+ throw new QueryException("Unknown token type");
+};
+
+
+
// SpanSegmentRegexQuery
/**
* Create a query object based on a regular expression.
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanWithinQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanWithinQuery.java
index 8e9235d..fff813a 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanWithinQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanWithinQuery.java
@@ -122,7 +122,11 @@
buffer.append(wrap.toString());
buffer.append(", ");
buffer.append(embedded.toString(field));
- buffer.append(")");
+ if (flag > 0) {
+ buffer.append(", ");
+ buffer.append(flag);
+ };
+ buffer.append(")");
buffer.append(ToStringUtils.boost(getBoost()));
return buffer.toString();
};
@@ -186,7 +190,7 @@
// I don't know what I am doing here
@Override
public int hashCode() {
- int result = 1;
+ int result = flag;
result = embedded.hashCode();
result += wrap.hashCode();
result ^= (result << 4) | (result >>> 29);
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSegmentQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSegmentQueryWrapper.java
index b8d07bc..66db669 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSegmentQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSegmentQueryWrapper.java
@@ -88,6 +88,16 @@
return this;
};
+ public SpanSegmentQueryWrapper with (SpanSegmentQueryWrapper seg) {
+ for (SpanQuery sq : seg.inclusive) {
+ this.inclusive.add(sq);
+ };
+ for (SpanQuery sq : seg.exclusive) {
+ this.exclusive.add(sq);
+ };
+ return this;
+ };
+
public SpanSegmentQueryWrapper without (String term) {
this.exclusive.add(new SpanTermQuery(new Term(field, term)));
return this;
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithinQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithinQueryWrapper.java
index 33d7386..8468630 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithinQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithinQueryWrapper.java
@@ -15,13 +15,21 @@
public class SpanWithinQueryWrapper implements SpanQueryWrapperInterface {
private SpanQueryWrapperInterface element;
private SpanQueryWrapperInterface wrap;
+ private short flag;
public SpanWithinQueryWrapper (SpanQueryWrapperInterface element, SpanQueryWrapperInterface wrap) {
this.element = element;
this.wrap = wrap;
+ this.flag = (short) 0;
+ };
+
+ public SpanWithinQueryWrapper (SpanQueryWrapperInterface element, SpanQueryWrapperInterface wrap, short flag) {
+ this.element = element;
+ this.wrap = wrap;
+ this.flag = flag;
};
public SpanQuery toQuery () {
- return new SpanWithinQuery(this.element.toQuery(), this.wrap.toQuery());
+ return new SpanWithinQuery(this.element.toQuery(), this.wrap.toQuery(), this.flag);
};
};
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestKorapQueryJSON.java b/src/test/java/de/ids_mannheim/korap/query/TestKorapQueryJSON.java
index 9917184..43f9fb1 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestKorapQueryJSON.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestKorapQueryJSON.java
@@ -90,15 +90,62 @@
assertEquals(sqwi.toQuery().toString(), "");
};
- /*
@Test
public void queryJSONBsp9 () {
SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp9.json").getFile());
// [base=Katze&orth=Katzen]
+ assertEquals(sqwi.toQuery().toString(), "spanNear([tokens:base:Katze, tokens:orth:Katzen], -1, false)");
+ };
+
+ @Test
+ public void queryJSONBsp10 () {
+ SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp10.json").getFile());
+
+ // [base=Katze][orth=und][orth=Hunde]
+ assertEquals(sqwi.toQuery().toString(), "spanNext(spanNext(tokens:base:Katze, tokens:orth:und), tokens:orth:Hunde)");
+ };
+
+ @Ignore
+ public void queryJSONBsp11 () {
+ SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp11.json").getFile());
+
+ // [!(base=Katze&orth=Katzen)]
assertEquals(sqwi.toQuery().toString(), "");
};
- */
+
+ @Test
+ public void queryJSONBsp12 () {
+ SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp12.json").getFile());
+
+ // contains(<np>,[base=Mann])
+ assertEquals(sqwi.toQuery().toString(), "spanWithin(<tokens:np />, tokens:base:Mann)");
+ };
+
+ @Ignore
+ public void queryJSONBsp13 () {
+ SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp13.json").getFile());
+
+ // startswith(<np>,[!pos=Det])
+ assertEquals(sqwi.toQuery().toString(), "");
+ };
+
+ @Test
+ public void queryJSONBsp13b () {
+ SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp13b.json").getFile());
+
+ // startswith(<np>,[!pos=Det])
+ assertEquals(sqwi.toQuery().toString(), "spanWithin(<tokens:np />, tokens:pos:Det, 1)");
+ };
+
+ @Ignore
+ public void queryJSONBsp14 () {
+ SpanQueryWrapperInterface sqwi = jsonQuery(getClass().getResource("/queries/bsp14.json").getFile());
+
+ // 'vers{2,3}uch'
+ assertEquals(sqwi.toQuery().toString(), "");
+ };
+
public static String getString (String path) {
StringBuilder contentBuilder = new StringBuilder();
@@ -128,4 +175,4 @@
};
return sqwi;
};
-};
\ No newline at end of file
+};
diff --git a/src/test/resources/queries/bsp13b.json b/src/test/resources/queries/bsp13b.json
new file mode 100644
index 0000000..562c80c
--- /dev/null
+++ b/src/test/resources/queries/bsp13b.json
@@ -0,0 +1,40 @@
+{
+ "@context": {
+ "@language": "de",
+ "class": {
+ "@id": "korap:class",
+ "@type": "xsd:integer"
+ },
+ "filter": "korap:filter",
+ "korap": "http://korap.ids-mannheim.de/ns/query",
+ "meta": "korap:meta",
+ "operands": {
+ "@container": "@list",
+ "@id": "korap:operands"
+ },
+ "query": "korap:query",
+ "relation": {
+ "@id": "korap:relation",
+ "@type": "korap:relation#types"
+ }
+ },
+ "query": {
+ "@type": "korap:group",
+ "operands": [
+ {
+ "@type": "korap:element",
+ "@value": "np"
+ },
+ {
+ "@type": "korap:token",
+ "@value": {
+ "@type": "korap:term",
+ "@value": "pos:Det",
+ "relation": "="
+ }
+ }
+ ],
+ "position": "startswith",
+ "relation": "position"
+ }
+}
diff --git a/src/test/resources/queries/readme.txt b/src/test/resources/queries/readme.txt
index 36745ce..60a54f7 100644
--- a/src/test/resources/queries/readme.txt
+++ b/src/test/resources/queries/readme.txt
@@ -11,7 +11,8 @@
bsp11.json: [!(base=Katze&orth=Katzen)]
bsp12.json: contains(<np>,[base=Mann])
bsp13.json: startswith(<np>,[!pos=Det])
+bsp13b.json: startswith(<np>,[pos=Det])
bsp14.json: 'vers{2,3}uch'
bsp15.json: [orth='vers.*ch']
bsp16.json: [(base=bar|base=foo)&orth=foobar]
-bsp17.json: within(<np>,[base=Mann])
\ No newline at end of file
+bsp17.json: within(<np>,[base=Mann])