From 915607d17b810b4fc0ca528d3f592680407489cd Mon Sep 17 00:00:00 2001
From: treinar <treinar@treinarPC>
Date: Tue, 26 Mar 2019 11:23:02 +0100
Subject: [PATCH] Optimizing query for forecast summaries

---
 .../controller/session/ForecastBean.java      | 43 ++++++++++---------
 .../vips/logic/entity/ForecastSummary.java    |  1 +
 2 files changed, 23 insertions(+), 21 deletions(-)

diff --git a/src/main/java/no/nibio/vips/logic/controller/session/ForecastBean.java b/src/main/java/no/nibio/vips/logic/controller/session/ForecastBean.java
index 7af5806b..1d9a0a3d 100755
--- a/src/main/java/no/nibio/vips/logic/controller/session/ForecastBean.java
+++ b/src/main/java/no/nibio/vips/logic/controller/session/ForecastBean.java
@@ -20,6 +20,7 @@
 package no.nibio.vips.logic.controller.session;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.base.Functions;
 import java.util.Calendar;
 import java.util.TimeZone;
 import de.micromata.opengis.kml.v_2_2_0.Coordinate;
@@ -908,29 +909,29 @@ public class ForecastBean {
         return retVal;
     }
     
+    /**
+     * Finds the forecast configuration summaries for a given organization
+     * @param organizationId
+     * @return 
+     */
     public List<ForecastConfiguration> getForecastConfigurationSummaries(Integer organizationId)
     {
-        List<ForecastConfiguration> forecastConfigurations = this.getForecastConfigurations(em.find(Organization.class, organizationId));
-        // TODO: Filter forecastconfigurations based on criteria (activity, crops, geography etc)
-        List<ForecastConfiguration> filteredConfigs = new ArrayList<>();
-        Query q = em.createNamedQuery("ForecastSummary.findByForecastConfigurationId");
-        for(ForecastConfiguration config: forecastConfigurations)
-        {
-            if(config.getForecastConfigurationId() < 0)
-            {
-                continue;
-            }
-            config.setForecastSummaries(
-                    
-                    q.setParameter("forecastConfigurationId", config.getForecastConfigurationId())
-                    .getResultList()
-            );
-            if(config.getForecastSummaries() != null && !config.getForecastSummaries().isEmpty())
-            {
-                filteredConfigs.add(config);
-            }
-        }
-        return filteredConfigs;
+        List<ForecastSummary> summaries = em.createNamedQuery("ForecastSummary.findByOrganizationId")
+                .setParameter("organizationId", em.find(Organization.class, organizationId))
+                .getResultList();
+        Map<Long, List<ForecastSummary>> mappedSummaries = new HashMap<>();
+        summaries.forEach((s) -> {
+            List<ForecastSummary> summaryForForecast = mappedSummaries.get(s.getForecastSummaryPK().getForecastConfigurationId()) != null ?
+                    mappedSummaries.get(s.getForecastSummaryPK().getForecastConfigurationId()) : 
+                    new ArrayList<>();
+            summaryForForecast.add(s);
+            mappedSummaries.put(s.getForecastSummaryPK().getForecastConfigurationId(), summaryForForecast);
+        });
+        List<ForecastConfiguration> configurations = em.createNamedQuery("ForecastConfiguration.findByForecastConfigurationIds").setParameter("forecastConfigurationIds", mappedSummaries.keySet()).getResultList();
+        configurations.forEach((conf) -> {
+            conf.setForecastSummaries(mappedSummaries.get(conf.getForecastConfigurationId()));
+        });
+        return configurations;
     }
 
     /**
diff --git a/src/main/java/no/nibio/vips/logic/entity/ForecastSummary.java b/src/main/java/no/nibio/vips/logic/entity/ForecastSummary.java
index a5dc3990..15f347d7 100755
--- a/src/main/java/no/nibio/vips/logic/entity/ForecastSummary.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ForecastSummary.java
@@ -42,6 +42,7 @@ import javax.xml.bind.annotation.XmlRootElement;
     @NamedQuery(name = "ForecastSummary.findAll", query = "SELECT f FROM ForecastSummary f"),
     @NamedQuery(name = "ForecastSummary.findByForecastConfigurationId", query = "SELECT f FROM ForecastSummary f WHERE f.forecastSummaryPK.forecastConfigurationId = :forecastConfigurationId"),
     @NamedQuery(name = "ForecastSummary.findByForecastConfigurationIds", query = "SELECT f FROM ForecastSummary f WHERE f.forecastSummaryPK.forecastConfigurationId IN(:forecastConfigurationIds)"),
+    @NamedQuery(name = "ForecastSummary.findByOrganizationId", query = "SELECT f FROM ForecastSummary f WHERE f.forecastSummaryPK.forecastConfigurationId IN(SELECT f1.forecastConfigurationId FROM ForecastConfiguration f1 WHERE f1.vipsLogicUserId IN (SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId=:organizationId))"),    
     @NamedQuery(name = "ForecastSummary.findBySummaryForDate", query = "SELECT f FROM ForecastSummary f WHERE f.forecastSummaryPK.summaryForDate = :summaryForDate"),
     @NamedQuery(name = "ForecastSummary.findBySummaryCreatedTime", query = "SELECT f FROM ForecastSummary f WHERE f.summaryCreatedTime = :summaryCreatedTime"),
     @NamedQuery(name = "ForecastSummary.findByWarningStatus", query = "SELECT f FROM ForecastSummary f WHERE f.warningStatus = :warningStatus")})
-- 
GitLab