# HG changeset patch # User mschaefer # Date 1537804870 -7200 # Node ID 879c902c4a2d2115eb92b5ed76297cace5f380e2 # Parent 7c3d689294e890693b30d5215642c5ee20226cb5 Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly diff -r 7c3d689294e8 -r 879c902c4a2d artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesService.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesService.java Fri Sep 21 18:19:41 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesService.java Mon Sep 24 18:01:10 2018 +0200 @@ -61,12 +61,14 @@ throws MainValuesServiceException { // Query the gauge's daily Q values - final List qdvs = DailyDischargeValue.getValues(gauge, startTime, endTime, OrderByField.DAY); + final Date qStartTime = DateUtils.getAbflussYear(startTime)[0]; + final List qdvs = DailyDischargeValue.getValues(gauge, qStartTime, endTime, OrderByField.DAY); if (qdvs.isEmpty()) throw new MainValuesServiceException("no daily discharge values for gauge " + gauge.getName() + " in the requested time period"); // return; // Build yearly aggregates + final Date qYearEnd = DateUtils.getPreviousAbflussYear(endTime)[1]; final TDoubleArrayList mnqs = new TDoubleArrayList(); final TDoubleArrayList mqs = new TDoubleArrayList(); int mqcnt = 0; @@ -87,6 +89,8 @@ mqs.set(j, mqs.get(j) / mqcnt); j++; } + if (qdv.getDay().after(qYearEnd)) + break; // Start next year mnqs.add(qdv.getDischarge().doubleValue()); mhqs.add(qdv.getDischarge().doubleValue()); @@ -115,10 +119,12 @@ if (hsq2 != null) mainValues.add(hsq2); - // Query the gauge's daily Q values and build a list sorted by ascending Q + // Query the gauge's daily Q values from the first new year on, and build a list sorted by ascending Q final TDoubleArrayList qs = new TDoubleArrayList(); - for (final DailyDischargeValue qdv : qdvs) - qs.add(qdv.getDischarge().doubleValue()); + for (final DailyDischargeValue qdv : qdvs) { + if (qdv.getDay().compareTo(startTime) >= 0) + qs.add(qdv.getDischarge().doubleValue()); + } qs.sort(); // Step through the sorted Q list and get the duration discharges @@ -137,14 +143,22 @@ } /** - * Checks year equality of two dates (calendar year) + * Checks year equality of two dates (Abflussjahr) */ private boolean isSameQYear(final Date a, final Date b) { - final Calendar ca = Calendar.getInstance(); - ca.setTime(a); - final Calendar cb = Calendar.getInstance(); - cb.setTime(b); - return (ca.get(Calendar.YEAR) == cb.get(Calendar.YEAR)); + return (qYear(a) == qYear(b)); + } + + /** + * Gets the q year (Abflussjahr) of a date + */ + private int qYear(final Date day) { + final Calendar cal = Calendar.getInstance(); + cal.setTime(day); + if (cal.get(Calendar.MONTH) >= 10) + return cal.get(Calendar.YEAR) + 1; + else + return cal.get(Calendar.YEAR); } /** diff -r 7c3d689294e8 -r 879c902c4a2d artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesTimeRangeDeterminationService.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesTimeRangeDeterminationService.java Fri Sep 21 18:19:41 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesTimeRangeDeterminationService.java Mon Sep 24 18:01:10 2018 +0200 @@ -60,6 +60,10 @@ private static class GaugeInfo { protected final String errorMsg; protected final Gauge gauge; + /** + * New year of the first year for which the gauge has complete discharge data, including november+december of the year + * before + */ protected final Date startdate; protected final Date enddate; @@ -83,12 +87,13 @@ // Query the gauge's daily Q values String globalErrorMsg = ""; final List gaugeResults = new ArrayList<>(); - Date min = startTime; + final Date qStartTime = DateUtils.getAbflussYear(startTime)[0]; + Date min = qStartTime; Date max = endTime; for (final Gauge gauge : gauges) { - final Date[] gaugeDates = DailyDischargeValue.getTimePeriod(gauge, startTime, endTime); + final Date[] gaugeDates = DailyDischargeValue.getTimePeriod(gauge, qStartTime, endTime); if (gaugeDates[0] == null) { final String msg = Resources.getMsg(meta, "bundu.wst_no_data_at_all", "bundu.wst_no_data_at_all", gauge.getName()); final GaugeInfoResult.GaugeInfo gi = new GaugeInfoResult.GaugeInfo(msg, gauge, null, null); @@ -98,24 +103,26 @@ continue; } + final Date gaugeCalcStartDate = DateUtils.getNextAbflussYear(gaugeDates[0])[0]; if (gaugeDates[0].getTime() > min.getTime()) - min = gaugeDates[0]; + min = gaugeCalcStartDate; if (gaugeDates[1].getTime() < max.getTime()) max = gaugeDates[1]; String errormsg = null; - if ((gaugeDates[1].getTime() < endTime.getTime()) || (gaugeDates[0].getTime() > startTime.getTime())) - errormsg = makeDoesNotCoverErrorMsg(gaugeDates[0], gaugeDates[1], meta); + if ((gaugeDates[1].getTime() < endTime.getTime()) || (gaugeDates[0].getTime() > qStartTime.getTime())) + errormsg = makeDoesNotCoverErrorMsg(DateUtils.getAbflussYearFromDate(gaugeCalcStartDate), DateUtils.getYearFromDate(gaugeDates[1]), meta); - gaugeResults.add(new GaugeInfoResult.GaugeInfo(errormsg, gauge, gaugeDates[0], gaugeDates[1])); + gaugeResults.add(new GaugeInfoResult.GaugeInfo(errormsg, gauge, DateUtils.getNextNewYear(gaugeCalcStartDate), gaugeDates[1])); } // common Range and correct errorMsg + min = DateUtils.getNextNewYear(min); final List gaugeResultsSecondTurn = new ArrayList<>(); for (final GaugeInfoResult.GaugeInfo gi : gaugeResults) { gaugeResultsSecondTurn - .add(new GaugeInfoResult.GaugeInfo(gi.errorMsg, gi.gauge, gi.startdate != null ? min : null, gi.enddate != null ? max : null)); + .add(new GaugeInfoResult.GaugeInfo(gi.errorMsg, gi.gauge, gi.startdate != null ? min : null, gi.enddate != null ? max : null)); } if (globalErrorMsg.isEmpty() && (min.getTime() > max.getTime())) globalErrorMsg = getMsg(meta, "bundu.wst.gauge_timeranges_disjoint"); @@ -130,9 +137,9 @@ return result; } - private String makeDoesNotCoverErrorMsg(final Date start, final Date end, final CallMeta meta) { + private String makeDoesNotCoverErrorMsg(final int startYear, final int endYear, final CallMeta meta) { final String msgkey = "bundu.wst.range_does_not_cover"; - return Resources.getMsg(meta, msgkey, msgkey, DateUtils.getYearFromDate(start), DateUtils.getYearFromDate(end)); + return Resources.getMsg(meta, msgkey, msgkey, startYear, endYear); } @Override