You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2021/06/23 15:53:26 UTC

[airavata] 01/03: AIRAVATA-3322 Separate queries for counts and data

This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch airavata-3322
in repository https://gitbox.apache.org/repos/asf/airavata.git

commit 38a5136c296a2c887f7bd131be0b6bbfba1cf071
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Thu Jun 3 17:14:48 2021 -0400

    AIRAVATA-3322 Separate queries for counts and data
---
 .../expcatalog/ExperimentSummaryRepository.java    | 120 +++++++++++++++------
 1 file changed, 88 insertions(+), 32 deletions(-)

diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepository.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepository.java
index 5db3792..aa22c15 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepository.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepository.java
@@ -37,9 +37,13 @@ import org.slf4j.LoggerFactory;
 
 import java.sql.Timestamp;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.persistence.Query;
 
 public class ExperimentSummaryRepository extends ExpCatAbstractRepository<ExperimentSummaryModel, ExperimentSummaryEntity, String> {
     private final static Logger logger = LoggerFactory.getLogger(ExperimentSummaryRepository.class);
@@ -202,44 +206,58 @@ public class ExperimentSummaryRepository extends ExpCatAbstractRepository<Experi
 
             }
 
+            int allExperimentsCount = getExperimentStatisticsCountForState(null, gatewayId, fromDate, toDate,
+                    userName, applicationName, resourceHostName, accessibleExperimentIds);
             List<ExperimentSummaryModel> allExperiments = getExperimentStatisticsForState(null, gatewayId,
                     fromDate, toDate, userName, applicationName, resourceHostName, accessibleExperimentIds);
-            experimentStatistics.setAllExperimentCount(allExperiments.size());
+            experimentStatistics.setAllExperimentCount(allExperimentsCount);
             experimentStatistics.setAllExperiments(allExperiments);
 
-            List<ExperimentSummaryModel> createdExperiments = getExperimentStatisticsForState(ExperimentState.CREATED, gatewayId,
+            List<ExperimentState> createdStates = Arrays.asList(ExperimentState.CREATED, ExperimentState.VALIDATED);
+            int createdExperimentsCount = getExperimentStatisticsCountForState(
+                    createdStates, gatewayId, fromDate, toDate,
+                    userName, applicationName, resourceHostName, accessibleExperimentIds);
+            List<ExperimentSummaryModel> createdExperiments = getExperimentStatisticsForState(createdStates, gatewayId,
                     fromDate, toDate, userName, applicationName, resourceHostName, accessibleExperimentIds);
-            createdExperiments.addAll(getExperimentStatisticsForState(ExperimentState.VALIDATED, gatewayId,
-                    fromDate, toDate, userName, applicationName, resourceHostName, accessibleExperimentIds));
-            experimentStatistics.setCreatedExperimentCount(createdExperiments.size());
+            experimentStatistics.setCreatedExperimentCount(createdExperimentsCount);
             experimentStatistics.setCreatedExperiments(createdExperiments);
 
-            List<ExperimentSummaryModel> runningExperiments = getExperimentStatisticsForState(ExperimentState.EXECUTING, gatewayId,
+            List<ExperimentState> runningStates = Arrays.asList(ExperimentState.EXECUTING, ExperimentState.SCHEDULED, ExperimentState.LAUNCHED);
+            int runningExperimentsCount = getExperimentStatisticsCountForState(
+                    runningStates, gatewayId,
+                    fromDate, toDate, userName, applicationName, resourceHostName, accessibleExperimentIds);
+            List<ExperimentSummaryModel> runningExperiments = getExperimentStatisticsForState(runningStates, gatewayId,
                     fromDate, toDate, userName, applicationName, resourceHostName, accessibleExperimentIds);
-            runningExperiments.addAll(getExperimentStatisticsForState(ExperimentState.SCHEDULED, gatewayId, fromDate,
-                    toDate, userName, applicationName, resourceHostName, accessibleExperimentIds));
-            runningExperiments.addAll(getExperimentStatisticsForState(ExperimentState.LAUNCHED, gatewayId, fromDate,
-                    toDate, userName, applicationName, resourceHostName, accessibleExperimentIds));
-            experimentStatistics.setRunningExperimentCount(runningExperiments.size());
+            experimentStatistics.setRunningExperimentCount(runningExperimentsCount);
             experimentStatistics.setRunningExperiments(runningExperiments);
 
+            List<ExperimentState> completedStates = Arrays.asList(ExperimentState.COMPLETED);
+            int completedExperimentsCount = getExperimentStatisticsCountForState(
+                    completedStates, gatewayId,
+                    fromDate, toDate, userName, applicationName, resourceHostName, accessibleExperimentIds);
             List<ExperimentSummaryModel> completedExperiments = getExperimentStatisticsForState(
-                    ExperimentState.COMPLETED, gatewayId, fromDate, toDate, userName, applicationName, resourceHostName,
+                    completedStates, gatewayId, fromDate, toDate, userName, applicationName, resourceHostName,
                     accessibleExperimentIds);
-            experimentStatistics.setCompletedExperimentCount(completedExperiments.size());
+            experimentStatistics.setCompletedExperimentCount(completedExperimentsCount);
             experimentStatistics.setCompletedExperiments(completedExperiments);
 
-            List<ExperimentSummaryModel> failedExperiments = getExperimentStatisticsForState(ExperimentState.FAILED,
+            List<ExperimentState> failedStates = Arrays.asList(ExperimentState.FAILED);
+            int failedExperimentsCount = getExperimentStatisticsCountForState(
+                    failedStates, gatewayId,
+                    fromDate, toDate, userName, applicationName, resourceHostName, accessibleExperimentIds);
+            List<ExperimentSummaryModel> failedExperiments = getExperimentStatisticsForState(failedStates,
                     gatewayId, fromDate, toDate, userName, applicationName, resourceHostName, accessibleExperimentIds);
-            experimentStatistics.setFailedExperimentCount(failedExperiments.size());
+            experimentStatistics.setFailedExperimentCount(failedExperimentsCount);
             experimentStatistics.setFailedExperiments(failedExperiments);
 
+            List<ExperimentState> cancelledStates = Arrays.asList(ExperimentState.CANCELED, ExperimentState.CANCELING);
+            int cancelledExperimentsCount = getExperimentStatisticsCountForState(
+                    cancelledStates, gatewayId,
+                    fromDate, toDate, userName, applicationName, resourceHostName, accessibleExperimentIds);
             List<ExperimentSummaryModel> cancelledExperiments = getExperimentStatisticsForState(
-                    ExperimentState.CANCELED, gatewayId, fromDate, toDate, userName, applicationName, resourceHostName,
+                    cancelledStates, gatewayId, fromDate, toDate, userName, applicationName, resourceHostName,
                     accessibleExperimentIds);
-            cancelledExperiments.addAll(getExperimentStatisticsForState(ExperimentState.CANCELING, gatewayId, fromDate,
-                    toDate, userName, applicationName, resourceHostName, accessibleExperimentIds));
-            experimentStatistics.setCancelledExperimentCount(cancelledExperiments.size());
+            experimentStatistics.setCancelledExperimentCount(cancelledExperimentsCount);
             experimentStatistics.setCancelledExperiments(cancelledExperiments);
 
             return experimentStatistics;
@@ -252,22 +270,62 @@ public class ExperimentSummaryRepository extends ExpCatAbstractRepository<Experi
 
     }
 
-    protected List<ExperimentSummaryModel> getExperimentStatisticsForState(ExperimentState experimentState, String gatewayId, Timestamp fromDate, Timestamp toDate,
+    protected int getExperimentStatisticsCountForState(List<ExperimentState> experimentStates, String gatewayId, Timestamp fromDate, Timestamp toDate,
+                                                                           String userName, String applicationName, String resourceHostName, List<String> experimentIds) throws RegistryException, IllegalArgumentException {
+        String query = "SELECT count(ES.experimentId) FROM " + ExperimentSummaryEntity.class.getSimpleName() + " ES WHERE ";
+        Map<String, Object> queryParameters = new HashMap<>();
+
+        String finalQuery = filterExperimentStatisticsQuery(query, queryParameters, experimentStates, gatewayId, 
+            fromDate, toDate, userName, applicationName, resourceHostName, experimentIds);
+        
+        if (finalQuery == null) {
+            return 0;
+        }
+
+        long count = (long) execute(entityManager -> {
+            Query jpaQuery = entityManager.createQuery(finalQuery);
+            for (Map.Entry<String, Object> entry : queryParameters.entrySet()) {
+
+                jpaQuery.setParameter(entry.getKey(), entry.getValue());
+            }
+            return jpaQuery.getSingleResult();
+        });
+        return Long.valueOf(count).intValue();
+    }
+
+    protected List<ExperimentSummaryModel> getExperimentStatisticsForState(List<ExperimentState> experimentStates, String gatewayId, Timestamp fromDate, Timestamp toDate,
                                                                            String userName, String applicationName, String resourceHostName, List<String> experimentIds) throws RegistryException, IllegalArgumentException {
 
         String query = "SELECT ES FROM " + ExperimentSummaryEntity.class.getSimpleName() + " ES WHERE ";
         Map<String, Object> queryParameters = new HashMap<>();
 
-        if (experimentState != null) {
-            logger.debug("Filter Experiments by Experiment State");
-            queryParameters.put(DBConstants.ExperimentSummary.EXPERIMENT_STATUS, experimentState);
-            query += "ES.experimentStatus LIKE :" + DBConstants.ExperimentSummary.EXPERIMENT_STATUS + " AND ";
+        query = filterExperimentStatisticsQuery(query, queryParameters, experimentStates, gatewayId, 
+            fromDate, toDate, userName, applicationName, resourceHostName, experimentIds);
+
+        if (query == null) {
+            return new ArrayList<ExperimentSummaryModel>();
+        }
+
+        query += "ORDER BY ES.creationTime DESC";
+        List<ExperimentSummaryModel> experimentSummaryModelList = select(query, Integer.MAX_VALUE, 0, queryParameters);
+        return experimentSummaryModelList;
+    }
+
+    protected String filterExperimentStatisticsQuery(String query, Map<String, Object> queryParameters, 
+            List<ExperimentState> experimentStates, String gatewayId, Timestamp fromDate, 
+            Timestamp toDate, String userName, String applicationName, String resourceHostName, List<String> experimentIds) {
+
+        if (experimentStates != null) {
+            logger.debug("Filter Experiments by Experiment States");
+            List<String> statesAsStrings = experimentStates.stream().map(s -> s.toString()).collect(Collectors.toList());
+            queryParameters.put(DBConstants.ExperimentSummary.EXPERIMENT_STATUS, statesAsStrings);
+            query += "ES.experimentStatus IN :" + DBConstants.ExperimentSummary.EXPERIMENT_STATUS + " AND ";
         }
 
         if (gatewayId != null) {
             logger.debug("Filter Experiments by GatewayId");
             queryParameters.put(DBConstants.Experiment.GATEWAY_ID, gatewayId);
-            query += "ES.gatewayId LIKE :" + DBConstants.Experiment.GATEWAY_ID + " AND ";
+            query += "ES.gatewayId = :" + DBConstants.Experiment.GATEWAY_ID + " AND ";
         }
 
         if (fromDate != null && toDate != null) {
@@ -283,13 +341,13 @@ public class ExperimentSummaryRepository extends ExpCatAbstractRepository<Experi
         if (userName != null) {
             logger.debug("Filter Experiments by UserName");
             queryParameters.put(DBConstants.Experiment.USER_NAME, userName);
-            query += "ES.userName LIKE :" + DBConstants.Experiment.USER_NAME + " AND ";
+            query += "ES.userName = :" + DBConstants.Experiment.USER_NAME + " AND ";
         }
 
         if (applicationName != null) {
             logger.debug("Filter Experiments by ApplicationName");
             queryParameters.put(DBConstants.Experiment.EXECUTION_ID, applicationName);
-            query += "ES.executionId LIKE :" + DBConstants.Experiment.EXECUTION_ID + " AND ";
+            query += "ES.executionId = :" + DBConstants.Experiment.EXECUTION_ID + " AND ";
         }
 
         if (experimentIds != null) {
@@ -298,14 +356,14 @@ public class ExperimentSummaryRepository extends ExpCatAbstractRepository<Experi
                 queryParameters.put(DBConstants.Experiment.EXPERIMENT_ID, experimentIds);
                 query += "ES.experimentId IN :" + DBConstants.Experiment.EXPERIMENT_ID + " AND ";
             } else {
-                return new ArrayList<ExperimentSummaryModel>();
+                return null;
             }
         }
 
         if (resourceHostName != null) {
             logger.debug("Filter Experiments by ResourceHostName");
             queryParameters.put(DBConstants.Experiment.RESOURCE_HOST_ID, resourceHostName);
-            query += "ES.resourceHostId LIKE :" + DBConstants.Experiment.RESOURCE_HOST_ID + " ";
+            query += "ES.resourceHostId = :" + DBConstants.Experiment.RESOURCE_HOST_ID + " ";
         }
 
         else {
@@ -313,9 +371,7 @@ public class ExperimentSummaryRepository extends ExpCatAbstractRepository<Experi
             query = query.substring(0, query.length() - 4);
         }
 
-        query += "ORDER BY ES.creationTime DESC";
-        List<ExperimentSummaryModel> experimentSummaryModelList = select(query, Integer.MAX_VALUE, 0, queryParameters);
-        return experimentSummaryModelList;
+        return query;
     }
 
 }