Update statistics in VC info and list web-services to use VC cache

(referTo) instead of the original KoralQuery definitions (#791).

Change-Id: I6c4d965e060faf53fe01b5e533c84bdfae8d992a
diff --git a/Changes b/Changes
index 4cf31b7..44e175c 100644
--- a/Changes
+++ b/Changes
@@ -1,3 +1,8 @@
+# version 0.77-SNAPSHOT
+
+- Update statistics in VC info and list web-services to use VC cache (referTo) 
+  instead of the original KoralQuery definitions (#791).
+
 # version 0.76
 
 - Add institution & landingPage to the resource web-service (#777)
diff --git a/src/main/java/de/ids_mannheim/korap/core/service/StatisticService.java b/src/main/java/de/ids_mannheim/korap/core/service/StatisticService.java
index e4451b8..f7fadb1 100644
--- a/src/main/java/de/ids_mannheim/korap/core/service/StatisticService.java
+++ b/src/main/java/de/ids_mannheim/korap/core/service/StatisticService.java
@@ -22,26 +22,34 @@
     @Autowired
     private KustvaktConfiguration config;
 
-    public String retrieveStatisticsForCorpusQuery (List<String> cqList) throws KustvaktException {
+	public String retrieveStatisticsForCorpusQuery (List<String> cqList)
+			throws KustvaktException {
 
-        KoralCollectionQueryBuilder builder = new KoralCollectionQueryBuilder();
-        String cq = combineMultipleCorpusQuery(cqList);
-        String json = null;
-        if (cq != null && !cq.isEmpty()) {
-            builder.with(cq);
-            json = builder.toJSON();
-        }
+		String json = buildKoralQueryFromCorpusQuery(cqList);
+		String stats = searchKrill.getStatistics(json);
 
-        if (json != null) {
-            checkVC(json);
-        }
-        String stats = searchKrill.getStatistics(json);
+		if (stats.contains("-1")) {
+			throw new KustvaktException(StatusCodes.NO_RESULT_FOUND);
+		}
+		return stats;
+	}
 
-        if (stats.contains("-1")) {
-            throw new KustvaktException(StatusCodes.NO_RESULT_FOUND);
-        }
-        return stats;
-    }
+	public String buildKoralQueryFromCorpusQuery (List<String> cqList)
+			throws KustvaktException {
+		KoralCollectionQueryBuilder builder = new KoralCollectionQueryBuilder();
+		String cq = combineMultipleCorpusQuery(cqList);
+		String json = null;
+		if (cq != null && !cq.isEmpty()) {
+			builder.with(cq);
+			json = builder.toJSON();
+		}
+
+		if (json != null) {
+			checkVC(json);
+		}
+		return json;
+	}
+    
 
     private void checkVC (String json) throws KustvaktException {
         JsonNode node = JsonUtils.readTree(json);
diff --git a/src/main/java/de/ids_mannheim/korap/service/QueryService.java b/src/main/java/de/ids_mannheim/korap/service/QueryService.java
index 1962167..e3591c3 100644
--- a/src/main/java/de/ids_mannheim/korap/service/QueryService.java
+++ b/src/main/java/de/ids_mannheim/korap/service/QueryService.java
@@ -23,6 +23,7 @@
 import de.ids_mannheim.korap.constant.PrivilegeType;
 import de.ids_mannheim.korap.constant.QueryType;
 import de.ids_mannheim.korap.constant.ResourceType;
+import de.ids_mannheim.korap.core.service.StatisticService;
 import de.ids_mannheim.korap.dao.AdminDao;
 import de.ids_mannheim.korap.dao.QueryDao;
 import de.ids_mannheim.korap.dao.RoleDao;
@@ -90,6 +91,9 @@
     @Autowired
     private UserGroupService userGroupService;
     @Autowired
+    private StatisticService statisticService;
+    
+    @Autowired
     private SearchKrill krill;
     @Autowired
     private FullConfiguration config;
@@ -144,15 +148,24 @@
         Iterator<QueryDO> i = queryList.iterator();
         while (i.hasNext()) {
             query = i.next();
-            // String json = query.getKoralQuery();
+            String json = "";
             String statistics = null;
-            // if (queryType.equals(QueryType.VIRTUAL_CORPUS)) {
-            // statistics = krill.getStatistics(json);
-            // }
-            QueryDto dto = converter.createQueryDto(query, statistics);
-            dtos.add(dto);
-        }
-        return dtos;
+			if (queryType.equals(QueryType.VIRTUAL_CORPUS)) {
+				if (query.isCached()) {
+					List<String> cqList = new ArrayList<>(1);
+					cqList.add("referTo " + query.getName());
+					json = statisticService
+							.buildKoralQueryFromCorpusQuery(cqList);
+				}
+				else {
+					json = query.getKoralQuery();
+				}
+				statistics = krill.getStatistics(json);
+			}
+			QueryDto dto = converter.createQueryDto(query, statistics);
+			dtos.add(dto);
+		}
+		return dtos;
     }
 
     public void deleteQueryByName (String deletedBy, String queryName,
@@ -675,24 +688,30 @@
         return query;
     }
 
-    public QueryDto retrieveQueryByName (String username, String queryName,
+	public QueryDto retrieveQueryByName (String username, String queryName,
             String createdBy, QueryType queryType) throws KustvaktException {
         QueryDO query = searchQueryByName(username, queryName, createdBy,
                 queryType);
 
         String statistics = null;
-        // long start,end;
-        // start = System.currentTimeMillis();
-         if (query.getQueryType().equals(QueryType.VIRTUAL_CORPUS)) {
-              String json = query.getKoralQuery();
-              statistics = krill.getStatistics(json);
-         }
-        // end = System.currentTimeMillis();
-        // jlog.debug("{} statistics duration: {}", queryName, (end -
-        // start));
+        String json = "";
+		if (query.getQueryType().equals(QueryType.VIRTUAL_CORPUS)) {
+			if (query.isCached()) {
+				List<String> cqList = new ArrayList<>(1);
+				cqList.add("referTo " + query.getName());
+				json = statisticService
+						.buildKoralQueryFromCorpusQuery(cqList);
+			}
+			else { 
+				json = query.getKoralQuery();
+			}
+			statistics = krill.getStatistics(json);
+		}
         return converter.createQueryDto(query, statistics);
     }
 
+    //EM: unused
+	@Deprecated
     public QueryDto searchQueryById (String username, int queryId)
             throws KustvaktException {
 
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusListTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusListTest.java
index 7f45f6f..1315c95 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusListTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusListTest.java
@@ -1,14 +1,21 @@
 package de.ids_mannheim.korap.web.controller.vc;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+import java.io.IOException;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import com.fasterxml.jackson.databind.JsonNode;
 
+import de.ids_mannheim.korap.cache.VirtualCorpusCache;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.user.User.CorpusAccess;
+import de.ids_mannheim.korap.util.QueryException;
 import jakarta.ws.rs.ProcessingException;
 import jakarta.ws.rs.core.Response;
 
@@ -27,7 +34,7 @@
 
     @Test
     public void testListVCPearl ()
-            throws ProcessingException, KustvaktException {
+            throws ProcessingException, KustvaktException, IOException, QueryException {
         JsonNode node = testListOwnerVC("pearl");
         assertEquals(0, node.size());
         node = listVC("pearl");
@@ -35,14 +42,13 @@
         node = node.get(0);
 		assertEquals("system-vc", node.at("/name").asText());
 		assertEquals("system", node.at("/type").asText());
-		assertEquals("experimental", node.at("/status").asText());
 		assertEquals(CorpusAccess.ALL.name(),
 				node.at("/requiredAccess").asText());
 		assertEquals("system", node.at("/createdBy").asText());
-        assertTrue(node.at("/numberOfDoc").isMissingNode());
-        assertTrue(node.at("/numberOfParagraphs").isMissingNode());
-        assertTrue(node.at("/numberOfSentences").isMissingNode());
-        assertTrue(node.at("/numberOfTokens").isMissingNode());
+        assertEquals(11,node.at("/numberOfDoc").asInt());
+        assertEquals(772,node.at("/numberOfParagraphs").asInt());
+        assertEquals(25074,node.at("/numberOfSentences").asInt());
+        assertEquals(665842,node.at("/numberOfTokens").asInt());
     }
 
     @Test