- edgeAnnos comprise layer c for dominance relations
- towards jsonification of tests
- test: >@l to wrap operands in startswith (still need to implement)
diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/AqlTree.java b/src/main/java/de/ids_mannheim/korap/query/serialize/AqlTree.java
index ad2d5b7..79d5fcb 100644
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/AqlTree.java
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/AqlTree.java
@@ -204,9 +204,10 @@
 					object.put("wrap", term);
 				}
 			} else if (firstChildNodeCat.equals("qName")) {	// only (foundry/)?layer specified
-				// may be token or span, depending on indicated layer! (e.g. cnx/cat=NP or mate/pos=NN)
+				// may be token or span, depending on indicated layer! (e.g. cnx/cat=NP vs mate/pos=NN)
+				// TODO generalize the list below -> look up layers associated with tokens rather than spans somewhere
 				HashMap<String, Object> qNameParse = parseQNameNode(node.getChild(0));
-				if (Arrays.asList(new String[]{"pos", "lemma", "morph", "tok"}).contains(qNameParse.get("layer"))) {
+				if (Arrays.asList(new String[]{"p", "lemma", "m", "orth"}).contains(qNameParse.get("layer"))) { 
 					object = makeToken();
 					LinkedHashMap<String, Object> term = makeTerm();
 					object.put("wrap", term);
@@ -227,10 +228,10 @@
 				if (object.get("@type").equals("korap:token")) {
 					HashMap<String, Object> term = (HashMap<String, Object>) object.get("wrap");
 					term.putAll(parseTextSpec(node.getChild(2)));
-					term.put("match", parseMatchOperator(node.getChild(1)));
+					term.put("match", parseMatchOperator(getFirstChildWithCat(node, "eqOperator")));
 				} else {
 					object.putAll(parseTextSpec(node.getChild(2)));
-					object.put("match", parseMatchOperator(node.getChild(1)));
+					object.put("match", parseMatchOperator(getFirstChildWithCat(node, "eqOperator")));
 				}
 			}
 
@@ -378,7 +379,6 @@
 					group = makeGroup(groupType);
 					LinkedHashMap<String, Object> relation = new LinkedHashMap<String, Object>();
 					putAllButGroupType(relation, operatorGroup);
-					System.err.println(relation);
 					group.put("relation", relation);
 				} else if (groupType.equals("sequence")) {
 					group = makeGroup(groupType);
@@ -402,7 +402,7 @@
 					if (operand1 != null) operands.add(operand1);
 					if (operand2 != null) operands.add(operand2);
 				} else {
-					// ... but things get a little more complicated here. The AST is of this form: (operand1 operator 1 operand2 operator2 operand3 operator3 ...)
+					// ... but things get a little more complicated here. The AST is of this form: (operand1 operator1 operand2 operator2 operand3 operator3 ...)
 					// but we'll have to serialize it in a nested, binary way: (((operand1 operator1 operand2) operator2 operand3) operator3 ...)
 					// the following code will do just that:
 					if (i == 1) {
@@ -460,6 +460,7 @@
 		return attr;
 	}
 
+	@SuppressWarnings("unchecked")
 	private LinkedHashMap<String, Object> parseOperatorNode(ParseTree operatorNode) {
 		LinkedHashMap<String, Object> relation = null;
 		String operator = getNodeCat(operatorNode);
@@ -470,7 +471,7 @@
 			ParseTree leftChildSpec = getFirstChildWithCat(operatorNode, "@l");
 			ParseTree rightChildSpec = getFirstChildWithCat(operatorNode, "@r");
 			ParseTree qName = getFirstChildWithCat(operatorNode, "qName");
-			ParseTree edgeSpec = getFirstChildWithCat(operatorNode, "edgeSpec");
+			ParseTree edgeSpecNode = getFirstChildWithCat(operatorNode, "edgeSpec");
 			ParseTree star = getFirstChildWithCat(operatorNode, "*");
 			ParseTree rangeSpec = getFirstChildWithCat(operatorNode, "rangeSpec");
 			LinkedHashMap<String,Object> term = makeTerm();
@@ -478,7 +479,21 @@
 			if (leftChildSpec != null) relation.put("index", 0);
 			if (rightChildSpec != null) relation.put("index", -1);
 			if (qName != null) term = parseQNameNode(qName);
-			if (edgeSpec != null) term.putAll(parseEdgeSpec(edgeSpec));
+			if (edgeSpecNode != null) {
+				LinkedHashMap<String,Object> edgeSpec = parseEdgeSpec(edgeSpecNode);
+				String edgeSpecType = (String) edgeSpec.get("@type");
+				if (edgeSpecType.equals("korap:termGroup")) {
+					((ArrayList<Object>) edgeSpec.get("operands")).add(term);
+					term = edgeSpec;
+				} else {
+					term = makeTermGroup("and");
+					ArrayList<Object> termGroupOperands = (ArrayList<Object>) term.get("operands");
+					termGroupOperands.add(edgeSpec);
+					LinkedHashMap<String,Object> constTerm = makeTerm();
+					constTerm.put("layer", "c");
+					termGroupOperands.add(constTerm);
+				}
+			}
 			if (star != null) relation.put("boundary", makeBoundary(0, null));
 			if (rangeSpec != null) relation.put("boundary", boundaryFromRangeSpec(rangeSpec));
 			relation.put("wrap", term);
@@ -548,13 +563,13 @@
 			relation.put("groupType", "position");
 		}
 		else if (operator.equals("identity")) {
-			//TODO
+			//TODO since ANNIS v. 3.1.6
 		}
 		else if (operator.equals("equalvalue")) {
-			//TODO
+			//TODO since ANNIS v. 3.1.6
 		}
 		else if (operator.equals("notequalvalue")) {
-			//TODO
+			//TODO since ANNIS v. 3.1.6
 		}
 		return relation;
 	}
@@ -573,15 +588,13 @@
 		}
 	}
 
-	private LinkedHashMap<String, Object> parseEdgeAnno(
-			ParseTree edgeAnnoSpec) {
+	private LinkedHashMap<String, Object> parseEdgeAnno(ParseTree edgeAnnoSpec) {
 		LinkedHashMap<String, Object> edgeAnno = new LinkedHashMap<String, Object>();
 		edgeAnno.put("@type", "korap:term");
-		ParseTree qNameNode = edgeAnnoSpec.getChild(0);
-		ParseTree matchOperatorNode = edgeAnnoSpec.getChild(1);
-		ParseTree textSpecNode = edgeAnnoSpec.getChild(2);
-		ParseTree layerNode = getFirstChildWithCat(qNameNode, "layer");
-		ParseTree foundryNode = getFirstChildWithCat(qNameNode, "foundry");
+		ParseTree textSpecNode = getFirstChildWithCat(edgeAnnoSpec, "textSpec");
+		ParseTree layerNode = getFirstChildWithCat(edgeAnnoSpec, "layer");
+		ParseTree foundryNode = getFirstChildWithCat(edgeAnnoSpec, "foundry");
+		ParseTree matchOperatorNode = getFirstChildWithCat(edgeAnnoSpec, "eqOperator");
 		if (foundryNode!=null) edgeAnno.put("foundry", foundryNode.getChild(0).toStringTree(parser));
 		if (layerNode!=null) edgeAnno.put("layer", layerNode.getChild(0).toStringTree(parser));
 		edgeAnno.putAll(parseTextSpec(textSpecNode));
@@ -628,7 +641,10 @@
 	 * @return
 	 */
 	private String parseMatchOperator(ParseTree node) {
-		return node.toStringTree(parser).equals("=") ? "match:eq" : "match:ne";
+		if (node.getChildCount()>0) {
+			return node.getChild(0).toStringTree(parser).equals("=") ? "match:eq" : "match:ne";
+		}
+		return null;
 	}
 
 	private LinkedHashMap<String, Object> parseQNameNode(ParseTree node) {
@@ -636,7 +652,10 @@
 		ParseTree layerNode = getFirstChildWithCat(node, "layer");
 		ParseTree foundryNode = getFirstChildWithCat(node, "foundry");
 		if (foundryNode != null) fields.put("foundry", foundryNode.getChild(0).toStringTree(parser));
-		fields.put("layer", layerNode.getChild(0).toStringTree(parser));
+		String layer = layerNode.getChild(0).toStringTree(parser);
+		if (layer.equals("pos")) layer = "p";
+		if (layer.equals("cat")) layer = "c";
+		fields.put("layer", layer);
 		return fields;
 	}
 
@@ -707,26 +726,7 @@
 		 * For testing
 		 */
 		String[] queries = new String[] {
-//				"cat=\"NP\" & cat=\"VP\" & #1 $ #2 ",
-//				"Haus",
-//				"lemma=\"Haus\"",
-//				"Katze=\"Hund\"",
-//				"cnx/c=\"NP\"",
-//				"cat=\"NP\"",
-//				"node & node & #1 .+ #2",
-//				" #1 > #2 & cnx/cat=\"VP\" & cnx/cat=\"NP\"",
-//				"\"Mann\" & node & #2 >[cat=\"NP\"] #1",
-//				"node & node & #2 ->coref[val=\"true\"] #1",
-//				"cat=\"NP\" & cat=\"VP\" & cat=\"PP\" & #1 $ #2 > #3",
-//				"tok=\"Mann\" & tok=\"geht\" & #1 .* #2",
-//				"\"Sonne\"",
-//				"\"so\" & ( \"nicht\" | \"doch\" ) & #1 .1,6 #2",
-//				
-//				"NP#cat=\"NP\" & PP1#cat=\"PP\" . PP2#cat=\"PP\" & #NP > #PP1 & #NP > #PP2 ",
-//				"cat=\"NP\" > cat=\"VP\" & #1 _l_ #2",
-//				"cat=\"NP\" > cat=\"VP\" & #1 . tok=\"foo\"",
-				"cat=\"NP\" & cat=\"VP\" & #1 > #2 & #1 _l_ #2",
-				"tok"
+				"cat=\"S\" & node & #1 >@l[func=\"SB\"] #2"
 		};
 		//		AqlTree.verbose=true;
 		for (String q : queries) {
@@ -742,4 +742,4 @@
 		}
 	}
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/AqlTreeTest.java b/src/test/java/AqlTreeTest.java
index 9e0aa59..61dbbc1 100644
--- a/src/test/java/AqlTreeTest.java
+++ b/src/test/java/AqlTreeTest.java
@@ -1,739 +1,831 @@
 import static org.junit.Assert.*;
 
+import java.io.IOException;
+import java.util.ArrayList;
+
 import org.junit.Test;
 
-import de.ids_mannheim.korap.query.serialize.AqlTree;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import de.ids_mannheim.korap.query.serialize.QuerySerializer;
 import de.ids_mannheim.korap.util.QueryException;
 
+/**
+ * Tests for JSON-LD serialization of ANNIS QL queries. 
+ * @author Joachim Bingel (bingel@ids-mannheim.de)
+ * @version 1.0
+ */
 public class AqlTreeTest {
 	
-	AqlTree aqlt;
-	String map;
-	private String query;
+	String query;
+	ArrayList<JsonNode> operands;
 
-	private boolean equalsQueryContent(String res, String query) throws QueryException {
-		res = res.replaceAll(" ", "");
-		aqlt = new AqlTree(query);
-		String queryMap = aqlt.getRequestMap().get("query").toString().replaceAll(" ", "");
-		return res.equals(queryMap);
+	QuerySerializer qs = new QuerySerializer();
+	ObjectMapper mapper = new ObjectMapper();
+	JsonNode res;
+
+	@Test
+	public void testContext() throws QueryException, JsonProcessingException, IOException {
+		String contextUrl = "http://ids-mannheim.de/ns/KorAP/json-ld/v0.2/context.jsonld";
+		query = "foo";
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals(contextUrl, res.get("@context").asText());
 	}
 	
 	@Test
-	public void testContext() throws QueryException {
-		String contextString = "http://ids-mannheim.de/ns/KorAP/json-ld/v0.2/context.jsonld";
-		aqlt = new AqlTree("Test");
-		assertEquals(contextString.replaceAll(" ", ""), aqlt.getRequestMap().get("@context").toString().replaceAll(" ", ""));
-	}
-	
-	@Test
-	public void testSingleTokens() throws QueryException {
-		// "Mann"
+	public void testSingleTokens() throws QueryException, JsonProcessingException, IOException {
 		query = "\"Mann\"";
-		String token1 = "{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mann, match=match:eq}}";
-		assertTrue(equalsQueryContent(token1, query));
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:token",			 res.at("/query/@type").asText());
+		assertEquals("korap:term",			 res.at("/query/wrap/@type").asText());
+		assertEquals("orth",				 res.at("/query/wrap/layer").asText());
+		assertEquals("Mann",				 res.at("/query/wrap/key").asText());
+		assertEquals("match:eq",			 res.at("/query/wrap/match").asText());
 		
-		// [orth!=Frau]
 		query = "tok!=\"Frau\"";
-		String token2 = "{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Frau, match=match:ne}}";
-		assertTrue(equalsQueryContent(token2, query));
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:token",			 res.at("/query/@type").asText());
+		assertEquals("korap:term",			 res.at("/query/wrap/@type").asText());
+		assertEquals("orth",				 res.at("/query/wrap/layer").asText());
+		assertEquals("Frau",				 res.at("/query/wrap/key").asText());
+		assertEquals("match:ne",			 res.at("/query/wrap/match").asText());
 		
-		// Mann
-		query = "Mann";
-		String token4 = "{@type=korap:span, layer=Mann}";
-		assertTrue(equalsQueryContent(token4, query));
+		query = "tok";  // special keyword for token
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:token",			 res.at("/query/@type").asText());
 		
-		// tok
-		query = "tok";
-		String token5 = "{@type=korap:token}";
-		assertTrue(equalsQueryContent(token5, query));
+		query = "Mann"; // no special keyword -> defaults to layer name
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:span",			 res.at("/query/@type").asText());
+		assertEquals("Mann",				 res.at("/query/layer").asText());
 	}
 	
 	@Test 
-	public void testSpans() throws QueryException {
-		query = "node";
-		String span1 = 
-				 "{@type=korap:span}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(span1.replaceAll(" ", ""), map.replaceAll(" ", ""));
+	public void testSpans() throws QueryException, JsonProcessingException, IOException {
+		query = "node"; // special keyword for general span
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:span",			 res.at("/query/@type").asText());
+		
+		query = "cat=\"np\"";  // cat is special keyword for spans
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:span",			 res.at("/query/@type").asText());
+		assertEquals("np",					 res.at("/query/key").asText());
+		assertEquals("c",					 res.at("/query/layer").asText());
+		
+		query = "cat=\"NP\"";  
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:span",			 res.at("/query/@type").asText());
+		assertEquals("NP",					 res.at("/query/key").asText());
+		assertEquals("c",					 res.at("/query/layer").asText());
 	}
 	
 	@Test
-	public void testRegex() throws QueryException {
-		query = "/Mann/";
-		String regex1 = "{@type=korap:token, wrap={@type=korap:term, layer=orth, type=type:regex, key=Mann, match=match:eq}}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(regex1.replaceAll(" ", ""), map.replaceAll(" ", ""));
+	public void testRegex() throws QueryException, JsonProcessingException, IOException {
+		query = "/Mann/";  
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:token",			 res.at("/query/@type").asText());
+		assertEquals("korap:term",			 res.at("/query/wrap/@type").asText());
+		assertEquals("type:regex",			 res.at("/query/wrap/type").asText());
+		assertEquals("orth",				 res.at("/query/wrap/layer").asText());
+		assertEquals("Mann",				 res.at("/query/wrap/key").asText());
+		assertEquals("match:eq",			 res.at("/query/wrap/match").asText());
 		
-		query = "/.*?Mann.*?/";
-		String regex2 = "{@type=korap:token, wrap={@type=korap:term, layer=orth, type=type:regex, key=.*?Mann.*?, match=match:eq}}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(regex2.replaceAll(" ", ""), map.replaceAll(" ", ""));
+		query = "/.*?Mann.*?/";  
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("type:regex",			res.at("/query/wrap/type").asText());
+		assertEquals(".*?Mann.*?",			res.at("/query/wrap/key").asText());
 	}
-	
-	@Test
-	public void testLayers() throws QueryException {
-		query = "cnx/cat=\"NP\"";
-		String layers1 = "{@type=korap:span, foundry=cnx, layer=cat, key=NP, match=match:eq}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(layers1.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "treetagger/pos=\"NN\"";
-		String layers2 = "{@type=korap:token, wrap={@type=korap:term, foundry=treetagger, layer=pos, key=NN, match=match:eq}}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(layers2.replaceAll(" ", ""), map.replaceAll(" ", ""));
-	}
-	
-	@Test
-	public void testDirectDeclarationRelations() throws QueryException {
-		query = "node > node";
-		String ddr1 = 
-				"{@type=korap:group, operation=operation:relation, operands=[" +
-						"{@type=korap:span}," +
-						"{@type=korap:span}" +
-				"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(ddr1.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "node > cnx/cat=\"NP\"";
-		String ddr2 = 
-				"{@type=korap:group, operation=operation:relation, operands=[" +
-						"{@type=korap:span}," +
-						"{@type=korap:span, foundry=cnx, layer=cat, key=NP, match=match:eq}" +
-				"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(ddr2.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-	}
-	
-	@Test
-	public void testDefPredicationInversion() throws QueryException {
-		query = " #1 > #2 & cnx/cat=\"VP\" & cnx/cat=\"NP\"";
-		String dom1 = 
-				"{@type=korap:group, operation=operation:relation, operands=[" +
-						"{@type=korap:span, foundry=cnx, layer=cat, key=VP, match=match:eq}," +
-						"{@type=korap:span, foundry=cnx, layer=cat, key=NP, match=match:eq}" +
-				"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(dom1.replaceAll(" ", ""), map.replaceAll(" ", ""));
-	}
-	
-	@Test
-	public void testSimpleDominance() throws QueryException {
-		query = "node & node & #2 > #1";
-		String dom1 = 
-				"{@type=korap:group, operation=operation:relation, operands=[" +
-						"{@type=korap:span}," +
-						"{@type=korap:span}" +
-				"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(dom1.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "\"Mann\" & node & #2 > #1";
-		String dom2 = 
-				"{@type=korap:group, operation=operation:relation, operands=[" +
-						"{@type=korap:span}," +
-						"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mann, match=match:eq}}" +
-				"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(dom2.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "\"Mann\" & node & #2 >[cat=\"NP\"] #1";
-		String dom3 = 
-				"{@type=korap:group, operation=operation:relation, operands=[" +
-						"{@type=korap:span}," +
-						"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mann, match=match:eq}}" +
-				"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c, key=NP, match=match:eq}}" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(dom3.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "\"Mann\" & node & #2 >@l[cat=\"NP\"] #1";
-		String dom4 = 
-				"{@type=korap:group, operation=operation:relation, operands=[" +
-						"{@type=korap:span}," +
-						"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mann, match=match:eq}}" +
-				"], relation={@type=korap:relation, index=0, wrap={@type=korap:term, layer=c, key=NP, match=match:eq}}" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(dom4.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "\"Mann\" & node & #2 >2,4 #1";
-		String dom5 = 
-				"{@type=korap:group, operation=operation:relation, operands=[" +
-						"{@type=korap:span}," +
-						"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mann, match=match:eq}}" +
-				"], relation={@type=korap:relation, boundary={@type=korap:boundary, min=2, max=4}, wrap={@type=korap:term, layer=c}}" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(dom5.replaceAll(" ", ""), map.replaceAll(" ", ""));
-	}
-	
-	@Test
-	public void testMultipleDominance() throws QueryException {
-		query = "cat=\"CP\" & cat=\"VP\" & cat=\"NP\" & #1 > #2 > #3";
-		String dom1 = 
-				"{@type=korap:group, operation=operation:relation, operands=[" +
-						"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-							"{@type=korap:group, operation=operation:relation, operands=[" +
-								"{@type=korap:span, layer=cat, key=CP, match=match:eq}," +
-								"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
-									"{@type=korap:span, layer=cat, key=VP, match=match:eq}" +
-								"]}" +
-							"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
-						"]}," +
-						"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
-				"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(dom1.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "cat=\"CP\" & cat=\"VP\" & cat=\"NP\" & cat=\"DP\" & #1 > #2 > #3 > #4";
-		String dom2 = 
-				"{@type=korap:group, operation=operation:relation, operands=[" +
-						"{@type=korap:reference, operation=operation:focus, classRef=[1], operands=[" +
-							"{@type=korap:group, operation=operation:relation, operands=[" +
-								"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-									"{@type=korap:group, operation=operation:relation, operands=[" +
-										"{@type=korap:span, layer=cat, key=CP, match=match:eq}," +
-										"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
-											"{@type=korap:span, layer=cat, key=VP, match=match:eq}" +
-										"]}" +
-									"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
-								"]}," +
-								"{@type=korap:group, operation=operation:class, class=129, classOut=129, operands=[" +
-									"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
-								"]}" +
-							"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
-						"]}," +
-						"{@type=korap:span, layer=cat, key=DP, match=match:eq}" +
-					"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(dom2.replaceAll(" ", ""), map.replaceAll(" ", ""));
-	}
-	
-	@Test
-	public void testPointingRelations() throws QueryException {
-		query = "node & node & #2 ->coref[val=\"true\"] #1";
-		String dom1 = 
-				"{@type=korap:group, operation=operation:relation, operands=[" +
-						"{@type=korap:span}," +
-						"{@type=korap:span}" +
-				"], relation={@type=korap:relation, wrap={@type=korap:term, layer=coref, key=true, match=match:eq}}" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(dom1.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "node & node & #2 ->mate/coref[val=\"true\"] #1";
-		String dom2 = 
-				"{@type=korap:group, operation=operation:relation, operands=[" +
-						"{@type=korap:span}," +
-						"{@type=korap:span}" +
-				"], relation={@type=korap:relation, wrap={@type=korap:term, foundry=mate, layer=coref, key=true, match=match:eq}}" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(dom2.replaceAll(" ", ""), map.replaceAll(" ", ""));
-	}
-	
-	@Test
-	public void testSequence() throws QueryException {
-		query = "node & node & #1 . #2";
-		String seq1 = 
-				"{@type=korap:group, operation=operation:sequence, " +
-					"operands=[" +
-						"{@type=korap:span}," +
-						"{@type=korap:span}" +
-					"], inOrder=true" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(seq1.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "node & node & #1 .* #2";
-		String seq2 = 
-				"{@type=korap:group, operation=operation:sequence, operands=[" +
-						"{@type=korap:span}," +
-						"{@type=korap:span}" +
-					"], distances=[" +
-						"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=0}, min=0}" +
-					"], inOrder=true" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(seq2.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "node & node & #1 .2,3 #2";
-		String seq3 = 
-				"{@type=korap:group, operation=operation:sequence, operands=[" +
-						"{@type=korap:span}," +
-						"{@type=korap:span}" +
-					"], distances=[" +
-						"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=2, max=3}, min=2, max=3}" +
-					"], inOrder=true" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(seq3.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-	}
-	
-	@Test
-	public void testMultipleSequence() throws QueryException {
-		query = "tok=\"Sonne\" & tok=\"Mond\" & tok=\"Sterne\" & #1 .0,2 #2 .0,4 #3";
-		String seq4 = 
-				"{@type=korap:group, operation=operation:sequence," +
-					"operands=[" +
-						"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-							"{@type=korap:group, operation=operation:sequence, operands=[" +
-								"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Sonne, match=match:eq}}," +
-								"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
-									"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mond, match=match:eq}}" +
-								"]}" +
-							"], distances=[" +
-								"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=0, max=2}, min=0, max=2}" +
-							"], inOrder=true}" +
-						"]}," +	
-						"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Sterne, match=match:eq}}" +
-					"],distances=[" +
-						"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=0, max=4}, min=0, max=4}" +
-					"], inOrder=true" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(seq4.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "node & node & node & #1 . #2 .1,3 #3";
-		String seq5 = 
-				"{@type=korap:group, operation=operation:sequence, operands=[" +
-						"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-							"{@type=korap:group, operation=operation:sequence, operands=[" +
-								"{@type=korap:span}," +
-								"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
-									"{@type=korap:span}" +
-								"]} "+
-							"], inOrder=true}" +
-						"]}," +
-						"{@type=korap:span}" +
-					"], distances=[" +
-							"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=1, max=3}, min=1, max=3}" +
-						"], inOrder=true" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(seq5.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "tok=\"Sonne\" & tok=\"Mond\" & tok=\"Sterne\" & tok=\"Himmel\" & #1 .0,2 #2 .0,4 #3 . #4";
-		String seq6 = 
-				"{@type=korap:group, operation=operation:sequence, operands=[" +
-					"{@type=korap:reference, operation=operation:focus, classRef=[1], operands=[" +
-						"{@type=korap:group, operation=operation:sequence, operands=[" +
-							"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-								"{@type=korap:group, operation=operation:sequence, operands=[" +
-									"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Sonne, match=match:eq}}," +
-									"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
-										"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mond, match=match:eq}}" +
-									"]}" +
-								"], distances=[" +
-									"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=0, max=2}, min=0, max=2}" +
-								"], inOrder=true}" +
-							"]}," +	
-							"{@type=korap:group, operation=operation:class, class=129, classOut=129, operands=[" +
-								"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Sterne, match=match:eq}}" +
-							"]}" +
-						"],distances=[" +
-							"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=0, max=4}, min=0, max=4}" +
-						"], inOrder=true}" +
-					"]}," +
-					"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Himmel, match=match:eq}}" +
-				"], inOrder=true}" ;
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(seq6.replaceAll(" ", ""), map.replaceAll(" ", ""));
-	}
-	
-	@Test
-	public void testMultipleMixedOperators() throws QueryException {
-		query = "tok=\"Sonne\" & tok=\"Mond\" & tok=\"Sterne\" & #1 > #2 .0,4 #3";
-		String seq4 = 
-					"{@type=korap:group, operation=operation:sequence, operands=[" +
-							"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-									"{@type=korap:group, operation=operation:relation, operands=[" +
-										"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Sonne, match=match:eq}}," +
-										"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
-											"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mond, match=match:eq}}" +
-										"]}" +
-									"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
-								"]}," +
-								"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Sterne, match=match:eq}}" +
-						"], distances=[" +
-							"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=0, max=4}, min=0, max=4}" +
-						"], inOrder=true" +
-					"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(seq4.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "tok=\"Sonne\" & tok=\"Mond\" & #1 > #2 .0,4  tok=\"Sterne\"";
-		String seq5 = 
-					"{@type=korap:group, operation=operation:sequence, operands=[" +
-							"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-									"{@type=korap:group, operation=operation:relation, operands=[" +
-										"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Sonne, match=match:eq}}," +
-										"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
-											"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mond, match=match:eq}}" +
-										"]}" +
-									"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
-								"]}," +
-								"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Sterne, match=match:eq}}" +
-						"], distances=[" +
-							"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=0, max=4}, min=0, max=4}" +
-						"], inOrder=true" +
-					"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(seq5.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "cat=\"NP\" & cat=\"VP\" & cat=\"PP\" & #1 $ #2 > #3";
-		String cp2 =
-				"{@type=korap:group, operation=operation:relation, operands=[" +
-					"{@type=korap:reference, operation=operation:focus, classRef=[1], operands=[" +
-						"{@type=korap:group, operation=operation:relation, operands=[" +
-							"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-								"{@type=korap:group, operation=operation:relation, operands=[" +
-									"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
-										"{@type=korap:span}" +
-									"]}," +
-									"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
-								"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
-							"]}," +
-							"{@type=korap:group, operation=operation:class, class=129, classOut=129, operands=[" +
-								"{@type=korap:span, layer=cat, key=VP, match=match:eq}" +
-							"]}" +
-						"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
-						"}" +
-					"]}," +
-					"{@type=korap:span, layer=cat, key=PP, match=match:eq}" +
-				"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(cp2.replaceAll(" ", ""), map.replaceAll(" ", ""));		
-	}
-	/*
-	@Test
-	public void testMultipleOperatorsWithSameOperands() throws QueryException {
-		
-		query = "cat=\"NP\" > cat=\"VP\" & #1 _l_ #2";
-		String eq2 =
-				"{@type=korap:group, operation=operation:position, frames=[frame:startswith], sharedClasses=[sharedClasses:includes], operands=[" +
-						"{@type=korap:group, operation=operation:relation, operands=[" +
-							"{@type=korap:group, operation=operation:class, class=, classOut=129, operands=[" +
-								"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
-							"]}," +
-							"{@type=korap:group, operation=operation:class, class=, classOut=129, operands=[" +
-								"{@type=korap:span, layer=cat, key=VP, match=match:eq}" +
-							"]}" +
-						"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}," +
-					"{@type=korap:reference, operation=operation:focus, classRef=[2]}" +
-				"]" +
-				"}"; // ???
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(eq2.replaceAll(" ", ""), map.replaceAll(" ", ""));		
-	}
-	*/
-	@Test
-	public void testPositions() throws QueryException {
-		query = "node & node & #2 _=_ #1";
-		String pos1 = 
-				"{@type=korap:group, operation=operation:position, frames=[frames:matches], operands=[" +
-						"{@type=korap:span}," +
-						"{@type=korap:span}" +
-				"], frame=frame:matches}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(pos1.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "node & node & #2 _i_ #1";
-		String pos2 = 
-				"{@type=korap:group, operation=operation:position, frames=[frames:contains], operands=[" +
-						"{@type=korap:span}," +
-						"{@type=korap:span}" +
-				"], frame=frame:contains" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(pos2.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "node & node & #2 _l_ #1";
-		String pos3 = 
-				"{@type=korap:group, operation=operation:position, frames=[frames:startswith], operands=[" +
-						"{@type=korap:span}," +
-						"{@type=korap:span}" +
-				"], frame=frame:startswith" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(pos3.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "node & \"Mann\" & #1 _r_ #2";
-		String pos4 = 
-					"{@type=korap:group, operation=operation:position, frames=[frames:endswith], operands=[" +
-						"{@type=korap:span}," +
-						"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mann, match=match:eq}}" +
-						"], frame=frame:endswith" +
-					"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(pos4.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "node & \"Mann\" & #2 _r_ #1";
-		String pos5 = 
-					"{@type=korap:group, operation=operation:position, frames=[frames:endswith], operands=[" +
-						"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mann, match=match:eq}}," +
-						"{@type=korap:span}" +
-						"], frame=frame:endswith" +
-					"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(pos5.replaceAll(" ", ""), map.replaceAll(" ", ""));
-	}
-	
-	@Test
-	public void testMultiplePredications() throws QueryException {
-		// a noun before a verb before a preposition
-		query = "pos=\"N\" & pos=\"V\" & pos=\"P\" & #1 . #2 & #2 . #3"; 
-		String mult1 = 
-		"{@type=korap:group, operation=operation:sequence, operands=[" +
-			"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-				"{@type=korap:group, operation=operation:sequence, operands=[" +
-					"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=N, match=match:eq}}," +
-					"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
-						"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=V, match=match:eq}}" +
-					"]}" +
-				"], inOrder=true}" +
-			"]}," +
-			"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=P, match=match:eq}}" +
-		"], inOrder=true}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(mult1.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		// a noun before a verb before a preposition
-		query = "pos=\"N\" & pos=\"V\" & #1 . #2 & #2 . pos=\"P\""; 
-		String mult2 = 
-		"{@type=korap:group, operation=operation:sequence, operands=[" +
-			"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-				"{@type=korap:group, operation=operation:sequence, operands=[" +
-					"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=N, match=match:eq}}," +
-					"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
-						"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=V, match=match:eq}}" +
-					"]}" +
-				"], inOrder=true}" +
-			"]}," +
-			"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=P, match=match:eq}}" +
-		"], inOrder=true}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(mult2.replaceAll(" ", ""), map.replaceAll(" ", ""));
 
-		query = "pos=\"N\" & pos=\"V\" & pos=\"P\" & #1 > #2 & #1 > #3";
-		String mult3 = 
-			"{@type=korap:group, operation=operation:relation, operands=[" +
-				"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-					"{@type=korap:group, operation=operation:relation, operands=[" +
-						"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
-							"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=N, match=match:eq}}" +
-						"]}," +
-						"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=V, match=match:eq}}" +
-					"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
-				"]}," +
-				"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=P, match=match:eq}}" +
-			"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(mult3.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "cat=\"NP\" & pos=\"V\" & pos=\"P\" & #1 > #2 & #1 > #3 & #2 . #3";
-		String mult4 = 
-				"{@type=korap:group, operation=operation:sequence, operands=[" +
-					// reduce dominance relations "#1 > #2 & #1 > #3" to operand #2 in order to make it accessible for #2 . #3 (the last/outermost relation)  
-					"{@type=korap:reference, operation=operation:focus, classRef=[1], operands=[" +
-						"{@type=korap:group, operation=operation:relation, operands=[" +
-							// dominance relation #1 > #2 is reduced to #1, for expressing #1 > #3
-							"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-								"{@type=korap:group, operation=operation:relation, operands=[" +
-									"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
-										"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
-									"]}," +
-									"{@type=korap:group, operation=operation:class, class=129, classOut=129, operands=[" +
-										"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=V, match=match:eq}}" +
-									"]}" +
-								"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
-							"]}," +
-							// establish class 2 around P for later reference
-							"{@type=korap:group, operation=operation:class, class=130, classOut=130, operands=[" +
-								"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=P, match=match:eq}}" +
-							"]}" +
-						"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
-					"]}," +
-					// refer back to class 2 as second operand
-					"{@type=korap:reference, operation=operation:focus, classRef=[2]}" +
-				"], inOrder=true}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(mult4.replaceAll(" ", ""), map.replaceAll(" ", ""));
-	}	
-	
 	@Test
-	public void testUnaryRelations() throws QueryException {
-		query = "node & #1:tokenarity=2";
-		String unary1 = 
-				"{@type=korap:span, attr={@type=korap:term, tokenarity={@type=korap:boundary,min=2,max=2}}}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(unary1.replaceAll(" ", ""), map.replaceAll(" ", ""));
+	public void testFoundriesLayers() throws QueryException, JsonProcessingException, IOException {
+		query = "c=\"np\"";  
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:span",			 res.at("/query/@type").asText());
+		assertEquals("np",					 res.at("/query/key").asText());
+		assertEquals("c",					 res.at("/query/layer").asText());
 		
-		query = "cnx/cat=\"NP\" & #1:tokenarity=2";
-		String unary2 = 
-				"{@type=korap:span, foundry=cnx, layer=cat, key=NP, match=match:eq, attr={@type=korap:term, tokenarity={@type=korap:boundary,min=2,max=2}}}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(unary2.replaceAll(" ", ""), map.replaceAll(" ", ""));
+		query = "cnx/c=\"np\"";  
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:span",			 res.at("/query/@type").asText());
+		assertEquals("np",					 res.at("/query/key").asText());
+		assertEquals("c",					 res.at("/query/layer").asText());
+		assertEquals("cnx",					 res.at("/query/foundry").asText());
 		
-		query = "cnx/cat=\"NP\" & #1:root";
-		String unary3 = 
-				"{@type=korap:span, foundry=cnx, layer=cat, key=NP, match=match:eq, attr={@type=korap:term, root=true}}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(unary3.replaceAll(" ", ""), map.replaceAll(" ", ""));
-		
-		query = "cnx/cat=\"NP\" & node & #1>#2 & #1:tokenarity=2";
-		String unary4 = 
-					"{@type=korap:group, operation=operation:relation, operands=[" +
-						"{@type=korap:span, foundry=cnx, layer=cat, key=NP, match=match:eq, attr={@type=korap:term, tokenarity={@type=korap:boundary,min=2,max=2}}}," +
-						"{@type=korap:span}" +
-					"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
-					"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(unary4.replaceAll(" ", ""), map.replaceAll(" ", ""));
-	}	
-	
-	@Test
-	public void testCommonParent() throws QueryException {
-		query = "cat=\"NP\" & cat=\"VP\" & #1 $ #2";
-		String cp1 =
-				"{@type=korap:group, operation=operation:relation, operands=[" +
-						"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-							"{@type=korap:group, operation=operation:relation, operands=[" +
-								"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
-									"{@type=korap:span}" +
-								"]}," +
-								"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
-							"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
-						"]}," +
-						"{@type=korap:span, layer=cat, key=VP, match=match:eq}" +
-					"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
-					"";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(cp1.replaceAll(" ", ""), map.replaceAll(" ", ""));		
-		
-		query = "cat=\"NP\" & cat=\"VP\" & cat=\"PP\" & #1 $ #2 $ #3";
-		String cp2 =
-				"{@type=korap:group, operation=operation:relation, operands=[" +
-					"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-						"{@type=korap:group, operation=operation:relation, operands=[" +
-							"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-								"{@type=korap:group, operation=operation:relation, operands=[" +
-									"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
-										"{@type=korap:span}" +
-									"]}," +
-									"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
-								"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
-							"]}," +
-							"{@type=korap:span, layer=cat, key=VP, match=match:eq}" +
-						"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
-						"}" +
-					"]}," +
-					"{@type=korap:span, layer=cat, key=PP, match=match:eq}" +
-				"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
-				"}";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(cp2.replaceAll(" ", ""), map.replaceAll(" ", ""));		
-		
-		query = "cat=\"NP\" & cat=\"VP\" & cat=\"PP\" & cat=\"CP\" & #1 $ #2 $ #3 $ #4";
-		String cp3 =
-				"{@type=korap:group, operation=operation:relation, operands=[" +
-					"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-						"{@type=korap:group, operation=operation:relation, operands=[" +
-							"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-								"{@type=korap:group, operation=operation:relation, operands=[" +
-									"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-										"{@type=korap:group, operation=operation:relation, operands=[" +
-											"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
-												"{@type=korap:span}" +
-											"]}," +
-											"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
-										"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
-									"]}," +
-									"{@type=korap:span, layer=cat, key=VP, match=match:eq}" +
-								"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
-							"]}," +
-							"{@type=korap:span, layer=cat, key=PP, match=match:eq}" +
-						"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
-					"]}," +
-					"{@type=korap:span, layer=cat, key=CP, match=match:eq}" +
-				"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
-				"}" +
-				"";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(cp3.replaceAll(" ", ""), map.replaceAll(" ", ""));		
-		
-		query = "cat=\"NP\" & cat=\"VP\" & #1 $* #2";
-		String cp4 =
-				"{@type=korap:group, operation=operation:relation, operands=[" +
-						"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
-							"{@type=korap:group, operation=operation:relation, operands=[" +
-								"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
-									"{@type=korap:span}" +
-								"]}," +
-								"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
-							"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c},boundary={@type=korap:boundary,min=1}}}" +
-						"]}," +
-						"{@type=korap:span, layer=cat, key=VP, match=match:eq}" +
-					"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c},boundary={@type=korap:boundary,min=1}}}" +
-					"";
-		aqlt = new AqlTree(query);
-		map = aqlt.getRequestMap().get("query").toString();
-		assertEquals(cp4.replaceAll(" ", ""), map.replaceAll(" ", ""));		
+		query = "tt/pos=\"np\"";  
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:token",			 res.at("/query/@type").asText());
+		assertEquals("korap:term",			 res.at("/query/wrap/@type").asText());
+		assertEquals("np",					 res.at("/query/wrap/key").asText());
+		assertEquals("p",					 res.at("/query/wrap/layer").asText());
+		assertEquals("tt",					 res.at("/query/wrap/foundry").asText());
 	}
 	
+	@Test
+	public void testDirectDeclarationRelations() throws QueryException, JsonProcessingException, IOException {
+		query = "node > node";  
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:group",			res.at("/query/@type").asText());
+		assertEquals("operation:relation",	res.at("/query/operation").asText());
+		assertEquals("korap:span",			res.at("/query/operands/0/@type").asText());
+		assertEquals("korap:span",			res.at("/query/operands/1/@type").asText());
+		assertEquals("korap:relation",		res.at("/query/relation/@type").asText());
+		assertEquals("korap:term",			res.at("/query/relation/wrap/@type").asText());
+		assertEquals("c",					res.at("/query/relation/wrap/layer").asText());
+		
+		query = "node > cnx/c=\"np\"";  
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:group",			res.at("/query/@type").asText());
+		assertEquals("operation:relation",	res.at("/query/operation").asText());
+		assertEquals("korap:span",			res.at("/query/operands/0/@type").asText());
+		assertEquals("korap:span",			res.at("/query/operands/1/@type").asText());
+		assertEquals("np",					res.at("/query/operands/1/key").asText());
+		assertEquals("c",					res.at("/query/operands/1/layer").asText());
+		assertEquals("cnx",					res.at("/query/operands/1/foundry").asText());
+		assertEquals("korap:relation",		res.at("/query/relation/@type").asText());
+		assertEquals("korap:term",			res.at("/query/relation/wrap/@type").asText());
+		assertEquals("c",					res.at("/query/relation/wrap/layer").asText());
+		
+		query = "cnx/c=\"np\" > node";  
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals(true,					res.at("/query/operands/1/key").isMissingNode());
+		assertEquals("np",					res.at("/query/operands/0/key").asText());
+	}
+	
+	@Test
+	public void testDefPredicationInversion() throws QueryException, JsonProcessingException, IOException {
+		query = "#1 > #2 & cnx/cat=\"vp\" & cnx/cat=\"np\"";  
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:group",			res.at("/query/@type").asText());
+		assertEquals("operation:relation",	res.at("/query/operation").asText());
+		assertEquals("korap:span",			res.at("/query/operands/0/@type").asText());
+		assertEquals("korap:span",			res.at("/query/operands/0/@type").asText());
+		assertEquals("vp",					res.at("/query/operands/0/key").asText());
+		assertEquals("c",					res.at("/query/operands/0/layer").asText());
+		assertEquals("cnx",					res.at("/query/operands/0/foundry").asText());
+		assertEquals("korap:span",			res.at("/query/operands/1/@type").asText());
+		assertEquals("np",					res.at("/query/operands/1/key").asText());
+		assertEquals("c",					res.at("/query/operands/1/layer").asText());
+		assertEquals("cnx",					res.at("/query/operands/1/foundry").asText());
+		assertEquals("korap:relation",		res.at("/query/relation/@type").asText());
+		assertEquals("korap:term",			res.at("/query/relation/wrap/@type").asText());
+		assertEquals("c",					res.at("/query/relation/wrap/layer").asText());
+	}
+	
+	@Test
+	public void testSimpleDominance() throws QueryException, JsonProcessingException, IOException {
+		query = "node & node & #2 > #1";  
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:group",			res.at("/query/@type").asText());
+		assertEquals("operation:relation",	res.at("/query/operation").asText());
+		assertEquals("korap:span",			res.at("/query/operands/0/@type").asText());
+		assertEquals("korap:span",			res.at("/query/operands/1/@type").asText());
+		assertEquals("korap:relation",		res.at("/query/relation/@type").asText());
+		assertEquals("korap:term",			res.at("/query/relation/wrap/@type").asText());
+		assertEquals("c",					res.at("/query/relation/wrap/layer").asText());
+		
+		query = "\"Mann\" & node & #2 > #1";  
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:group",			res.at("/query/@type").asText());
+		assertEquals("operation:relation",	res.at("/query/operation").asText());
+		assertEquals("korap:span",			res.at("/query/operands/0/@type").asText());
+		assertEquals("korap:token",			res.at("/query/operands/1/@type").asText());
+		assertEquals("Mann",				res.at("/query/operands/1/wrap/key").asText());
+		assertEquals("korap:relation",		res.at("/query/relation/@type").asText());
+		assertEquals("korap:term",			res.at("/query/relation/wrap/@type").asText());
+		assertEquals("c",					res.at("/query/relation/wrap/layer").asText());
+		
+		query = "\"Mann\" & node & #2 >[func=\"SB\"] #1";  //coordinates the func=SB term and requires a "c"-layer term (consituency relation/dominance)
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:relation",		res.at("/query/relation/@type").asText());
+		assertEquals("korap:termGroup",		res.at("/query/relation/wrap/@type").asText());
+		assertEquals("relation:and",		res.at("/query/relation/wrap/relation").asText());
+		assertEquals("c",					res.at("/query/relation/wrap/operands/1/layer").asText());
+		assertEquals("func",				res.at("/query/relation/wrap/operands/0/layer").asText());
+		assertEquals("SB",					res.at("/query/relation/wrap/operands/0/key").asText());
+		
+		query = "cat=\"S\" & node & #1 >[func=\"SB\" func=\"MO\"] #2";  // quite meaningless (function is subject and modifier), but this is allowed by Annis, however its backend only regards the 1st option
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:relation",		res.at("/query/relation/@type").asText());
+		assertEquals("korap:termGroup",		res.at("/query/relation/wrap/@type").asText());
+		assertEquals("relation:and",		res.at("/query/relation/wrap/relation").asText());
+		assertEquals("func",				res.at("/query/relation/wrap/operands/0/layer").asText());
+		assertEquals("SB",					res.at("/query/relation/wrap/operands/0/key").asText());
+		assertEquals("func",				res.at("/query/relation/wrap/operands/1/layer").asText());
+		assertEquals("MO"	,				res.at("/query/relation/wrap/operands/1/key").asText());
+		assertEquals("c",					res.at("/query/relation/wrap/operands/2/layer").asText());
+		
+		query = "cat=\"S\" & cat=\"NP\" & #1 >@l #2";  // all sentences starting with subject  -> wrap operands in startswith and retrieve 2nd operand with focus
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("operation:relation",	res.at("/query/operation").asText());
+		assertEquals("operation:position",	res.at("/query/operands/0/operation").asText());
+		assertEquals("frames:startswith",	res.at("/query/operands/0/frames/0").asText());
+		assertEquals("korap:span",			res.at("/query/operands/0/operands/0/@type").asText());
+		assertEquals("S",					res.at("/query/operands/0/operands/0/key").asText());
+		assertEquals("korap:group",			res.at("/query/operands/0/operands/1/@type").asText());
+		assertEquals("operation:class",		res.at("/query/operands/0/operands/1/operation").asText());
+		assertEquals(128,					res.at("/query/operands/0/operands/1/classOut").asInt());
+		assertEquals("korap:span",			res.at("/query/operands/0/operands/1/operands/0/@type").asText());
+		assertEquals("NP",					res.at("/query/operands/0/operands/1/operands/0/key").asText());
+		assertEquals("korap:reference",		res.at("/query/operands/1/@type").asText());
+		assertEquals("operation:focus",		res.at("/query/operands/1/operation").asText());
+		assertEquals(128,					res.at("/query/operands/1/classRef/0").asInt());
+	}
+	
+	@Test
+	public void testIndirectDominance() throws QueryException, JsonProcessingException, IOException {
+		query = "node & node & #1 >2,4 #2";  
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals("korap:group",			res.at("/query/@type").asText());
+		assertEquals("operation:relation",	res.at("/query/operation").asText());
+		assertEquals("korap:span",			res.at("/query/operands/0/@type").asText());
+		assertEquals("korap:span",			res.at("/query/operands/1/@type").asText());
+		assertEquals("korap:relation",		res.at("/query/relation/@type").asText());
+		assertEquals(2,						res.at("/query/relation/boundary/min").asInt());
+		assertEquals(4,						res.at("/query/relation/boundary/max").asInt());
+		assertEquals("korap:term",			res.at("/query/relation/wrap/@type").asText());
+		assertEquals("c",					res.at("/query/relation/wrap/layer").asText());
+		
+		query = "node & node & #1 >* #2";  
+		qs.setQuery(query, "annis");
+		res = mapper.readTree(qs.toJSON());
+		assertEquals(0,						res.at("/query/relation/boundary/min").asInt());
+		assertEquals(true,					res.at("/query/relation/boundary/max").isMissingNode());
+	}
+
+	//	
+//	@Test
+//	public void testMultipleDominance() throws QueryException {
+//		query = "cat=\"CP\" & cat=\"VP\" & cat=\"NP\" & #1 > #2 > #3";
+//		String dom1 = 
+//				"{@type=korap:group, operation=operation:relation, operands=[" +
+//						"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//							"{@type=korap:group, operation=operation:relation, operands=[" +
+//								"{@type=korap:span, layer=cat, key=CP, match=match:eq}," +
+//								"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
+//									"{@type=korap:span, layer=cat, key=VP, match=match:eq}" +
+//								"]}" +
+//							"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
+//						"]}," +
+//						"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
+//				"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
+//				"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(dom1.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//		query = "cat=\"CP\" & cat=\"VP\" & cat=\"NP\" & cat=\"DP\" & #1 > #2 > #3 > #4";
+//		String dom2 = 
+//				"{@type=korap:group, operation=operation:relation, operands=[" +
+//						"{@type=korap:reference, operation=operation:focus, classRef=[1], operands=[" +
+//							"{@type=korap:group, operation=operation:relation, operands=[" +
+//								"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//									"{@type=korap:group, operation=operation:relation, operands=[" +
+//										"{@type=korap:span, layer=cat, key=CP, match=match:eq}," +
+//										"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
+//											"{@type=korap:span, layer=cat, key=VP, match=match:eq}" +
+//										"]}" +
+//									"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
+//								"]}," +
+//								"{@type=korap:group, operation=operation:class, class=129, classOut=129, operands=[" +
+//									"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
+//								"]}" +
+//							"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
+//						"]}," +
+//						"{@type=korap:span, layer=cat, key=DP, match=match:eq}" +
+//					"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
+//				"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(dom2.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//	}
+//	
+//	@Test
+//	public void testPointingRelations() throws QueryException {
+//		query = "node & node & #2 ->coref[val=\"true\"] #1";
+//		String dom1 = 
+//				"{@type=korap:group, operation=operation:relation, operands=[" +
+//						"{@type=korap:span}," +
+//						"{@type=korap:span}" +
+//				"], relation={@type=korap:relation, wrap={@type=korap:term, layer=coref, key=true, match=match:eq}}" +
+//				"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(dom1.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//		query = "node & node & #2 ->mate/coref[val=\"true\"] #1";
+//		String dom2 = 
+//				"{@type=korap:group, operation=operation:relation, operands=[" +
+//						"{@type=korap:span}," +
+//						"{@type=korap:span}" +
+//				"], relation={@type=korap:relation, wrap={@type=korap:term, foundry=mate, layer=coref, key=true, match=match:eq}}" +
+//				"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(dom2.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//	}
+//	
+//	@Test
+//	public void testSequence() throws QueryException {
+//		query = "node & node & #1 . #2";
+//		String seq1 = 
+//				"{@type=korap:group, operation=operation:sequence, " +
+//					"operands=[" +
+//						"{@type=korap:span}," +
+//						"{@type=korap:span}" +
+//					"], inOrder=true" +
+//				"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(seq1.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//		query = "node & node & #1 .* #2";
+//		String seq2 = 
+//				"{@type=korap:group, operation=operation:sequence, operands=[" +
+//						"{@type=korap:span}," +
+//						"{@type=korap:span}" +
+//					"], distances=[" +
+//						"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=0}, min=0}" +
+//					"], inOrder=true" +
+//				"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(seq2.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//		query = "node & node & #1 .2,3 #2";
+//		String seq3 = 
+//				"{@type=korap:group, operation=operation:sequence, operands=[" +
+//						"{@type=korap:span}," +
+//						"{@type=korap:span}" +
+//					"], distances=[" +
+//						"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=2, max=3}, min=2, max=3}" +
+//					"], inOrder=true" +
+//				"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(seq3.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//	}
+//	
+//	@Test
+//	public void testMultipleSequence() throws QueryException {
+//		query = "tok=\"Sonne\" & tok=\"Mond\" & tok=\"Sterne\" & #1 .0,2 #2 .0,4 #3";
+//		String seq4 = 
+//				"{@type=korap:group, operation=operation:sequence," +
+//					"operands=[" +
+//						"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//							"{@type=korap:group, operation=operation:sequence, operands=[" +
+//								"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Sonne, match=match:eq}}," +
+//								"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
+//									"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mond, match=match:eq}}" +
+//								"]}" +
+//							"], distances=[" +
+//								"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=0, max=2}, min=0, max=2}" +
+//							"], inOrder=true}" +
+//						"]}," +	
+//						"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Sterne, match=match:eq}}" +
+//					"],distances=[" +
+//						"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=0, max=4}, min=0, max=4}" +
+//					"], inOrder=true" +
+//				"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(seq4.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//		query = "node & node & node & #1 . #2 .1,3 #3";
+//		String seq5 = 
+//				"{@type=korap:group, operation=operation:sequence, operands=[" +
+//						"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//							"{@type=korap:group, operation=operation:sequence, operands=[" +
+//								"{@type=korap:span}," +
+//								"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
+//									"{@type=korap:span}" +
+//								"]} "+
+//							"], inOrder=true}" +
+//						"]}," +
+//						"{@type=korap:span}" +
+//					"], distances=[" +
+//							"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=1, max=3}, min=1, max=3}" +
+//						"], inOrder=true" +
+//				"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(seq5.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//		query = "tok=\"Sonne\" & tok=\"Mond\" & tok=\"Sterne\" & tok=\"Himmel\" & #1 .0,2 #2 .0,4 #3 . #4";
+//		String seq6 = 
+//				"{@type=korap:group, operation=operation:sequence, operands=[" +
+//					"{@type=korap:reference, operation=operation:focus, classRef=[1], operands=[" +
+//						"{@type=korap:group, operation=operation:sequence, operands=[" +
+//							"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//								"{@type=korap:group, operation=operation:sequence, operands=[" +
+//									"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Sonne, match=match:eq}}," +
+//									"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
+//										"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mond, match=match:eq}}" +
+//									"]}" +
+//								"], distances=[" +
+//									"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=0, max=2}, min=0, max=2}" +
+//								"], inOrder=true}" +
+//							"]}," +	
+//							"{@type=korap:group, operation=operation:class, class=129, classOut=129, operands=[" +
+//								"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Sterne, match=match:eq}}" +
+//							"]}" +
+//						"],distances=[" +
+//							"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=0, max=4}, min=0, max=4}" +
+//						"], inOrder=true}" +
+//					"]}," +
+//					"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Himmel, match=match:eq}}" +
+//				"], inOrder=true}" ;
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(seq6.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//	}
+//	
+//	@Test
+//	public void testMultipleMixedOperators() throws QueryException {
+//		query = "tok=\"Sonne\" & tok=\"Mond\" & tok=\"Sterne\" & #1 > #2 .0,4 #3";
+//		String seq4 = 
+//					"{@type=korap:group, operation=operation:sequence, operands=[" +
+//							"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//									"{@type=korap:group, operation=operation:relation, operands=[" +
+//										"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Sonne, match=match:eq}}," +
+//										"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
+//											"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mond, match=match:eq}}" +
+//										"]}" +
+//									"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
+//								"]}," +
+//								"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Sterne, match=match:eq}}" +
+//						"], distances=[" +
+//							"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=0, max=4}, min=0, max=4}" +
+//						"], inOrder=true" +
+//					"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(seq4.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//		query = "tok=\"Sonne\" & tok=\"Mond\" & #1 > #2 .0,4  tok=\"Sterne\"";
+//		String seq5 = 
+//					"{@type=korap:group, operation=operation:sequence, operands=[" +
+//							"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//									"{@type=korap:group, operation=operation:relation, operands=[" +
+//										"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Sonne, match=match:eq}}," +
+//										"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
+//											"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mond, match=match:eq}}" +
+//										"]}" +
+//									"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
+//								"]}," +
+//								"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Sterne, match=match:eq}}" +
+//						"], distances=[" +
+//							"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=0, max=4}, min=0, max=4}" +
+//						"], inOrder=true" +
+//					"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(seq5.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//		query = "cat=\"NP\" & cat=\"VP\" & cat=\"PP\" & #1 $ #2 > #3";
+//		String cp2 =
+//				"{@type=korap:group, operation=operation:relation, operands=[" +
+//					"{@type=korap:reference, operation=operation:focus, classRef=[1], operands=[" +
+//						"{@type=korap:group, operation=operation:relation, operands=[" +
+//							"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//								"{@type=korap:group, operation=operation:relation, operands=[" +
+//									"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
+//										"{@type=korap:span}" +
+//									"]}," +
+//									"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
+//								"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
+//							"]}," +
+//							"{@type=korap:group, operation=operation:class, class=129, classOut=129, operands=[" +
+//								"{@type=korap:span, layer=cat, key=VP, match=match:eq}" +
+//							"]}" +
+//						"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
+//						"}" +
+//					"]}," +
+//					"{@type=korap:span, layer=cat, key=PP, match=match:eq}" +
+//				"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
+//				"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(cp2.replaceAll(" ", ""), map.replaceAll(" ", ""));		
+//	}
+//	/*
+//	@Test
+//	public void testMultipleOperatorsWithSameOperands() throws QueryException {
+//		
+//		query = "cat=\"NP\" > cat=\"VP\" & #1 _l_ #2";
+//		String eq2 =
+//				"{@type=korap:group, operation=operation:position, frames=[frame:startswith], sharedClasses=[sharedClasses:includes], operands=[" +
+//						"{@type=korap:group, operation=operation:relation, operands=[" +
+//							"{@type=korap:group, operation=operation:class, class=, classOut=129, operands=[" +
+//								"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
+//							"]}," +
+//							"{@type=korap:group, operation=operation:class, class=, classOut=129, operands=[" +
+//								"{@type=korap:span, layer=cat, key=VP, match=match:eq}" +
+//							"]}" +
+//						"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}," +
+//					"{@type=korap:reference, operation=operation:focus, classRef=[2]}" +
+//				"]" +
+//				"}"; // ???
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(eq2.replaceAll(" ", ""), map.replaceAll(" ", ""));		
+//	}
+//	*/
+//	@Test
+//	public void testPositions() throws QueryException {
+//		query = "node & node & #2 _=_ #1";
+//		String pos1 = 
+//				"{@type=korap:group, operation=operation:position, frames=[frames:matches], operands=[" +
+//						"{@type=korap:span}," +
+//						"{@type=korap:span}" +
+//				"], frame=frame:matches}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(pos1.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//		query = "node & node & #2 _i_ #1";
+//		String pos2 = 
+//				"{@type=korap:group, operation=operation:position, frames=[frames:contains], operands=[" +
+//						"{@type=korap:span}," +
+//						"{@type=korap:span}" +
+//				"], frame=frame:contains" +
+//				"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(pos2.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//		query = "node & node & #2 _l_ #1";
+//		String pos3 = 
+//				"{@type=korap:group, operation=operation:position, frames=[frames:startswith], operands=[" +
+//						"{@type=korap:span}," +
+//						"{@type=korap:span}" +
+//				"], frame=frame:startswith" +
+//				"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(pos3.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//		query = "node & \"Mann\" & #1 _r_ #2";
+//		String pos4 = 
+//					"{@type=korap:group, operation=operation:position, frames=[frames:endswith], operands=[" +
+//						"{@type=korap:span}," +
+//						"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mann, match=match:eq}}" +
+//						"], frame=frame:endswith" +
+//					"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(pos4.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//		query = "node & \"Mann\" & #2 _r_ #1";
+//		String pos5 = 
+//					"{@type=korap:group, operation=operation:position, frames=[frames:endswith], operands=[" +
+//						"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mann, match=match:eq}}," +
+//						"{@type=korap:span}" +
+//						"], frame=frame:endswith" +
+//					"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(pos5.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//	}
+//	
+//	@Test
+//	public void testMultiplePredications() throws QueryException {
+//		// a noun before a verb before a preposition
+//		query = "pos=\"N\" & pos=\"V\" & pos=\"P\" & #1 . #2 & #2 . #3"; 
+//		String mult1 = 
+//		"{@type=korap:group, operation=operation:sequence, operands=[" +
+//			"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//				"{@type=korap:group, operation=operation:sequence, operands=[" +
+//					"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=N, match=match:eq}}," +
+//					"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
+//						"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=V, match=match:eq}}" +
+//					"]}" +
+//				"], inOrder=true}" +
+//			"]}," +
+//			"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=P, match=match:eq}}" +
+//		"], inOrder=true}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(mult1.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//		// a noun before a verb before a preposition
+//		query = "pos=\"N\" & pos=\"V\" & #1 . #2 & #2 . pos=\"P\""; 
+//		String mult2 = 
+//		"{@type=korap:group, operation=operation:sequence, operands=[" +
+//			"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//				"{@type=korap:group, operation=operation:sequence, operands=[" +
+//					"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=N, match=match:eq}}," +
+//					"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
+//						"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=V, match=match:eq}}" +
+//					"]}" +
+//				"], inOrder=true}" +
+//			"]}," +
+//			"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=P, match=match:eq}}" +
+//		"], inOrder=true}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(mult2.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//
+//		query = "pos=\"N\" & pos=\"V\" & pos=\"P\" & #1 > #2 & #1 > #3";
+//		String mult3 = 
+//			"{@type=korap:group, operation=operation:relation, operands=[" +
+//				"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//					"{@type=korap:group, operation=operation:relation, operands=[" +
+//						"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
+//							"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=N, match=match:eq}}" +
+//						"]}," +
+//						"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=V, match=match:eq}}" +
+//					"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
+//				"]}," +
+//				"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=P, match=match:eq}}" +
+//			"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(mult3.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//		query = "cat=\"NP\" & pos=\"V\" & pos=\"P\" & #1 > #2 & #1 > #3 & #2 . #3";
+//		String mult4 = 
+//				"{@type=korap:group, operation=operation:sequence, operands=[" +
+//					// reduce dominance relations "#1 > #2 & #1 > #3" to operand #2 in order to make it accessible for #2 . #3 (the last/outermost relation)  
+//					"{@type=korap:reference, operation=operation:focus, classRef=[1], operands=[" +
+//						"{@type=korap:group, operation=operation:relation, operands=[" +
+//							// dominance relation #1 > #2 is reduced to #1, for expressing #1 > #3
+//							"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//								"{@type=korap:group, operation=operation:relation, operands=[" +
+//									"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
+//										"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
+//									"]}," +
+//									"{@type=korap:group, operation=operation:class, class=129, classOut=129, operands=[" +
+//										"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=V, match=match:eq}}" +
+//									"]}" +
+//								"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
+//							"]}," +
+//							// establish class 2 around P for later reference
+//							"{@type=korap:group, operation=operation:class, class=130, classOut=130, operands=[" +
+//								"{@type=korap:token, wrap={@type=korap:term, layer=pos, key=P, match=match:eq}}" +
+//							"]}" +
+//						"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
+//					"]}," +
+//					// refer back to class 2 as second operand
+//					"{@type=korap:reference, operation=operation:focus, classRef=[2]}" +
+//				"], inOrder=true}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(mult4.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//	}	
+//	
+//	@Test
+//	public void testUnaryRelations() throws QueryException {
+//		query = "node & #1:tokenarity=2";
+//		String unary1 = 
+//				"{@type=korap:span, attr={@type=korap:term, tokenarity={@type=korap:boundary,min=2,max=2}}}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(unary1.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//		query = "cnx/cat=\"NP\" & #1:tokenarity=2";
+//		String unary2 = 
+//				"{@type=korap:span, foundry=cnx, layer=cat, key=NP, match=match:eq, attr={@type=korap:term, tokenarity={@type=korap:boundary,min=2,max=2}}}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(unary2.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//		query = "cnx/cat=\"NP\" & #1:root";
+//		String unary3 = 
+//				"{@type=korap:span, foundry=cnx, layer=cat, key=NP, match=match:eq, attr={@type=korap:term, root=true}}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(unary3.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//		
+//		query = "cnx/cat=\"NP\" & node & #1>#2 & #1:tokenarity=2";
+//		String unary4 = 
+//					"{@type=korap:group, operation=operation:relation, operands=[" +
+//						"{@type=korap:span, foundry=cnx, layer=cat, key=NP, match=match:eq, attr={@type=korap:term, tokenarity={@type=korap:boundary,min=2,max=2}}}," +
+//						"{@type=korap:span}" +
+//					"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
+//					"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(unary4.replaceAll(" ", ""), map.replaceAll(" ", ""));
+//	}	
+//	
+//	@Test
+//	public void testCommonParent() throws QueryException {
+//		query = "cat=\"NP\" & cat=\"VP\" & #1 $ #2";
+//		String cp1 =
+//				"{@type=korap:group, operation=operation:relation, operands=[" +
+//						"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//							"{@type=korap:group, operation=operation:relation, operands=[" +
+//								"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
+//									"{@type=korap:span}" +
+//								"]}," +
+//								"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
+//							"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
+//						"]}," +
+//						"{@type=korap:span, layer=cat, key=VP, match=match:eq}" +
+//					"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
+//					"";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(cp1.replaceAll(" ", ""), map.replaceAll(" ", ""));		
+//		
+//		query = "cat=\"NP\" & cat=\"VP\" & cat=\"PP\" & #1 $ #2 $ #3";
+//		String cp2 =
+//				"{@type=korap:group, operation=operation:relation, operands=[" +
+//					"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//						"{@type=korap:group, operation=operation:relation, operands=[" +
+//							"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//								"{@type=korap:group, operation=operation:relation, operands=[" +
+//									"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
+//										"{@type=korap:span}" +
+//									"]}," +
+//									"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
+//								"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
+//							"]}," +
+//							"{@type=korap:span, layer=cat, key=VP, match=match:eq}" +
+//						"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
+//						"}" +
+//					"]}," +
+//					"{@type=korap:span, layer=cat, key=PP, match=match:eq}" +
+//				"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
+//				"}";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(cp2.replaceAll(" ", ""), map.replaceAll(" ", ""));		
+//		
+//		query = "cat=\"NP\" & cat=\"VP\" & cat=\"PP\" & cat=\"CP\" & #1 $ #2 $ #3 $ #4";
+//		String cp3 =
+//				"{@type=korap:group, operation=operation:relation, operands=[" +
+//					"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//						"{@type=korap:group, operation=operation:relation, operands=[" +
+//							"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//								"{@type=korap:group, operation=operation:relation, operands=[" +
+//									"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//										"{@type=korap:group, operation=operation:relation, operands=[" +
+//											"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
+//												"{@type=korap:span}" +
+//											"]}," +
+//											"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
+//										"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
+//									"]}," +
+//									"{@type=korap:span, layer=cat, key=VP, match=match:eq}" +
+//								"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
+//							"]}," +
+//							"{@type=korap:span, layer=cat, key=PP, match=match:eq}" +
+//						"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}}" +
+//					"]}," +
+//					"{@type=korap:span, layer=cat, key=CP, match=match:eq}" +
+//				"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c}}" +
+//				"}" +
+//				"";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(cp3.replaceAll(" ", ""), map.replaceAll(" ", ""));		
+//		
+//		query = "cat=\"NP\" & cat=\"VP\" & #1 $* #2";
+//		String cp4 =
+//				"{@type=korap:group, operation=operation:relation, operands=[" +
+//						"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
+//							"{@type=korap:group, operation=operation:relation, operands=[" +
+//								"{@type=korap:group, operation=operation:class, class=128, classOut=128, operands=[" +
+//									"{@type=korap:span}" +
+//								"]}," +
+//								"{@type=korap:span, layer=cat, key=NP, match=match:eq}" +
+//							"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c},boundary={@type=korap:boundary,min=1}}}" +
+//						"]}," +
+//						"{@type=korap:span, layer=cat, key=VP, match=match:eq}" +
+//					"], relation={@type=korap:relation, wrap={@type=korap:term, layer=c},boundary={@type=korap:boundary,min=1}}}" +
+//					"";
+//		aqlt = new AqlTree(query);
+//		map = aqlt.getRequestMap().get("query").toString();
+//		assertEquals(cp4.replaceAll(" ", ""), map.replaceAll(" ", ""));		
+//	}
+	
 	/*		
 	@Test
 	public void testEqualNotequalValue() throws QueryException {
@@ -746,4 +838,4 @@
 	}
 	*/
 	
-}
\ No newline at end of file
+}