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