diff artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/BedQualityD50KmValueFinder.java @ 9522:23d97d60b889

Selection range of D50 values for tkh calculation can now be configured with a river specific table.
author gernotbelger
date Mon, 01 Oct 2018 16:37:12 +0200
parents c01f1e65903b
children 8e6b9cb9486a
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/BedQualityD50KmValueFinder.java	Mon Oct 01 16:35:03 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/BedQualityD50KmValueFinder.java	Mon Oct 01 16:37:12 2018 +0200
@@ -10,7 +10,7 @@
 
 package org.dive4elements.river.artifacts.sinfo.tkhcalculation;
 
-import java.util.Calendar;
+import java.io.IOException;
 import java.util.Date;
 import java.util.List;
 
@@ -21,6 +21,10 @@
 import org.apache.log4j.Logger;
 import org.dive4elements.river.artifacts.math.Utils;
 import org.dive4elements.river.artifacts.model.Calculation;
+import org.dive4elements.river.artifacts.model.DateRange;
+import org.dive4elements.river.artifacts.sinfo.tkhstate.BedQualityD50TimeRangeConfig;
+import org.dive4elements.river.artifacts.sinfo.tkhstate.BedQualityD50TimeRangeConfig.BedQualityParseException;
+import org.dive4elements.river.artifacts.sinfo.tkhstate.TsvHelper.TsvReaderException;
 import org.dive4elements.river.backend.SedDBSessionHolder;
 import org.dive4elements.river.model.River;
 import org.hibernate.SQLQuery;
@@ -57,20 +61,19 @@
      * query.
      */
     private static final String SQL_BED_D50_SUBLAYER_MEASUREMENT = //
-            "SELECT s.km, t.datum, p.tiefevon, p.tiefebis, a.d50"
-            + " FROM sohltest t INNER JOIN station s ON t.stationid = s.stationid"
-            + "    INNER JOIN gewaesser g ON s.gewaesserid = g.gewaesserid"
-            + "    INNER JOIN sohlprobe p ON t.sohltestid = p.sohltestid"
-            + "    INNER JOIN siebanalyse a ON p.sohlprobeid = a.sohlprobeid"
-            + " WHERE (g.name = :name)"
-            + "    AND (p.tiefevon > 0.0) AND (p.tiefebis <= 0.5)"
-            + "    AND (t.datum BETWEEN :fromdate AND :todate)"
+            "SELECT s.km, t.datum, p.tiefevon, p.tiefebis, a.d50" //
+                    + " FROM sohltest t INNER JOIN station s ON t.stationid = s.stationid" //
+                    + "    INNER JOIN gewaesser g ON s.gewaesserid = g.gewaesserid" //
+                    + "    INNER JOIN sohlprobe p ON t.sohltestid = p.sohltestid" //
+                    + "    INNER JOIN siebanalyse a ON p.sohlprobeid = a.sohlprobeid" //
+                    + " WHERE (g.name = :name)" //
+                    + "    AND (p.tiefevon > 0.0) AND (p.tiefebis <= 0.5)" //
+                    + "    AND (t.datum BETWEEN :fromdate AND :todate)" //
             + " ORDER BY s.km ASC, a.d50 ASC";
 
-    // + " WHERE (g.name = :name) AND (s.km BETWEEN :fromkm - 0.0001 AND :tokm + 0.0001)"
-    // + " AND (p.tiefevon > 0.0) AND (p.tiefebis <= 0.5)"
-    // + " AND (t.datum BETWEEN :fromdate AND :todate)"
-    // + " ORDER BY s.km ASC, a.d50 ASC";
+    public static final Date MIN_DATE = new Date(-10000000000000l); // Database does not cope with Long.MIN/Long.Max, so we go just a few hundred years
+    // back/forward
+    public static final Date MAX_DATE = new Date(10000000000000l);
 
     private Calculation problems;
 
@@ -94,19 +97,23 @@
      * Abhängig von Peiljahr
      *
      * @param problems
+     * @throws BedQualityParseException
+     * @throws TsvReaderException
+     * @throws IOException
      */
     public static BedQualityD50KmValueFinder loadBedMeasurements(final Calculation problems, final River river, final DoubleRange kmRange,
-            final int soundingYear, final int validYears) {
+            final int soundingYear) throws BedQualityParseException, IOException, TsvReaderException {
 
-        /* construct valid measurement time range */
-        final Calendar cal = Calendar.getInstance();
-        cal.clear();
+        final DateRange rangeFromConfigFile = BedQualityD50TimeRangeConfig.getDefaults(river, soundingYear, problems);
+        final DateRange dateRange = rangeFromConfigFile != null ? rangeFromConfigFile : new DateRange(MIN_DATE, MAX_DATE);
+        return loadBedMeasurements(problems, river, kmRange, dateRange, soundingYear);
+    }
 
-        cal.set(soundingYear - validYears, 0, 1);
-        final Date startTime = cal.getTime();
+    private static BedQualityD50KmValueFinder loadBedMeasurements(final Calculation problems, final River river, final DoubleRange kmRange,
+            final DateRange dateRange, final int soundingYear) {
 
-        cal.set(soundingYear + validYears, 11, 31);
-        final Date endTime = cal.getTime();
+        final Date startTime = dateRange.getFrom();
+        final Date endTime = dateRange.getTo();
 
         final String seddbRiver = river.nameForSeddb();
         log.debug(String.format("loadValues '%s' km %.3f - %.3f %tF - %tF", seddbRiver, kmRange.getMinimumDouble(), kmRange.getMaximumDouble(), startTime,
@@ -171,8 +178,8 @@
         try {
             return this.interpolator.value(km);
         }
-        catch (final ArgumentOutsideDomainException e) {
-            // No stack trace because this might happen a lot (intended) and we produce an error message anyways.            
+        catch (@SuppressWarnings("unused") final ArgumentOutsideDomainException e) {
+            // No stack trace because this might happen a lot (intended) and we produce an error message anyways.
             // e.printStackTrace();
 
             if (this.problems != null) {

http://dive4elements.wald.intevation.org