Add VC rewrite for statistics web-service #796

Change-Id: I6d76cabeec833f685aaceade0724738681ed85c3
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/FoundryRewriteTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/FoundryRewriteTest.java
index 51e7fc5..15c3d7a 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/FoundryRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/FoundryRewriteTest.java
@@ -38,7 +38,7 @@
     public KustvaktConfiguration config;
 
     @Autowired
-    public RewriteHandler handler;
+    public RewriteHandler rewriteHandler;
 
     @Autowired
     private LayerMapper m;
@@ -79,7 +79,7 @@
         String username = "bubbles";
         QuerySerializer s = new QuerySerializer();
         s.setQuery("[pos=ADJA]", "poliqarp");
-        String result = handler.processQuery(s.toJSON(),
+        String result = rewriteHandler.processQuery(s.toJSON(),
                 new KorAPUser(username));
         JsonNode node = JsonUtils.readTree(result);
         assertEquals(node.at("/query/wrap/foundry").asText(), "corenlp");
@@ -93,7 +93,7 @@
         String username = "bubbles";
         QuerySerializer s = new QuerySerializer();
         s.setQuery("[base=Haus]", "poliqarp");
-        String result = handler.processQuery(s.toJSON(),
+        String result = rewriteHandler.processQuery(s.toJSON(),
                 new KorAPUser(username));
         JsonNode node = JsonUtils.readTree(result);
         // EM: only for testing, in fact, opennlp lemma does not
@@ -117,7 +117,7 @@
             throws KustvaktException {
         QuerySerializer s = new QuerySerializer();
         s.setQuery("[base=Haus]", "poliqarp");
-        String result = handler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
         JsonNode node = JsonUtils.readTree(result);
         assertNotNull(node);
         assertFalse(node.at("/query/wrap/foundry").isMissingNode());
@@ -134,7 +134,7 @@
             throws KustvaktException {
         QuerySerializer s = new QuerySerializer();
         s.setQuery("[pos=ADJA]", "poliqarp");
-        String result = handler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
         JsonNode node = JsonUtils.readTree(result);
         assertNotNull(node);
         assertFalse(node.at("/query/wrap/foundry").isMissingNode());
@@ -151,7 +151,7 @@
             throws KustvaktException {
         QuerySerializer s = new QuerySerializer();
         s.setQuery("[orth=laufe/i & base!=Lauf]", "poliqarp");
-        String result = handler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
         JsonNode node = JsonUtils.readTree(result);
         assertNotNull(node);
         assertEquals(node.at("/query/wrap/@type").asText(), "koral:termGroup");
@@ -166,7 +166,7 @@
             throws KustvaktException {
         QuerySerializer s = new QuerySerializer();
         s.setQuery("[(base=laufen | tt/pos=VVFIN)]", "poliqarp");
-        String result = handler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
         JsonNode node = JsonUtils.readTree(result);
         assertNotNull(node);
         assertEquals(node.at("/query/wrap/@type").asText(), "koral:termGroup");
@@ -180,7 +180,7 @@
     public void testFoundryBaseRewrite () throws KustvaktException {
         QuerySerializer s = new QuerySerializer();
         s.setQuery("[orth=laufen]", "poliqarp");
-        String result = handler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
         JsonNode node = JsonUtils.readTree(result);
         assertEquals(node.at("/query/wrap/@type").asText(), "koral:term");
         assertFalse(node.at("/query/wrap/foundry").isMissingNode());
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/QueryContextRewriteTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/QueryContextRewriteTest.java
index 699fba2..04bcf43 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/QueryContextRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/QueryContextRewriteTest.java
@@ -19,7 +19,7 @@
 public class QueryContextRewriteTest extends SpringJerseyTest {
     
     @Autowired
-    public RewriteHandler handler;
+    public RewriteHandler rewriteHandler;
     
     @Autowired
     private KustvaktConfiguration config;
@@ -61,7 +61,7 @@
         assertEquals(60, context.at("/left/1").asInt());
         assertEquals(60, context.at("/right/1").asInt());
         
-        String result = handler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
         JsonNode node = JsonUtils.readTree(result);
         
         context = node.at("/meta/context");
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/ResultRewriteTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/ResultRewriteTest.java
index ba2cbfd..a7507fd 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/ResultRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/ResultRewriteTest.java
@@ -18,13 +18,13 @@
 public class ResultRewriteTest extends SpringJerseyTest {
 
     @Autowired
-    public RewriteHandler ha;
+    public RewriteHandler rewriteHandler;
 
     @Test
     public void testPostRewriteNothingToDo () throws KustvaktException {
-        assertEquals(true, ha.add(AvailabilityRewrite.class),
+        assertEquals(true, rewriteHandler.add(AvailabilityRewrite.class),
                 "Handler could not be added to rewrite handler instance!");
-        String v = ha.processResult(TestVariables.RESULT, null);
+        String v = rewriteHandler.processResult(TestVariables.RESULT, null);
         assertEquals(JsonUtils.readTree(TestVariables.RESULT),
                 JsonUtils.readTree(v), "results do not match");
     }
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/StatisticsControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/StatisticsControllerTest.java
index 6ddc583..6c68ce6 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/StatisticsControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/StatisticsControllerTest.java
@@ -193,17 +193,4 @@
         assertEquals(772, node.at("/paragraphs").asInt());
     }
     
-    @Test
-    public void testStatisticsWithNamedVC () throws KustvaktException {
-        Response response = target().path(API_VERSION).path("statistics")
-                .queryParam("cq", "referTo unknownVC")
-                .request().method("GET");
-        String ent = response.readEntity(String.class);
-        assertEquals(Status.OK.getStatusCode(), response.getStatus());
-        JsonNode node = JsonUtils.readTree(ent);
-        assertEquals(0, node.at("/documents").asInt());
-        assertEquals(0, node.at("/tokens").asInt());
-        assertEquals(0, node.at("/sentences").asInt());
-        assertEquals(0, node.at("/paragraphs").asInt());
-    }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusReferenceTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusReferenceTest.java
index c7a3eec..9946649 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusReferenceTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusReferenceTest.java
@@ -120,11 +120,41 @@
         Response response = target().path(API_VERSION).path("statistics")
                 .queryParam("cq", corpusQuery).request().get();
         String ent = response.readEntity(String.class);
+        assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
+        JsonNode node = JsonUtils.readTree(ent);
+		assertEquals(StatusCodes.NO_RESOURCE_FOUND,
+				node.at("/errors/0/0").asInt());
+        assertEquals("Virtual corpus system/unknown-vc is not found.", 
+        		node.at("/errors/0/1").asText());
+		assertEquals("system/unknown-vc", node.at("/errors/0/2").asText());
+    }
+    
+    @Test
+    public void testStatisticsWithUserUnknownVC () throws KustvaktException {
+        String corpusQuery = "referTo \"nemo/unknown-vc\"";
+        Response response = target().path(API_VERSION).path("statistics")
+                .queryParam("cq", corpusQuery).request().get();
+        String ent = response.readEntity(String.class);
+        assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
+        JsonNode node = JsonUtils.readTree(ent);
+        assertEquals(StatusCodes.NO_RESOURCE_FOUND,
+				node.at("/errors/0/0").asInt());
+        assertEquals("Virtual corpus nemo/unknown-vc is not found.", 
+        		node.at("/errors/0/1").asText());
+		assertEquals("nemo/unknown-vc", node.at("/errors/0/2").asText());
+    }
+    
+    private void testStatisticsWithUserVC (String vcName) throws KustvaktException {
+        String corpusQuery = "referTo \"marlin/"+vcName+"\"";
+        Response response = target().path(API_VERSION).path("statistics")
+                .queryParam("cq", corpusQuery).request().get();
+        String ent = response.readEntity(String.class);
         assertEquals(Status.OK.getStatusCode(), response.getStatus());
         JsonNode node = JsonUtils.readTree(ent);
-        assertEquals(0, node.at("/documents").asInt());
-        assertEquals(0, node.at("/tokens").asInt());
-        assertEquals(0, node.at("/sentences").asInt());
+        assertEquals(11, node.at("/documents").asInt());
+        assertEquals(665842, node.at("/tokens").asInt());
+        assertEquals(25074, node.at("/sentences").asInt());
+        assertEquals(772, node.at("/paragraphs").asInt());
     }
     
     @Test
@@ -155,10 +185,11 @@
 
     @Test
     public void testSearchWithRefPublishedVcGuest () throws KustvaktException {
+    	String vcName = "published-vc";
     	createMarlinPublishedVC();
         Response response = target().path(API_VERSION).path("search")
                 .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
-                .queryParam("cq", "referTo \"marlin/published-vc\"").request()
+                .queryParam("cq", "referTo \"marlin/"+vcName+"\"").request()
                 .get();
         String ent = response.readEntity(String.class);
         JsonNode node = JsonUtils.readTree(ent);
@@ -178,14 +209,14 @@
                 node.at("/rewrites/0/original/@type").asText());
         assertEquals("marlin/published-vc",
                 node.at("/rewrites/0/original/ref").asText());
+        
+        testStatisticsWithUserVC(vcName);
+        testSearchWithRefPublishedVc(vcName);
+        
         deleteVC("published-vc", "marlin", "marlin");
     }
 
-    @Test
-    public void testSearchWithRefPublishedVc () throws KustvaktException {
-        String vcName = "marlin-published-vc";
-        createPublishedVC("marlin", vcName);
-
+    private void testSearchWithRefPublishedVc (String vcName) throws KustvaktException {
         Response response = target().path(API_VERSION).path("search")
                 .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
                 .queryParam("cq", "referTo \"marlin/" + vcName + "\"").request()
@@ -196,12 +227,17 @@
         JsonNode node = JsonUtils.readTree(ent);
         assertTrue(node.at("/matches").size() > 0);
 
+		node = node.at("/collection/rewrites/0");
+		assertEquals("operation:override", node.at("/operation").asText());
+		assertEquals("marlin/published-vc",
+				node.at("/original/ref").asText());
+		assertEquals("koral:docGroupRef", node.at("/original/@type").asText());
+        
         node = getHiddenGroup(vcName);
         assertEquals("system", node.at("/owner").asText());
         assertEquals(UserGroupStatus.HIDDEN.name(),
                 node.at("/status").asText());
         node = node.at("/members");
         assertEquals("squirt", node.at("/0/userId").asText());
-        deleteVC(vcName, "marlin", "marlin");
     }
 }
diff --git a/src/test/resources/log4j2-test.properties b/src/test/resources/log4j2-test.properties
index 186ab06..54fbc8b 100644
--- a/src/test/resources/log4j2-test.properties
+++ b/src/test/resources/log4j2-test.properties
@@ -20,7 +20,7 @@
 rootLogger.appenderRefs = console
 rootLogger.appenderRef.stdout.ref = STDOUT
 
-loggers=hibernate,auth,ldap
+loggers=hibernate,auth,ldap,krill
 #loggers=console
 #logger.console.name=com.sun.jersey.test.framework.spi.container
 #logger.console.level = info
@@ -52,4 +52,10 @@
 logger.ldap.level = info
 logger.ldap.appenderRefs = file
 logger.ldap.appenderRef.file.ref = LDAP_LOG
-logger.ldap.additivity=false
\ No newline at end of file
+logger.ldap.additivity=false
+
+logger.krill.name=de.ids_mannheim.korap.KrillCollection
+logger.krill.level = info
+logger.krill.appenderRefs = file
+logger.krill.appenderRef.file.ref = MAIN_LOG
+logger.krill.additivity=false
\ No newline at end of file
diff --git a/src/test/resources/test-config.xml b/src/test/resources/test-config.xml
index 343ca96..7a95588 100644
--- a/src/test/resources/test-config.xml
+++ b/src/test/resources/test-config.xml
@@ -81,6 +81,30 @@
 		<property name="testConnectionOnCheckout" value="true" />
 	</bean>
 
+<!-- <bean id="sqliteDataSource"
+		class="org.springframework.jdbc.datasource.SingleConnectionDataSource"
+		lazy-init="true">
+		<property name="driverClassName" value="${jdbc.driverClassName}" />
+		<property name="url" value="${jdbc.url}" />
+		<property name="username" value="${jdbc.username}" />
+		<property name="password" value="${jdbc.password}" />
+		<property name="connectionProperties">
+			<props>
+				<prop key="date_string_format">yyyy-MM-dd HH:mm:ss</prop>
+			</props>
+		</property>
+
+		Sqlite can only have a single connection
+		<property name="suppressClose">
+			<value>true</value>
+		</property>
+	</bean>
+ -->
+ 
+ <!-- <bean id='cacheManager' class='org.springframework.cache.ehcache.EhCacheCacheManager' 
+		p:cacheManager-ref='ehcache' /> <bean id='ehcache' class='org.springframework.cache.ehcache.EhCacheManagerFactoryBean' 
+		p:configLocation='classpath:ehcache.xml' p:shared='true' /> -->
+		
 	<!-- to configure database for sqlite, mysql, etc. migrations -->
 	<bean id="flywayConfig"
 		class="org.flywaydb.core.api.configuration.ClassicConfiguration">
@@ -213,6 +237,18 @@
 		class="de.ids_mannheim.korap.rewrite.RewriteHandler">
 		<constructor-arg ref="rewriteTasks" />
 	</bean>
+	
+	<util:list id="statisticsRewriteTasks"
+		value-type="de.ids_mannheim.korap.rewrite.RewriteTask">
+		<ref bean="foundryRewrite" />
+		<ref bean="virtualCorpusRewrite" />
+		<ref bean="queryReferenceRewrite" />
+	</util:list>
+	
+	<bean id="statisticsRewriteHandler"
+		class="de.ids_mannheim.korap.rewrite.RewriteHandler">
+		<constructor-arg ref="statisticsRewriteTasks" />
+	</bean>
 
 	<bean id="kustvaktResponseHandler"
 		class="de.ids_mannheim.korap.web.KustvaktResponseHandler">