comparison backend/src/main/java/org/dive4elements/river/model/River.java @ 8727:20b543616e6d

(issue1801) Return defined gauge at limit between two gauge ranges.
author Tom Gottfried <tom@intevation.de>
date Wed, 29 Apr 2015 18:17:53 +0200
parents 47199406994a
children 30b1ddadf275
comparison
equal deleted inserted replaced
8726:7f1fb07e4e3d 8727:20b543616e6d
259 List<Gauge> gauges = query.list(); 259 List<Gauge> gauges = query.list();
260 return gauges.isEmpty() ? null : gauges.get(0); 260 return gauges.isEmpty() ? null : gauges.get(0);
261 } 261 }
262 262
263 public Gauge determineGaugeByPosition(double p) { 263 public Gauge determineGaugeByPosition(double p) {
264 // Per default, we prefer the gauge downstream
265 return determineGaugeByPosition(p, getKmUp());
266 }
267
268 /**
269 * @param p Station on this river for which the gauge is searched
270 * @param kmLower At boundary of two gauge ranges, should gauge at lower
271 * km be returned?
272 */
273 public Gauge determineGaugeByPosition(double p, boolean kmLower) {
264 Session session = SessionHolder.HOLDER.get(); 274 Session session = SessionHolder.HOLDER.get();
265 Query query = session.createQuery( 275 Query query = session.createQuery(
266 "from Gauge g where river=:river " + 276 "from Gauge g where river=:river " +
267 "and :p between " + 277 "and :p between " +
268 "least(g.range.a, g.range.b) and " + 278 "least(g.range.a, g.range.b) and " +
269 "greatest(g.range.a, g.range.b)"); 279 "greatest(g.range.a, g.range.b)");
270 query.setParameter("river", this); 280 query.setParameter("river", this);
271 query.setParameter("p", new BigDecimal(p, PRECISION)); 281 query.setParameter("p", new BigDecimal(p, PRECISION));
272 List<Gauge> gauges = query.list(); 282 List<Gauge> gauges = query.list();
273 return gauges.isEmpty() ? null : gauges.get(0); 283 if (gauges.isEmpty()) {
284 return null;
285 }
286 if (gauges.size() == 1) {
287 return gauges.get(0);
288 }
289 if (gauges.size() > 2) {
290 // TODO: database schema should prevent this.
291 log.warn("More than two gauge ranges overlap km " + p +
292 ". Returning arbitrary result.");
293 }
294 Gauge g0 = gauges.get(0);
295 Gauge g1 = gauges.get(1);
296 if (kmLower) {
297 return
298 g0.getStation().doubleValue() < g1.getStation().doubleValue()
299 ? g0
300 : g1;
301 }
302 return g0.getStation().doubleValue() > g1.getStation().doubleValue()
303 ? g0
304 : g1;
274 } 305 }
275 306
276 307
277 /** 308 /**
278 * @param s station at which the gauge is requested. 309 * @param s station at which the gauge is requested.

http://dive4elements.wald.intevation.org