# HG changeset patch # User Tom Gottfried # Date 1430324273 -7200 # Node ID 20b543616e6d4326740a180edc01578eee836109 # Parent 7f1fb07e4e3dc6686561e3ef6e5c7fad098b6522 (issue1801) Return defined gauge at limit between two gauge ranges. diff -r 7f1fb07e4e3d -r 20b543616e6d backend/src/main/java/org/dive4elements/river/model/River.java --- a/backend/src/main/java/org/dive4elements/river/model/River.java Wed Apr 29 16:36:29 2015 +0200 +++ b/backend/src/main/java/org/dive4elements/river/model/River.java Wed Apr 29 18:17:53 2015 +0200 @@ -261,6 +261,16 @@ } public Gauge determineGaugeByPosition(double p) { + // Per default, we prefer the gauge downstream + return determineGaugeByPosition(p, getKmUp()); + } + + /** + * @param p Station on this river for which the gauge is searched + * @param kmLower At boundary of two gauge ranges, should gauge at lower + * km be returned? + */ + public Gauge determineGaugeByPosition(double p, boolean kmLower) { Session session = SessionHolder.HOLDER.get(); Query query = session.createQuery( "from Gauge g where river=:river " + @@ -270,7 +280,28 @@ query.setParameter("river", this); query.setParameter("p", new BigDecimal(p, PRECISION)); List gauges = query.list(); - return gauges.isEmpty() ? null : gauges.get(0); + if (gauges.isEmpty()) { + return null; + } + if (gauges.size() == 1) { + return gauges.get(0); + } + if (gauges.size() > 2) { + // TODO: database schema should prevent this. + log.warn("More than two gauge ranges overlap km " + p + + ". Returning arbitrary result."); + } + Gauge g0 = gauges.get(0); + Gauge g1 = gauges.get(1); + if (kmLower) { + return + g0.getStation().doubleValue() < g1.getStation().doubleValue() + ? g0 + : g1; + } + return g0.getStation().doubleValue() > g1.getStation().doubleValue() + ? g0 + : g1; }