Mercurial > dive4elements > river
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. |