- unary operators
- free reference string (not just counting numbers)
diff --git a/src/test/java/de/ids_mannheim/korap/query/serialize/AnnisQueryProcessorTest.java b/src/test/java/de/ids_mannheim/korap/query/serialize/AnnisQueryProcessorTest.java
index 06ea165..b3afe99 100644
--- a/src/test/java/de/ids_mannheim/korap/query/serialize/AnnisQueryProcessorTest.java
+++ b/src/test/java/de/ids_mannheim/korap/query/serialize/AnnisQueryProcessorTest.java
@@ -3,7 +3,6 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Map;
 
 import org.junit.Test;
 
@@ -678,232 +677,222 @@
         assertEquals("korap:reference",     res.at("/query/operands/1/@type").asText());
         assertEquals("operation:focus",     res.at("/query/operands/1/operation").asText());
         assertEquals(129,  res.at("/query/operands/1/classRef/0").asInt());
+
+    }
+    @Test
+    public void testPositions() throws Exception {
+        query = "node & node & #1 _=_ #2";
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals("korap:group",         res.at("/query/@type").asText());
+        assertEquals("operation:position",  res.at("/query/operation").asText());
+        assertEquals("frames:matches",      res.at("/query/frames/0").asText());
+        assertEquals("korap:span",          res.at("/query/operands/0/@type").asText());
+        assertEquals("korap:span",          res.at("/query/operands/1/@type").asText());
+
+        query = "node & node & #1 _i_ #2";
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals("frames:contains",     res.at("/query/frames/0").asText());
+        assertEquals("korap:span",          res.at("/query/operands/0/@type").asText());
+        assertEquals("korap:span",          res.at("/query/operands/1/@type").asText());
+
+        query = "node & node & #1 _l_ #2";
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals("frames:startswith",   res.at("/query/frames/0").asText());
+        assertEquals("korap:span",          res.at("/query/operands/0/@type").asText());
+        assertEquals("korap:span",          res.at("/query/operands/1/@type").asText());
+
+        query = "node & node & #1 _r_ #2";
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals("frames:endswith",     res.at("/query/frames/0").asText());
+        assertEquals("korap:span",          res.at("/query/operands/0/@type").asText());
+        assertEquals("korap:span",          res.at("/query/operands/1/@type").asText());
+
+        query = "node & \"Mann\" & #1 _r_ #2";
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals("frames:endswith",     res.at("/query/frames/0").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());
+
+        query = "node & \"Mann\" & #2 _r_ #1";
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals("frames:endswith",     res.at("/query/frames/0").asText());
+        assertEquals("korap:span",          res.at("/query/operands/1/@type").asText());
+        assertEquals("korap:token",         res.at("/query/operands/0/@type").asText());
+        assertEquals("Mann",                res.at("/query/operands/0/wrap/key").asText());
+
+        query = "node & cat=\"VP\" & cat=\"NP\" & #1 _r_ #2 & #2 _l_ #3";
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals("frames:startswith",   res.at("/query/frames/0").asText());
+        assertEquals("operation:focus",     res.at("/query/operands/0/operation").asText());
+        assertEquals(128,                   res.at("/query/operands/0/classRef/0").asInt());
+        assertEquals("frames:endswith",     res.at("/query/operands/0/operands/0/frames/0").asText());
+        assertEquals("korap:span",          res.at("/query/operands/0/operands/0/operands/0/@type").asText());
+        assertEquals("korap:group",         res.at("/query/operands/0/operands/0/operands/1/@type").asText());
+        assertEquals("operation:class",     res.at("/query/operands/0/operands/0/operands/1/operation").asText());
+        assertEquals(128,                   res.at("/query/operands/0/operands/0/operands/1/classOut").asInt());
+        assertEquals("VP",                  res.at("/query/operands/0/operands/0/operands/1/operands/0/key").asText());
+        assertEquals("NP",                  res.at("/query/operands/1/key").asText());
+
+        query = "node & \"Mann\" & #2 _o_ #1";
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals("frames:overlapsLeft",     res.at("/query/frames/0").asText());
+        assertEquals("frames:overlapsRight",    res.at("/query/frames/1").asText());
+        assertEquals("korap:span",              res.at("/query/operands/1/@type").asText());
+        assertEquals("korap:token",             res.at("/query/operands/0/@type").asText());
+        assertEquals("Mann",                    res.at("/query/operands/0/wrap/key").asText());
+
+        query = "node & \"Mann\" & #2 _ol_ #1";
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals("frames:overlapsLeft",     res.at("/query/frames/0").asText());
+        assertEquals("korap:span",              res.at("/query/operands/1/@type").asText());
+        assertEquals("korap:token",             res.at("/query/operands/0/@type").asText());
+        assertEquals("Mann",                    res.at("/query/operands/0/wrap/key").asText());
+
+        query = "node & \"Mann\" & #2 _or_ #1";
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals("frames:overlapsRight",    res.at("/query/frames/0").asText());
+        assertEquals("korap:span",              res.at("/query/operands/1/@type").asText());
+        assertEquals("korap:token",             res.at("/query/operands/0/@type").asText());
+        assertEquals("Mann",                    res.at("/query/operands/0/wrap/key").asText());
+    }
+
+    @Test
+    public void testMultiplePredications() throws Exception {
+        // a noun before a verb before a preposition
+        query = "pos=\"N\" & pos=\"V\" & pos=\"P\" & #1 . #2 & #2 . #3"; 
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals("operation:sequence",  res.at("/query/operation").asText());
+        assertEquals("operation:focus",     res.at("/query/operands/0/operation").asText());
+        assertEquals(128,                   res.at("/query/operands/0/classRef/0").asInt());
+        assertEquals("operation:sequence",  res.at("/query/operands/0/operands/0/operation").asText());
+        assertEquals("korap:token",         res.at("/query/operands/0/operands/0/operands/0/@type").asText());
+        assertEquals("p",                   res.at("/query/operands/0/operands/0/operands/0/wrap/layer").asText());
+        assertEquals("N",                   res.at("/query/operands/0/operands/0/operands/0/wrap/key").asText());
+        assertEquals("korap:group",         res.at("/query/operands/0/operands/0/operands/1/@type").asText());
+        assertEquals("operation:class",     res.at("/query/operands/0/operands/0/operands/1/operation").asText());
+        assertEquals(128,                   res.at("/query/operands/0/operands/0/operands/1/classOut").asInt());
+        assertEquals("V",                   res.at("/query/operands/0/operands/0/operands/1/operands/0/wrap/key").asText());
+        assertEquals("P",                   res.at("/query/operands/1/wrap/key").asText());
+
+        query = "pos=\"N\" & pos=\"V\" & #1 . #2 & #2 . pos=\"P\""; 
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals("operation:sequence",  res.at("/query/operation").asText());
+        assertEquals("operation:focus",     res.at("/query/operands/0/operation").asText());
+        assertEquals(128,                   res.at("/query/operands/0/classRef/0").asInt());
+        assertEquals("operation:sequence",  res.at("/query/operands/0/operands/0/operation").asText());
+        assertEquals("korap:token",         res.at("/query/operands/0/operands/0/operands/0/@type").asText());
+        assertEquals("p",                   res.at("/query/operands/0/operands/0/operands/0/wrap/layer").asText());
+        assertEquals("N",                   res.at("/query/operands/0/operands/0/operands/0/wrap/key").asText());
+        assertEquals("korap:group",         res.at("/query/operands/0/operands/0/operands/1/@type").asText());
+        assertEquals("operation:class",     res.at("/query/operands/0/operands/0/operands/1/operation").asText());
+        assertEquals(128,                   res.at("/query/operands/0/operands/0/operands/1/classOut").asInt());
+        assertEquals("V",                   res.at("/query/operands/0/operands/0/operands/1/operands/0/wrap/key").asText());
+        assertEquals("P",                   res.at("/query/operands/1/wrap/key").asText());
+
+        query = "pos=\"N\" & pos=\"V\" & pos=\"P\" & #1 > #2 & #1 > #3";
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals("operation:relation",  res.at("/query/operation").asText());
+        assertEquals("operation:focus",     res.at("/query/operands/0/operation").asText());
+        assertEquals(128,                   res.at("/query/operands/0/classRef/0").asInt());
+        assertEquals("operation:relation",  res.at("/query/operands/0/operands/0/operation").asText());
+        assertEquals("operation:class",     res.at("/query/operands/0/operands/0/operands/0/operation").asText());
+        assertEquals(128,                   res.at("/query/operands/0/operands/0/operands/0/classOut").asInt());
+        assertEquals("N",                   res.at("/query/operands/0/operands/0/operands/0/operands/0/wrap/key").asText());
+        assertEquals("V",                   res.at("/query/operands/0/operands/0/operands/1/wrap/key").asText());
+        assertEquals("P",                   res.at("/query/operands/1/wrap/key").asText());
+
+        query = "cat=\"NP\" & pos=\"V\" & pos=\"P\" & #1 > #2 & #1 > #3 & #2 . #3";
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals("operation:sequence",  res.at("/query/operation").asText());
+        assertEquals("operation:focus",     res.at("/query/operands/0/operation").asText());
+        assertEquals(129,                   res.at("/query/operands/0/classRef/0").asInt());
+        assertEquals("operation:relation",  res.at("/query/operands/0/operands/0/operation").asText());
+        assertEquals("operation:focus",     res.at("/query/operands/0/operands/0/operands/0/operation").asText());
+        assertEquals(128,                   res.at("/query/operands/0/operands/0/operands/0/classRef/0").asInt());
+        assertEquals("operation:relation",  res.at("/query/operands/0/operands/0/operands/0/operands/0/operation").asText());
+        assertEquals("operation:class",     res.at("/query/operands/0/operands/0/operands/0/operands/0/operands/0/operation").asText());
+        assertEquals(128,                   res.at("/query/operands/0/operands/0/operands/0/operands/0/operands/0/classOut").asInt());
+        assertEquals("NP",                  res.at("/query/operands/0/operands/0/operands/0/operands/0/operands/0/operands/0/key").asText());
+        assertEquals(129,                   res.at("/query/operands/0/operands/0/operands/0/operands/0/operands/1/classOut").asInt());
+        assertEquals("V",                   res.at("/query/operands/0/operands/0/operands/0/operands/0/operands/1/operands/0/wrap/key").asText());
+        assertEquals(130,                   res.at("/query/operands/0/operands/0/operands/1/classOut").asInt());
+        assertEquals("P",                   res.at("/query/operands/0/operands/0/operands/1/operands/0/wrap/key").asText());
+        assertEquals("operation:focus",     res.at("/query/operands/1/operation").asText());
+        assertEquals(130,                   res.at("/query/operands/1/classRef/0").asInt());
+        assertEquals(true,                  res.at("/query/operands/1/operands").isMissingNode());
+    }
+
+    @Test
+    public void testUnaryRelations() throws JsonProcessingException, IOException {
+        query = "node & #1:tokenarity=2";
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals("korap:span",      res.at("/query/@type").asText());
+        assertEquals("korap:term",      res.at("/query/attr/@type").asText());
+        assertEquals("korap:boundary",  res.at("/query/attr/tokenarity/@type").asText());
+        assertEquals(2,                 res.at("/query/attr/tokenarity/min").asInt());
+        assertEquals(2,                 res.at("/query/attr/tokenarity/max").asInt());
+        
+        query = "cnx/cat=\"NP\" & #1:tokenarity=2";
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals("korap:span",      res.at("/query/@type").asText());
+        assertEquals("cnx",             res.at("/query/foundry").asText());
+        assertEquals("c",               res.at("/query/layer").asText());
+        assertEquals("NP",              res.at("/query/key").asText());
+        assertEquals("korap:term",      res.at("/query/attr/@type").asText());
+        assertEquals("korap:boundary",  res.at("/query/attr/tokenarity/@type").asText());
+        assertEquals(2,                 res.at("/query/attr/tokenarity/min").asInt());
+        assertEquals(2,                 res.at("/query/attr/tokenarity/max").asInt());
+        
+        query = "cnx/cat=\"NP\" & #1:tokenarity=2,5";
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals(2,                 res.at("/query/attr/tokenarity/min").asInt());
+        assertEquals(5,                 res.at("/query/attr/tokenarity/max").asInt());
+        
+        query = "cnx/cat=\"NP\" & #1:root";
+        qs.setQuery(query, "annis");
+        res = mapper.readTree(qs.toJSON());
+        assertEquals("korap:span",      res.at("/query/@type").asText());
+        assertEquals("cnx",             res.at("/query/foundry").asText());
+        assertEquals("c",               res.at("/query/layer").asText());
+        assertEquals("NP",              res.at("/query/key").asText());
+        assertEquals("korap:term",      res.at("/query/attr/@type").asText());
+        assertEquals(true,              res.at("/query/attr/root").asBoolean());
+        
+        query = "cnx/cat=\"NP\" & node & #1>#2 & #1:tokenarity=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("cnx",             res.at("/query/operands/0/foundry").asText());
+        assertEquals("c",               res.at("/query/operands/0/layer").asText());
+        assertEquals("NP",              res.at("/query/operands/0/key").asText());
+        assertEquals("korap:term",      res.at("/query/operands/0/attr/@type").asText());
+        assertEquals("korap:boundary",  res.at("/query/operands/0/attr/tokenarity/@type").asText());
+        assertEquals(2,                 res.at("/query/operands/0/attr/tokenarity/min").asInt());
+        assertEquals(2,                 res.at("/query/operands/0/attr/tokenarity/max").asInt());
+        assertEquals("korap:span",      res.at("/query/operands/1/@type").asText());
         
     }
-    	@Test
-    	public void testPositions() throws Exception {
-    		query = "node & node & #1 _=_ #2";
-	        qs.setQuery(query, "annis");
-	        res = mapper.readTree(qs.toJSON());
-	        assertEquals("korap:group",         res.at("/query/@type").asText());
-	        assertEquals("operation:position",  res.at("/query/operation").asText());
-	        assertEquals("frames:matches",      res.at("/query/frames/0").asText());
-	        assertEquals("korap:span",          res.at("/query/operands/0/@type").asText());
-	        assertEquals("korap:span",          res.at("/query/operands/1/@type").asText());
 
-            query = "node & node & #1 _i_ #2";
-            qs.setQuery(query, "annis");
-            res = mapper.readTree(qs.toJSON());
-            assertEquals("frames:contains",     res.at("/query/frames/0").asText());
-            assertEquals("korap:span",          res.at("/query/operands/0/@type").asText());
-            assertEquals("korap:span",          res.at("/query/operands/1/@type").asText());
-
-            query = "node & node & #1 _l_ #2";
-            qs.setQuery(query, "annis");
-            res = mapper.readTree(qs.toJSON());
-            assertEquals("frames:startswith",   res.at("/query/frames/0").asText());
-            assertEquals("korap:span",          res.at("/query/operands/0/@type").asText());
-            assertEquals("korap:span",          res.at("/query/operands/1/@type").asText());
-
-            query = "node & node & #1 _r_ #2";
-            qs.setQuery(query, "annis");
-            res = mapper.readTree(qs.toJSON());
-            assertEquals("frames:endswith",     res.at("/query/frames/0").asText());
-            assertEquals("korap:span",          res.at("/query/operands/0/@type").asText());
-            assertEquals("korap:span",          res.at("/query/operands/1/@type").asText());
-
-            query = "node & \"Mann\" & #1 _r_ #2";
-            qs.setQuery(query, "annis");
-            res = mapper.readTree(qs.toJSON());
-            assertEquals("frames:endswith",     res.at("/query/frames/0").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());
-
-            query = "node & \"Mann\" & #2 _r_ #1";
-            qs.setQuery(query, "annis");
-            res = mapper.readTree(qs.toJSON());
-            assertEquals("frames:endswith",     res.at("/query/frames/0").asText());
-            assertEquals("korap:span",          res.at("/query/operands/1/@type").asText());
-            assertEquals("korap:token",         res.at("/query/operands/0/@type").asText());
-            assertEquals("Mann",                res.at("/query/operands/0/wrap/key").asText());
-            
-            query = "node & cat=\"VP\" & cat=\"NP\" & #1 _r_ #2 & #2 _l_ #3";
-            qs.setQuery(query, "annis");
-            res = mapper.readTree(qs.toJSON());
-            assertEquals("frames:startswith",   res.at("/query/frames/0").asText());
-            assertEquals("operation:focus",     res.at("/query/operands/0/operation").asText());
-            assertEquals(128,                   res.at("/query/operands/0/classRef/0").asInt());
-            assertEquals("frames:endswith",     res.at("/query/operands/0/operands/0/frames/0").asText());
-            assertEquals("korap:span",          res.at("/query/operands/0/operands/0/operands/0/@type").asText());
-            assertEquals("korap:group",         res.at("/query/operands/0/operands/0/operands/1/@type").asText());
-            assertEquals("operation:class",     res.at("/query/operands/0/operands/0/operands/1/operation").asText());
-            assertEquals(128,                   res.at("/query/operands/0/operands/0/operands/1/classOut").asInt());
-            assertEquals("VP",                  res.at("/query/operands/0/operands/0/operands/1/operands/0/key").asText());
-            assertEquals("NP",                  res.at("/query/operands/1/key").asText());
-            
-            query = "node & \"Mann\" & #2 _o_ #1";
-            qs.setQuery(query, "annis");
-            res = mapper.readTree(qs.toJSON());
-            assertEquals("frames:overlapsLeft",     res.at("/query/frames/0").asText());
-            assertEquals("frames:overlapsRight",    res.at("/query/frames/1").asText());
-            assertEquals("korap:span",              res.at("/query/operands/1/@type").asText());
-            assertEquals("korap:token",             res.at("/query/operands/0/@type").asText());
-            assertEquals("Mann",                    res.at("/query/operands/0/wrap/key").asText());
-            
-            query = "node & \"Mann\" & #2 _ol_ #1";
-            qs.setQuery(query, "annis");
-            res = mapper.readTree(qs.toJSON());
-            assertEquals("frames:overlapsLeft",     res.at("/query/frames/0").asText());
-            assertEquals("korap:span",              res.at("/query/operands/1/@type").asText());
-            assertEquals("korap:token",             res.at("/query/operands/0/@type").asText());
-            assertEquals("Mann",                    res.at("/query/operands/0/wrap/key").asText());
-            
-            query = "node & \"Mann\" & #2 _or_ #1";
-            qs.setQuery(query, "annis");
-            res = mapper.readTree(qs.toJSON());
-            assertEquals("frames:overlapsRight",    res.at("/query/frames/0").asText());
-            assertEquals("korap:span",              res.at("/query/operands/1/@type").asText());
-            assertEquals("korap:token",             res.at("/query/operands/0/@type").asText());
-            assertEquals("Mann",                    res.at("/query/operands/0/wrap/key").asText());
-    	}
-    	
-    	@Test
-    	public void testMultiplePredications() throws Exception {
-    		// a noun before a verb before a preposition
-    		query = "pos=\"N\" & pos=\"V\" & pos=\"P\" & #1 . #2 & #2 . #3"; 
-            qs.setQuery(query, "annis");
-            res = mapper.readTree(qs.toJSON());
-            assertEquals("operation:sequence",  res.at("/query/operation").asText());
-            assertEquals("operation:focus",     res.at("/query/operands/0/operation").asText());
-            assertEquals(128,                   res.at("/query/operands/0/classRef/0").asInt());
-            assertEquals("operation:sequence",  res.at("/query/operands/0/operands/0/operation").asText());
-            assertEquals("korap:token",         res.at("/query/operands/0/operands/0/operands/0/@type").asText());
-            assertEquals("p",                   res.at("/query/operands/0/operands/0/operands/0/wrap/layer").asText());
-            assertEquals("N",                   res.at("/query/operands/0/operands/0/operands/0/wrap/key").asText());
-            assertEquals("korap:group",         res.at("/query/operands/0/operands/0/operands/1/@type").asText());
-            assertEquals("operation:class",     res.at("/query/operands/0/operands/0/operands/1/operation").asText());
-            assertEquals(128,                   res.at("/query/operands/0/operands/0/operands/1/classOut").asInt());
-            assertEquals("V",                   res.at("/query/operands/0/operands/0/operands/1/operands/0/wrap/key").asText());
-            assertEquals("P",                   res.at("/query/operands/1/wrap/key").asText());
-            
-            query = "pos=\"N\" & pos=\"V\" & #1 . #2 & #2 . pos=\"P\""; 
-            qs.setQuery(query, "annis");
-            res = mapper.readTree(qs.toJSON());
-            assertEquals("operation:sequence",  res.at("/query/operation").asText());
-            assertEquals("operation:focus",     res.at("/query/operands/0/operation").asText());
-            assertEquals(128,                   res.at("/query/operands/0/classRef/0").asInt());
-            assertEquals("operation:sequence",  res.at("/query/operands/0/operands/0/operation").asText());
-            assertEquals("korap:token",         res.at("/query/operands/0/operands/0/operands/0/@type").asText());
-            assertEquals("p",                   res.at("/query/operands/0/operands/0/operands/0/wrap/layer").asText());
-            assertEquals("N",                   res.at("/query/operands/0/operands/0/operands/0/wrap/key").asText());
-            assertEquals("korap:group",         res.at("/query/operands/0/operands/0/operands/1/@type").asText());
-            assertEquals("operation:class",     res.at("/query/operands/0/operands/0/operands/1/operation").asText());
-            assertEquals(128,                   res.at("/query/operands/0/operands/0/operands/1/classOut").asInt());
-            assertEquals("V",                   res.at("/query/operands/0/operands/0/operands/1/operands/0/wrap/key").asText());
-            assertEquals("P",                   res.at("/query/operands/1/wrap/key").asText());
-            
-            query = "pos=\"N\" & pos=\"V\" & pos=\"P\" & #1 > #2 & #1 > #3";
-            qs.setQuery(query, "annis");
-            res = mapper.readTree(qs.toJSON());
-            assertEquals("operation:relation",  res.at("/query/operation").asText());
-            assertEquals("operation:focus",     res.at("/query/operands/0/operation").asText());
-            assertEquals(128,                   res.at("/query/operands/0/classRef/0").asInt());
-            assertEquals("operation:relation",  res.at("/query/operands/0/operands/0/operation").asText());
-            assertEquals("operation:class",     res.at("/query/operands/0/operands/0/operands/0/operation").asText());
-            assertEquals(128,                   res.at("/query/operands/0/operands/0/operands/0/classOut").asInt());
-            assertEquals("N",                   res.at("/query/operands/0/operands/0/operands/0/operands/0/wrap/key").asText());
-            assertEquals("V",                   res.at("/query/operands/0/operands/0/operands/1/wrap/key").asText());
-            assertEquals("P",                   res.at("/query/operands/1/wrap/key").asText());
-            
-            query = "cat=\"NP\" & pos=\"V\" & pos=\"P\" & #1 > #2 & #1 > #3 & #2 . #3";
-            qs.setQuery(query, "annis");
-            res = mapper.readTree(qs.toJSON());
-            assertEquals("operation:sequence",  res.at("/query/operation").asText());
-            assertEquals("operation:focus",     res.at("/query/operands/0/operation").asText());
-            assertEquals(129,                   res.at("/query/operands/0/classRef/0").asInt());
-            assertEquals("operation:relation",  res.at("/query/operands/0/operands/0/operation").asText());
-            assertEquals("operation:focus",     res.at("/query/operands/0/operands/0/operands/0/operation").asText());
-            assertEquals(128,                   res.at("/query/operands/0/operands/0/operands/0/classRef/0").asInt());
-            assertEquals("operation:relation",  res.at("/query/operands/0/operands/0/operands/0/operands/0/operation").asText());
-            assertEquals("operation:class",     res.at("/query/operands/0/operands/0/operands/0/operands/0/operands/0/operation").asText());
-            assertEquals(128,                   res.at("/query/operands/0/operands/0/operands/0/operands/0/operands/0/classOut").asInt());
-            assertEquals("NP",                  res.at("/query/operands/0/operands/0/operands/0/operands/0/operands/0/operands/0/key").asText());
-            assertEquals(129,                   res.at("/query/operands/0/operands/0/operands/0/operands/0/operands/1/classOut").asInt());
-            assertEquals("V",                   res.at("/query/operands/0/operands/0/operands/0/operands/0/operands/1/operands/0/wrap/key").asText());
-            assertEquals(130,                   res.at("/query/operands/0/operands/0/operands/1/classOut").asInt());
-            assertEquals("P",                   res.at("/query/operands/0/operands/0/operands/1/operands/0/wrap/key").asText());
-            assertEquals("operation:focus",     res.at("/query/operands/1/operation").asText());
-            assertEquals(130,                   res.at("/query/operands/1/classRef/0").asInt());
-            assertEquals(true,                  res.at("/query/operands/1/operands").isMissingNode());
-    	}
-    		
-    //		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 Exception {
-    //		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 Exception {
     //		query = "cat=\"NP\" & cat=\"VP\" & #1 $ #2";