Mercurial > dive4elements > river
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) {