cosmas #BED() operator: multiple arguments
diff --git a/notes.txt b/notes.txt
index 40da149..a89cf6c 100644
--- a/notes.txt
+++ b/notes.txt
@@ -8,7 +8,9 @@
the query expresses a sequence of terms) and more in line with other QLs (e.g. Poliqarp)
- distance operators allow to specify a minimal and maximal distance between their arguments, in the form "/wn:m" where n and m are integers. In case only one number
is given (like "/w2"), Cosmas II interprets this as the maximal distance. Note that it is not possible to specify a minimal but possibly infinite distance between to
- tokens - for obvious reasons.
+ tokens - for obvious reasons.
+ - distance operator: flip arguments and change 'minus' to 'plus'
- operands of distance operators to be expressed via shrink/classes?
- #BEG() and #END() are solved via shrink, with the shrink argument not being a class but a position (first/last) indicating the first or last word in the matched sequence
-
\ No newline at end of file
+ - #BED() with two conditions (like 'sa,-pa') can't be mapped to position group as implemented -> make two position groups and embed in 'and'-group
+
\ No newline at end of file
diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/CosmasTree.java b/src/main/java/de/ids_mannheim/korap/query/serialize/CosmasTree.java
index 49e948d..a84249f 100644
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/CosmasTree.java
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/CosmasTree.java
@@ -359,7 +359,8 @@
String subtype = typ.getChild(0).toStringTree().equals("PROX") ? "incl" : "excl";
proxGroup.put("@subtype", subtype);
proxGroup.put("constraint", constraints);
- proxGroup.put("operands", new ArrayList<Object>());
+ ArrayList<Object> operands = new ArrayList<Object>();
+ proxGroup.put("operands", operands);
// if only one dist_info, put directly into constraints
if (dist_list.getChildCount()==1) {
@@ -370,6 +371,10 @@
if (min.equals("VAL0")) {
min="0";
}
+ if (direction.equals("minus")) {
+ direction = "plus";
+ invertedOperandsLists.add(operands);
+ }
LinkedHashMap<String, Object> distance = new LinkedHashMap<String, Object>();
distance.put("@type", "korap:distance");
distance.put("measure", meas);
@@ -462,38 +467,53 @@
if (nodeCat.equals("OPEND") || nodeCat.equals("OPBEG")) {
// Step I: create group
- LinkedHashMap<String, Object> bedgroup = new LinkedHashMap<String, Object>();
- bedgroup.put("@type", "korap:group");
- bedgroup.put("relation", "shrink");
+ LinkedHashMap<String, Object> beggroup = new LinkedHashMap<String, Object>();
+ beggroup.put("@type", "korap:group");
+ beggroup.put("relation", "shrink");
String reduction = nodeCat.equals("OPBEG") ? "first" : "last";
- bedgroup.put("shrink", reduction);
- bedgroup.put("operands", new ArrayList<Object>());
- objectStack.push(bedgroup);
+ beggroup.put("shrink", reduction);
+ beggroup.put("operands", new ArrayList<Object>());
+ objectStack.push(beggroup);
stackedObjects++;
// Step II: decide where to put
- putIntoSuperObject(bedgroup, 1);
+ putIntoSuperObject(beggroup, 1);
}
if (nodeCat.equals("OPBED")) {
// Step I: create group
- LinkedHashMap<String, Object> posgroup = new LinkedHashMap<String, Object>();
- posgroup.put("@type", "korap:group");
- posgroup.put("relation", "position");
int optsChild = node.getChildCount()-1;
- String cond = node.getChild(optsChild).getChild(0).getChild(0).getText(); //(OPBED (OPWF "xyz") (OPTS (TPBEG se)))
- String elem = cond.startsWith("+") ? cond.substring(1,2) : cond.substring(0,1);
- bedElem = new LinkedHashMap<String, Object>();
- bedElem.put("@type", "korap:elem");
- bedElem.put("@value", elem);
- String position = cond.substring(cond.length()-1).equals("a") ? "startswith" : "endswith";
- posgroup.put("position", position);
- posgroup.put("operands", new ArrayList<Object>());
- objectStack.push(posgroup);
- stackedObjects++;
-
- // Step II: decide where to put
- putIntoSuperObject(posgroup, 1);
+ Tree conditions = node.getChild(optsChild);
+ if (conditions.getChildCount()==1) {
+ LinkedHashMap<String, Object> posgroup = new LinkedHashMap<String, Object>();
+ posgroup.put("@type", "korap:group");
+ posgroup.put("relation", "position");
+ String cond = conditions.getChild(0).getChild(0).getText(); //(OPBED (OPWF "xyz") (OPTS (TPBEG se)))
+ //TODO: minus
+ String elem = cond.startsWith("+") ? cond.substring(1,2) : cond.substring(0,1);
+ bedElem = new LinkedHashMap<String, Object>();
+ bedElem.put("@type", "korap:elem");
+ bedElem.put("@value", elem);
+ String position = cond.substring(cond.length()-1).equals("a") ? "startswith" : "endswith";
+ posgroup.put("position", position);
+ posgroup.put("operands", new ArrayList<Object>());
+ objectStack.push(posgroup);
+ stackedObjects++;
+ // Step II: decide where to put
+ putIntoSuperObject(posgroup, 1);
+ } else {
+ // node has several conditions (like 'sa, -pa')
+ // -> create 'and' group and embed all position groups there
+ LinkedHashMap<String, Object> conjunct = new LinkedHashMap<String, Object>();
+ conjunct.put("@type", "korap:group");
+ conjunct.put("relation", "and");
+ ArrayList<Object> operands = new ArrayList<Object>();
+ conjunct.put("operands", operands);
+ for (int i=0; i<conditions.getChildCount(); i++) {
+ // TODO for each condition, create a position group. problem: how to get argument into every operands list?
+ }
+ }
+
}
@@ -529,7 +549,7 @@
System.err.println(objectStack);
@SuppressWarnings("unchecked")
ArrayList<Object> topObjectOperands = (ArrayList<Object>) objectStack.get(0).get("operands");
- topObjectOperands.add(bedElem);
+ topObjectOperands.add(0, bedElem);
}
for (int i=0; i<objectsToPop.get(0); i++) {
@@ -758,7 +778,9 @@
"wegen #IN(%, L) <s>",
"wegen #OV('FE,%,MIN') <s>",
"#BEG(der /+w1:2 Mann)",
- "#BEG(der Mann /10w Mann)"
+ "#BEG(der Mann /10w Mann)",
+ "#BED(der Mann , sa,+pe)",
+// "#BED(der Mann , +pe)"
/*
* TODO
* http://www.ids-mannheim.de/cosmas2/win-app/hilfe/suchanfrage/eingabe-grafisch/syntax/ARGUMENT_I.html
diff --git a/src/test/java/CosmasTreeTest.java b/src/test/java/CosmasTreeTest.java
index 6837282..d30e9ff 100644
--- a/src/test/java/CosmasTreeTest.java
+++ b/src/test/java/CosmasTreeTest.java
@@ -233,6 +233,46 @@
ppt = new CosmasTree(query);
map = ppt.getRequestMap().get("query").toString();
assertEquals(prox4.replaceAll(" ", ""), map.replaceAll(" ", ""));
+
+ query="Sonne /-w4 Mond";
+ String prox5 =
+ "{@type=korap:group, relation=distance, match=operands, @subtype=incl, " +
+ "constraint=[" +
+ "{@type=korap:distance, measure=w, direction=plus, min=0, max=4}" +
+ "], " +
+ "operands=[" +
+ "{@type=korap:token, @value={@type=korap:term, @value=orth:Mond, relation==}}," +
+ "{@type=korap:token, @value={@type=korap:term, @value=orth:Sonne, relation==}}" +
+ "]" +
+ "}";
+ ppt = new CosmasTree(query);
+ map = ppt.getRequestMap().get("query").toString();
+ assertEquals(prox5.replaceAll(" ", ""), map.replaceAll(" ", ""));
+ }
+
+ @Test
+ public void testNestedOPPROX() throws QueryException {
+ query="Sonne /-w4 Mond /+w2 Sterne";
+ String prox6 =
+ "{@type=korap:group, relation=distance, match=operands, @subtype=incl, " +
+ "constraint=[" +
+ "{@type=korap:distance, measure=w, direction=plus, min=0, max=4}" +
+ "], " +
+ "operands=[" +
+ "{@type=korap:group, relation=distance, match=operands, @subtype=incl, " +
+ "constraint=[" +
+ "{@type=korap:distance, measure=w, direction=plus, min=0, max=2}" +
+ "], " +
+ "operands=[" +
+ "{@type=korap:token, @value={@type=korap:term, @value=orth:Mond, relation==}}," +
+ "{@type=korap:token, @value={@type=korap:term, @value=orth:Sterne, relation==}}" +
+ "]}," +
+ "{@type=korap:token, @value={@type=korap:term, @value=orth:Sonne, relation==}}" +
+ "]" +
+ "}";
+ ppt = new CosmasTree(query);
+ map = ppt.getRequestMap().get("query").toString();
+ assertEquals(prox6.replaceAll(" ", ""), map.replaceAll(" ", ""));
}
@Test
@@ -292,31 +332,6 @@
ppt = new CosmasTree(query);
map = ppt.getRequestMap().get("query").toString();
assertEquals(opin4.replaceAll(" ", ""), map.replaceAll(" ", ""));
-
-// // position argument is optional
-// query="wegen #IN <s>";
-// String opin2 =
-// "{@type=korap:group, relation=include, operands=[" +
-// "{@type=korap:token, @value={@type=korap:term, @value=orth:wegen, relation==}}," +
-// "{@type=korap:elem, @value=s}" +
-// "]}";
-// ppt = new CosmasTree(query);
-// map = ppt.getRequestMap().get("query").toString();
-// assertEquals(opin2.replaceAll(" ", ""), map.replaceAll(" ", ""));
-//
-// // parentheses around 'wegen mir' are optional
-// query="wegen #IN (wegen mir)";
-// String opin3 =
-// "{@type=korap:group, relation=include, operands=[" +
-// "{@type=korap:token, @value={@type=korap:term, @value=orth:wegen, relation==}}," +
-// "{@type=korap:sequence, operands=[" +
-// "{@type=korap:token, @value={@type=korap:term, @value=orth:wegen, relation==}}," +
-// "{@type=korap:token, @value={@type=korap:term, @value=orth:mir, relation==}}" +
-// "]}" +
-// "]}";
-// ppt = new CosmasTree(query);
-// map = ppt.getRequestMap().get("query").toString();
-// assertEquals(opin3.replaceAll(" ", ""), map.replaceAll(" ", ""));
}
@Test
@@ -435,18 +450,15 @@
public void testOPALL() throws QueryException {
query="#ALL(gehen /w1:10 voran)";
String all1 =
-// "{@type=korap:group, relation=all, operands=[" +
- "{@type=korap:group, relation=distance, match=all, @subtype=incl, " +
- "constraint=[" +
- "{@type=korap:distance, measure=w, direction=both, min=1, max=10}" +
- "], " +
- "operands=[" +
- "{@type=korap:token, @value={@type=korap:term, @value=orth:gehen, relation==}}," +
- "{@type=korap:token, @value={@type=korap:term, @value=orth:voran, relation==}}" +
- "]" +
- "}" //+
-// "]}"
- ;
+ "{@type=korap:group, relation=distance, match=all, @subtype=incl, " +
+ "constraint=[" +
+ "{@type=korap:distance, measure=w, direction=both, min=1, max=10}" +
+ "], " +
+ "operands=[" +
+ "{@type=korap:token, @value={@type=korap:term, @value=orth:gehen, relation==}}," +
+ "{@type=korap:token, @value={@type=korap:term, @value=orth:voran, relation==}}" +
+ "]" +
+ "}";
ppt = new CosmasTree(query);
map = ppt.getRequestMap().get("query").toString();
assertEquals(all1.replaceAll(" ", ""), map.replaceAll(" ", ""));
@@ -456,18 +468,15 @@
public void testOPNHIT() throws QueryException {
query="#NHIT(gehen /w1:10 voran)";
String nhit1 =
-// "{@type=korap:group, relation=nhit, operands=[" +
- "{@type=korap:group, relation=distance, match=between, @subtype=incl, " +
- "constraint=[" +
- "{@type=korap:distance, measure=w, direction=both, min=1, max=10}" +
- "], " +
- "operands=[" +
- "{@type=korap:token, @value={@type=korap:term, @value=orth:gehen, relation==}}," +
- "{@type=korap:token, @value={@type=korap:term, @value=orth:voran, relation==}}" +
- "]" +
- "}" //+
-// "]}"
- ;
+ "{@type=korap:group, relation=distance, match=between, @subtype=incl, " +
+ "constraint=[" +
+ "{@type=korap:distance, measure=w, direction=both, min=1, max=10}" +
+ "], " +
+ "operands=[" +
+ "{@type=korap:token, @value={@type=korap:term, @value=orth:gehen, relation==}}," +
+ "{@type=korap:token, @value={@type=korap:term, @value=orth:voran, relation==}}" +
+ "]" +
+ "}";
ppt = new CosmasTree(query);
map = ppt.getRequestMap().get("query").toString();
assertEquals(nhit1.replaceAll(" ", ""), map.replaceAll(" ", ""));
@@ -478,8 +487,8 @@
query = "#BED(der , sa)";
String bed1 =
"{@type=korap:group, relation=position, position=startswith, operands=[" +
- "{@type=korap:token, @value={@type=korap:term, @value=orth:der, relation==}}," +
- "{@type=korap:elem, @value=s}" +
+ "{@type=korap:elem, @value=s}," +
+ "{@type=korap:token, @value={@type=korap:term, @value=orth:der, relation==}}" +
"]}";
ppt = new CosmasTree(query);
map = ppt.getRequestMap().get("query").toString();
@@ -488,15 +497,37 @@
query = "#BED(der Mann , +pe)";
String bed2 =
"{@type=korap:group, relation=position, position=endswith, operands=[" +
+ "{@type=korap:elem, @value=p}," +
"{@type=korap:sequence, operands=[" +
"{@type=korap:token, @value={@type=korap:term, @value=orth:der, relation==}}," +
"{@type=korap:token, @value={@type=korap:term, @value=orth:Mann, relation==}}" +
- "]}," +
- "{@type=korap:elem, @value=p}" +
+ "]}" +
"]}";
ppt = new CosmasTree(query);
map = ppt.getRequestMap().get("query").toString();
assertEquals(bed2.replaceAll(" ", ""), map.replaceAll(" ", ""));
+
+ query = "#BED(der Mann , sa,-pa)";
+ String bed3 =
+ "{@type=korap:group, relation=and, operands=[" +
+ "{@type=korap:group, relation=position, position=startswith, operands=[" +
+ "{@type=korap:elem, @value=s}," +
+ "{@type=korap:sequence, operands=[" +
+ "{@type=korap:token, @value={@type=korap:term, @value=orth:der, relation==}}," +
+ "{@type=korap:token, @value={@type=korap:term, @value=orth:Mann, relation==}}" +
+ "]}" +
+ "]}," +
+ "{@type=korap:group, relation=position, position=startswith, @subtype=excl, operands=[" +
+ "{@type=korap:elem, @value=p}," +
+ "{@type=korap:sequence, operands=[" +
+ "{@type=korap:token, @value={@type=korap:term, @value=orth:der, relation==}}," +
+ "{@type=korap:token, @value={@type=korap:term, @value=orth:Mann, relation==}}" +
+ "]}" +
+ "]}" +
+ "]}";
+ ppt = new CosmasTree(query);
+ map = ppt.getRequestMap().get("query").toString();
+ assertEquals(bed3.replaceAll(" ", ""), map.replaceAll(" ", ""));
}
}