From e033c523b3b66caac13c2ab84728270d56786cdd Mon Sep 17 00:00:00 2001
From: Tor-Einar Skog <tor-einar.skog@nibio.no>
Date: Fri, 8 Sep 2017 14:38:21 +0200
Subject: [PATCH] Refactoring Result object

---
 .../controller/session/ForecastBean.java      | 16 ++---
 .../vips/logic/entity/ForecastResult.java     | 62 ++++++++++++++-----
 .../vips/logic/messaging/MessagingBean.java   |  6 +-
 .../modules/roughage/RoughageService.java     |  4 +-
 .../DMIPointWebDataParserTest.java            |  2 +-
 5 files changed, 62 insertions(+), 28 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 c205d3e2..f6a4600f 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
@@ -139,10 +139,10 @@ public class ForecastBean {
             return null;
         }
         Calendar cal = Calendar.getInstance();
-        cal.setTime(mostRecentForecastResult.getResultValidTime());
+        cal.setTime(mostRecentForecastResult.getValidTimeStart());
         cal.add(Calendar.DATE, -latestDays);
         Date startDate = cal.getTime();
-        return this.getForecastResults(forecastConfigurationId, startDate, mostRecentForecastResult.getResultValidTime());
+        return this.getForecastResults(forecastConfigurationId, startDate, mostRecentForecastResult.getValidTimeStart());
         
     }
     
@@ -167,8 +167,8 @@ public class ForecastBean {
         Query q = em.createNativeQuery(
                 "SELECT * FROM forecast_result "
                 + "WHERE forecast_configuration_id=:forecastConfigurationId "
-                + "AND result_valid_time = ("
-                        + "SELECT MAX(result_valid_time) "
+                + "AND valid_time_start = ("
+                        + "SELECT MAX(valid_time_start) "
                         + "FROM forecast_result "
                         + "WHERE forecast_configuration_id=:forecastConfigurationId "
                 + ");", ForecastResult.class);
@@ -789,7 +789,7 @@ public class ForecastBean {
                 .append("   TRUNCATE forecast_result_cache;")
                 .append("   INSERT INTO forecast_result_cache ")
                 .append("       SELECT * FROM forecast_result ")
-                .append("       WHERE result_valid_time between :startTime and :endTime ")
+                .append("       WHERE valid_time_start between :startTime and :endTime ")
                 .append("       AND forecast_configuration_id IN (")
                 .append("           SELECT forecast_configuration_id ")
                 .append("           FROM public.forecast_configuration ")
@@ -862,7 +862,7 @@ public class ForecastBean {
             Map<String, Integer> resultDailyAggregate = new HashMap<>();
             for(ForecastResult result:results)
             {
-                String dayStamp = format.format(result.getResultValidTime());
+                String dayStamp = format.format(result.getValidTimeStart());
                 Integer currentWorstCode = resultDailyAggregate.get(dayStamp);
                 resultDailyAggregate.put(dayStamp, 
                     Math.max(
@@ -982,7 +982,7 @@ public class ForecastBean {
                         "       AND location_point_of_interest_id=:locationPointOfInterestId \n" +
                         (cropOrganismIds != null && ! cropOrganismIds.isEmpty() ? "     AND crop_organism_id IN (" + StringUtils.join(cropOrganismIds, ",") + ") " : "") +
                         ")\n" +
-                        "AND result_valid_time between :midnight AND :nextMidnight";
+                        "AND valid_time_start between :midnight AND :nextMidnight";
             //System.out.println(poi.getName() + " SQL=" + sql);
             Query q = em.createNativeQuery(sql);
             q.setParameter("locationPointOfInterestId", poi.getPointOfInterestId());
@@ -1021,7 +1021,7 @@ public class ForecastBean {
             mappedForecastConfigurations.put(forecastConfiguration.getForecastConfigurationId(), forecastConfiguration);
             Query q = em.createNativeQuery(
                     "SELECT * FROM forecast_result WHERE forecast_configuration_id = :forecastConfigurationId "
-                            + "AND result_valid_time = (SELECT max(result_valid_time) FROM forecast_result WHERE forecast_configuration_id = :forecastConfigurationId)", 
+                            + "AND valid_time_start = (SELECT max(valid_time_start) FROM forecast_result WHERE forecast_configuration_id = :forecastConfigurationId)", 
                     ForecastResult.class
             );
             q.setParameter("forecastConfigurationId", forecastConfiguration.getForecastConfigurationId());
diff --git a/src/main/java/no/nibio/vips/logic/entity/ForecastResult.java b/src/main/java/no/nibio/vips/logic/entity/ForecastResult.java
index c91c02aa..51c98429 100755
--- a/src/main/java/no/nibio/vips/logic/entity/ForecastResult.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ForecastResult.java
@@ -45,6 +45,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.vividsolutions.jts.geom.Geometry;
 
 
 /**
@@ -55,12 +56,12 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 @Table(name = "forecast_result")
 @XmlRootElement
 @NamedQueries({
-    @NamedQuery(name = "ForecastResult.findAll", query = "SELECT f FROM ForecastResult f ORDER BY f.resultValidTime ASC"),
-    @NamedQuery(name = "ForecastResult.findByForecastResultId", query = "SELECT f FROM ForecastResult f WHERE f.forecastResultId = :forecastResultId ORDER BY f.resultValidTime ASC"),
-    @NamedQuery(name = "ForecastResult.findByForecastConfigurationId", query = "SELECT f FROM ForecastResult f WHERE f.forecastConfigurationId = :forecastConfigurationId ORDER BY f.resultValidTime ASC"),
-    @NamedQuery(name = "ForecastResult.findByForecastConfigurationIdAndPeriod", query = "SELECT f FROM ForecastResult f WHERE f.forecastConfigurationId = :forecastConfigurationId AND f.resultValidTime BETWEEN :timeStart AND :timeEnd ORDER BY f.resultValidTime ASC"),
-    @NamedQuery(name = "ForecastResult.findByResultValidTime", query = "SELECT f FROM ForecastResult f WHERE f.resultValidTime = :resultValidTime ORDER BY f.resultValidTime ASC"),
-    @NamedQuery(name = "ForecastResult.findByWarningStatus", query = "SELECT f FROM ForecastResult f WHERE f.warningStatus = :warningStatus ORDER BY f.resultValidTime ASC")})
+    @NamedQuery(name = "ForecastResult.findAll", query = "SELECT f FROM ForecastResult f ORDER BY f.validTimeStart ASC"),
+    @NamedQuery(name = "ForecastResult.findByForecastResultId", query = "SELECT f FROM ForecastResult f WHERE f.forecastResultId = :forecastResultId ORDER BY f.validTimeStart ASC"),
+    @NamedQuery(name = "ForecastResult.findByForecastConfigurationId", query = "SELECT f FROM ForecastResult f WHERE f.forecastConfigurationId = :forecastConfigurationId ORDER BY f.validTimeStart ASC"),
+    @NamedQuery(name = "ForecastResult.findByForecastConfigurationIdAndPeriod", query = "SELECT f FROM ForecastResult f WHERE f.forecastConfigurationId = :forecastConfigurationId AND f.validTimeStart BETWEEN :timeStart AND :timeEnd ORDER BY f.validTimeStart ASC"),
+    @NamedQuery(name = "ForecastResult.findByValidTimeStart", query = "SELECT f FROM ForecastResult f WHERE f.validTimeStart = :validTimeStart ORDER BY f.validTimeStart ASC"),
+    @NamedQuery(name = "ForecastResult.findByWarningStatus", query = "SELECT f FROM ForecastResult f WHERE f.warningStatus = :warningStatus ORDER BY f.validTimeStart ASC")})
 public class ForecastResult implements Serializable, Comparable{
     private static final long serialVersionUID = 1L;
     @Id
@@ -68,9 +69,12 @@ public class ForecastResult implements Serializable, Comparable{
     @Basic(optional = false)
     @Column(name = "forecast_result_id")
     private Long forecastResultId;
-    @Column(name = "result_valid_time")
+    @Column(name = "valid_time_start")
     @Temporal(TemporalType.TIMESTAMP)
-    private Date resultValidTime;
+    private Date validTimeStart;
+    @Column(name = "valid_time_end")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date validTimeEnd;
     @Column(name = "warning_status")
     private Integer warningStatus;
     @Column(name = "all_values")
@@ -79,6 +83,8 @@ public class ForecastResult implements Serializable, Comparable{
     //@JoinColumn(name="forecast_configuration_id",referencedColumnName="forecast_configuration_id")    
     @Column(name = "forecast_configuration_id")
     private Long forecastConfigurationId;
+    @Column(name = "valid_geometry", columnDefinition = "Geometry")
+    private Geometry validGeometry;
 
     
     public ForecastResult() {
@@ -88,7 +94,7 @@ public class ForecastResult implements Serializable, Comparable{
         try {
             this.forecastConfigurationId = forecastConfigurationId;
             this.allValues = new ObjectMapper().writeValueAsString(result.getAllValues());
-            this.resultValidTime = result.getResultValidTime();
+            this.validTimeStart = result.getValidTimeStart();
             this.warningStatus = result.getWarningStatus();
         } catch (IOException ex) {
             Logger.getLogger(ForecastResult.class.getName()).log(Level.SEVERE, null, ex);
@@ -107,12 +113,12 @@ public class ForecastResult implements Serializable, Comparable{
         this.forecastResultId = forecastResultId;
     }
 
-    public Date getResultValidTime() {
-        return resultValidTime;
+    public Date getValidTimeStart() {
+        return validTimeStart;
     }
 
-    public void setResultValidTime(Date resultValidTime) {
-        this.resultValidTime = resultValidTime;
+    public void setValidTimeStart(Date validTimeStart) {
+        this.validTimeStart = validTimeStart;
     }
 
     public Integer getWarningStatus() {
@@ -196,7 +202,7 @@ public class ForecastResult implements Serializable, Comparable{
     
     public int compareTo(ForecastResult other)
     {
-        return this.getResultValidTime().compareTo(other.getResultValidTime());
+        return this.getValidTimeStart().compareTo(other.getValidTimeStart());
     }
 
     /**
@@ -218,5 +224,33 @@ public class ForecastResult implements Serializable, Comparable{
     public Set<String> getKeys() {
         return this.getAllValuesAsMap().keySet();
     }
+
+    /**
+     * @return the validGeometry
+     */
+    public Geometry getValidGeometry() {
+        return validGeometry;
+    }
+
+    /**
+     * @param validGeometry the validGeometry to set
+     */
+    public void setValidGeometry(Geometry validGeometry) {
+        this.validGeometry = validGeometry;
+    }
+
+    /**
+     * @return the validTimeEnd
+     */
+    public Date getValidTimeEnd() {
+        return validTimeEnd;
+    }
+
+    /**
+     * @param validTimeEnd the validTimeEnd to set
+     */
+    public void setValidTimeEnd(Date validTimeEnd) {
+        this.validTimeEnd = validTimeEnd;
+    }
     
 }
diff --git a/src/main/java/no/nibio/vips/logic/messaging/MessagingBean.java b/src/main/java/no/nibio/vips/logic/messaging/MessagingBean.java
index 28a18dd1..971ac29c 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/MessagingBean.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/MessagingBean.java
@@ -204,7 +204,7 @@ public class MessagingBean {
         List<ForecastConfiguration> forecastConfigurations = em.createNativeQuery(
                 "SELECT * FROM public.forecast_configuration f "
                 + "WHERE f.forecast_configuration_id IN ("
-                + "     SELECT forecast_configuration_id FROM forecast_result WHERE result_valid_time between :dateStart AND :dateEnd"
+                + "     SELECT forecast_configuration_id FROM forecast_result WHERE valid_time_start between :dateStart AND :dateEnd"
                 + ")",
                 ForecastConfiguration.class
             )
@@ -229,7 +229,7 @@ public class MessagingBean {
             // If you find a NEW GREEN_TO_YELLOW event first, add it and search for a new TO_RED event
             for(ForecastResult result:results)
             {
-                if(result.getResultValidTime().before(systemTime) || result.getResultValidTime().after(in10Days))
+                if(result.getValidTimeStart().before(systemTime) || result.getValidTimeStart().after(in10Days))
                 {
                     continue;
                 }
@@ -260,7 +260,7 @@ public class MessagingBean {
                     ForecastNotificationLogPK pk = new ForecastNotificationLogPK(
                             conf.getForecastConfigurationId(), 
                             currentEvent.getForecastEventId(), 
-                            result.getResultValidTime()
+                            result.getValidTimeStart()
                     );
                     
                     // Could not find same event. We persist it so we won't
diff --git a/src/main/java/no/nibio/vips/logic/modules/roughage/RoughageService.java b/src/main/java/no/nibio/vips/logic/modules/roughage/RoughageService.java
index 34eec774..32042161 100755
--- a/src/main/java/no/nibio/vips/logic/modules/roughage/RoughageService.java
+++ b/src/main/java/no/nibio/vips/logic/modules/roughage/RoughageService.java
@@ -448,11 +448,11 @@ public class RoughageService {
                 Map<Date, Result> resultBucket = new HashMap<>();
                 for(Result result:results)
                 {
-                    resultBucket.put(result.getResultValidTime(), result);
+                    resultBucket.put(result.getValidTimeStart(), result);
                 }
                 for(Result normalDataResult:normalDataResults)
                 {
-                    Result result = resultBucket.get(normalDataResult.getResultValidTime());
+                    Result result = resultBucket.get(normalDataResult.getValidTimeStart());
                     if(result != null)
                     {
                         String[] resultKeys = {"Avling", "Beregnet MSC","NDF","INDF","R&aring;protein","FEm"};
diff --git a/src/test/java/no/nibio/vips/util/weather/dnmipointweb/DMIPointWebDataParserTest.java b/src/test/java/no/nibio/vips/util/weather/dnmipointweb/DMIPointWebDataParserTest.java
index 10d9b489..83155f8f 100644
--- a/src/test/java/no/nibio/vips/util/weather/dnmipointweb/DMIPointWebDataParserTest.java
+++ b/src/test/java/no/nibio/vips/util/weather/dnmipointweb/DMIPointWebDataParserTest.java
@@ -63,7 +63,7 @@ public class DMIPointWebDataParserTest {
         System.out.println("getData");
         DMIPointWebDataParser instance = new DMIPointWebDataParser();
         Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Copenhagen"));
-        cal.set(2017, Calendar.JULY, 5, 0, 0, 0);
+        cal.set(2000, Calendar.JULY, 5, 0, 0, 0);
         Date dateFrom = cal.getTime();
         cal.set(Calendar.DATE, 15);
         Date dateTo = cal.getTime();
-- 
GitLab