comparison artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadFactory.java @ 6392:9a0f8d532797

Load sedimentload fraction with sedimentload factory and add new facets to artifact.
author Raimund Renkert <rrenkert@intevation.de>
date Fri, 21 Jun 2013 15:35:44 +0200
parents fa8425c8694c
children 24b4819ef514
comparison
equal deleted inserted replaced
6391:ec537afacac2 6392:9a0f8d532797
11 import gnu.trove.TDoubleArrayList; 11 import gnu.trove.TDoubleArrayList;
12 12
13 import java.util.Calendar; 13 import java.util.Calendar;
14 import java.util.Date; 14 import java.util.Date;
15 import java.util.List; 15 import java.util.List;
16 import java.util.Map;
17 import java.util.TreeMap; 16 import java.util.TreeMap;
18 17
19 import net.sf.ehcache.Cache; 18 import net.sf.ehcache.Cache;
20 import net.sf.ehcache.Element; 19 import net.sf.ehcache.Element;
21 20
22 import org.apache.log4j.Logger; 21 import org.apache.log4j.Logger;
23 import org.hibernate.SQLQuery;
24 import org.hibernate.Session;
25 import org.hibernate.type.StandardBasicTypes;
26
27 import org.dive4elements.river.model.MeasurementStation;
28
29 import org.dive4elements.river.artifacts.cache.CacheFactory; 22 import org.dive4elements.river.artifacts.cache.CacheFactory;
30
31 import org.dive4elements.river.artifacts.model.Range; 23 import org.dive4elements.river.artifacts.model.Range;
32 import org.dive4elements.river.artifacts.model.RiverFactory; 24 import org.dive4elements.river.artifacts.model.RiverFactory;
33 import org.dive4elements.river.artifacts.model.StaticSedimentLoadCacheKey; 25 import org.dive4elements.river.artifacts.model.StaticSedimentLoadCacheKey;
34 import org.dive4elements.river.backend.SessionHolder; 26 import org.dive4elements.river.backend.SessionHolder;
27 import org.dive4elements.river.model.MeasurementStation;
28 import org.hibernate.SQLQuery;
29 import org.hibernate.Session;
30 import org.hibernate.type.StandardBasicTypes;
35 31
36 /** Pull Sediment Loads out of db. */ 32 /** Pull Sediment Loads out of db. */
37 public class SedimentLoadFactory 33 public class SedimentLoadFactory
38 { 34 {
39 /** Private logger to use here. */ 35 /** Private logger to use here. */
58 /** Query to get name for wst_id and column_pos. */ 54 /** Query to get name for wst_id and column_pos. */
59 public static final String SQL_SELECT_EPOCHS = 55 public static final String SQL_SELECT_EPOCHS =
60 "SELECT DISTINCT " + 56 "SELECT DISTINCT " +
61 " sy.description AS description, " + 57 " sy.description AS description, " +
62 " ti.start_time AS start, " + 58 " ti.start_time AS start, " +
63 " ti.stop_time AS end " + 59 " ti.stop_time AS end, " +
60 " u.name AS unit" +
64 " FROM sediment_yield sy " + 61 " FROM sediment_yield sy " +
65 " JOIN rivers r ON sy.river_id = r.id " + 62 " JOIN rivers r ON sy.river_id = r.id " +
66 " JOIN sediment_yield_values syv ON sy.id = syv.sediment_yield_id " + 63 " JOIN sediment_yield_values syv ON sy.id = syv.sediment_yield_id " +
67 " JOIN time_intervals ti ON sy.time_interval_id = ti.id " + 64 " JOIN time_intervals ti ON sy.time_interval_id = ti.id " +
65 " JOIN units u ON u.id = sy.unit_id " +
68 " WHERE r.name = :name " + 66 " WHERE r.name = :name " +
69 " AND ti.stop_time IS NOT NULL " + 67 " AND ti.stop_time IS NOT NULL " +
70 " AND syv.station BETWEEN :startKm AND :endKm"; 68 " AND syv.station BETWEEN :startKm AND :endKm";
71 69
72 public static final String SQL_SELECT_SINGLES_DATA = 70 public static final String SQL_SELECT_SINGLES_DATA =
73 "SELECT" + 71 "SELECT" +
74 " sy.description AS description, " + 72 " sy.description AS description, " +
75 " ti.start_time AS year, " + 73 " ti.start_time AS year, " +
76 " syv.value AS load, " + 74 " syv.value AS load, " +
77 " syv.station AS km " + 75 " syv.station AS km, " +
76 " u.name AS unit " +
78 " FROM sediment_yield sy " + 77 " FROM sediment_yield sy " +
79 " JOIN rivers r ON sy.river_id = r.id " + 78 " JOIN rivers r ON sy.river_id = r.id " +
80 " JOIN time_intervals ti ON sy.time_interval_id = ti.id " + 79 " JOIN time_intervals ti ON sy.time_interval_id = ti.id " +
81 " JOIN sediment_yield_values syv ON sy.id = syv.sediment_yield_id " + 80 " JOIN sediment_yield_values syv ON sy.id = syv.sediment_yield_id " +
82 " JOIN grain_fraction gf ON sy.grain_fraction_id = gf.id " + 81 " JOIN grain_fraction gf ON sy.grain_fraction_id = gf.id " +
82 " JOIN units u ON u.id = sy.unit_id" +
83 " WHERE r.name = :name " + 83 " WHERE r.name = :name " +
84 " AND ti.start_time BETWEEN :begin AND :end " + 84 " AND ti.start_time BETWEEN :begin AND :end " +
85 " AND ti.stop_time IS NULL " + 85 " AND ti.stop_time IS NULL " +
86 " AND gf.name = :grain " + 86 " AND gf.name = :grain " +
87 " AND syv.station BETWEEN :startKm AND :endKm"; 87 " AND syv.station BETWEEN :startKm AND :endKm " +
88 " ORDER BY syv.station";
89
90 public static final String SQL_SELECT_UNKNOWN_DATA =
91 "SELECT" +
92 " sy.description AS description, " +
93 " ti.start_time AS start, " +
94 " ti.stop_time AS end, " +
95 " syv.value AS load, " +
96 " syv.station AS km, " +
97 " u.name AS unit " +
98 " FROM sediment_yield sy " +
99 " JOIN rivers r ON sy.river_id = r.id " +
100 " JOIN time_intervals ti ON sy.time_interval_id = ti.id " +
101 " JOIN sediment_yield_values syv ON sy.id = syv.sediment_yield_id " +
102 " JOIN grain_fraction gf ON sy.grain_fraction_id = gf.id " +
103 " JOIN units u ON u.id = sy.unit_id" +
104 " WHERE r.name = :name " +
105 " AND sy.description = :descr " +
106 " AND gf.name = 'unknown' " +
107 " ORDER BY syv.station";
108
109 public static final String SQL_SELECT_UNKNOWN =
110 "SELECT DISTINCT " +
111 " sy.description AS description, " +
112 " ti.start_time AS start, " +
113 " ti.stop_time AS end " +
114 "FROM sediment_yield sy " +
115 " JOIN rivers r ON sy.river_id = r.id " +
116 " JOIN time_intervals ti ON sy.time_interval_id = ti.id " +
117 " JOIN grain_fraction gf ON sy.grain_fraction_id = gf.id " +
118 "WHERE r.name = :river" +
119 " AND gf.name = 'unknown'";
88 120
89 public static final String SQL_SELECT_EPOCHS_DATA = 121 public static final String SQL_SELECT_EPOCHS_DATA =
90 "SELECT" + 122 "SELECT" +
91 " sy.description AS description, " + 123 " sy.description AS description, " +
92 " ti.start_time AS startYear, " + 124 " ti.start_time AS startYear, " +
93 " syv.value AS load, " + 125 " syv.value AS load, " +
94 " syv.station AS km," + 126 " syv.station AS km," +
95 " ti.stop_time AS endYear " + 127 " ti.stop_time AS endYear, " +
128 " u.name AS unit" +
96 " FROM sediment_yield sy " + 129 " FROM sediment_yield sy " +
97 " JOIN rivers r ON sy.river_id = r.id " + 130 " JOIN rivers r ON sy.river_id = r.id " +
98 " JOIN time_intervals ti ON sy.time_interval_id = ti.id " + 131 " JOIN time_intervals ti ON sy.time_interval_id = ti.id " +
99 " JOIN sediment_yield_values syv ON sy.id = syv.sediment_yield_id " + 132 " JOIN sediment_yield_values syv ON sy.id = syv.sediment_yield_id " +
100 " JOIN grain_fraction gf ON sy.grain_fraction_id = gf.id " + 133 " JOIN grain_fraction gf ON sy.grain_fraction_id = gf.id " +
134 " JOIN units u ON u.id = sy.unit_id " +
101 " WHERE r.name = :name " + 135 " WHERE r.name = :name " +
102 " AND ti.start_time BETWEEN :sbegin AND :send " + 136 " AND ti.start_time BETWEEN :sbegin AND :send " +
103 " AND ti.stop_time BETWEEN :ebegin AND :eend " + 137 " AND ti.stop_time BETWEEN :ebegin AND :eend " +
104 " AND gf.name = :grain " + 138 " AND gf.name = :grain " +
105 " AND syv.station BETWEEN :startKm AND :endKm"; 139 " AND syv.station BETWEEN :startKm AND :endKm " +
140 " ORDER BY syv.station";
106 141
107 private SedimentLoadFactory() { 142 private SedimentLoadFactory() {
108 } 143 }
109 144
110 /** 145 /**
223 Object[] row = results.get(i); 258 Object[] row = results.get(i);
224 loads[i] = new SedimentLoad( 259 loads[i] = new SedimentLoad(
225 (String) row[0], 260 (String) row[0],
226 (Date) row[1], 261 (Date) row[1],
227 null, 262 null,
228 false); 263 false,
264 "");
229 } 265 }
230 return loads; 266 return loads;
231 } 267 }
232 else if (type.equals("epoch")) { 268 else if (type.equals("epoch")) {
233 sqlQuery = session.createSQLQuery(SQL_SELECT_EPOCHS) 269 sqlQuery = session.createSQLQuery(SQL_SELECT_EPOCHS)
244 Object[] row = results.get(i); 280 Object[] row = results.get(i);
245 loads[i] = new SedimentLoad( 281 loads[i] = new SedimentLoad(
246 (String) row[0], 282 (String) row[0],
247 (Date) row[1], 283 (Date) row[1],
248 (Date) row[2], 284 (Date) row[2],
249 true); 285 true,
286 "");
250 } 287 }
251 return loads; 288 return loads;
252 } 289 }
253 return new SedimentLoad[0]; 290 return new SedimentLoad[0];
254 } 291 }
295 if (type.equals("year") || type.equals("epoch")) { 332 if (type.equals("year") || type.equals("epoch")) {
296 sqlQuery = session.createSQLQuery(SQL_SELECT_SINGLES_DATA) 333 sqlQuery = session.createSQLQuery(SQL_SELECT_SINGLES_DATA)
297 .addScalar("description", StandardBasicTypes.STRING) 334 .addScalar("description", StandardBasicTypes.STRING)
298 .addScalar("year", StandardBasicTypes.DATE) 335 .addScalar("year", StandardBasicTypes.DATE)
299 .addScalar("load", StandardBasicTypes.DOUBLE) 336 .addScalar("load", StandardBasicTypes.DOUBLE)
300 .addScalar("km", StandardBasicTypes.DOUBLE); 337 .addScalar("km", StandardBasicTypes.DOUBLE)
338 .addScalar("unit", StandardBasicTypes.STRING);
301 sqlQuery.setString("name", river); 339 sqlQuery.setString("name", river);
302 sqlQuery.setDouble("startKm", startKm); 340 sqlQuery.setDouble("startKm", startKm);
303 sqlQuery.setDouble("endKm", endKm); 341 sqlQuery.setDouble("endKm", endKm);
304 sqlQuery.setDate("begin", start.getTime()); 342 sqlQuery.setDate("begin", start.getTime());
305 sqlQuery.setDate("end", end.getTime()); 343 sqlQuery.setDate("end", end.getTime());
309 Object[] row = results.get(0); 347 Object[] row = results.get(0);
310 load = new SedimentLoad( 348 load = new SedimentLoad(
311 (String) row[0], 349 (String) row[0],
312 (Date) row[1], 350 (Date) row[1],
313 null, 351 null,
314 false); 352 false,
353 (String) row[4]);
315 getValues("coarse", sqlQuery, load, floatStations); 354 getValues("coarse", sqlQuery, load, floatStations);
316 getValues("fine_middle", sqlQuery, load, floatStations); 355 getValues("fine_middle", sqlQuery, load, floatStations);
317 getValues("sand", sqlQuery, load, floatStations); 356 getValues("sand", sqlQuery, load, floatStations);
318 getValues("suspended_sediment", sqlQuery, load, suspStations); 357 getValues("suspended_sediment", sqlQuery, load, suspStations);
319 getValues("susp_sand_bed", sqlQuery, load, suspStations); 358 getValues("susp_sand_bed", sqlQuery, load, suspStations);
329 sqlQuery = session.createSQLQuery(SQL_SELECT_EPOCHS_DATA) 368 sqlQuery = session.createSQLQuery(SQL_SELECT_EPOCHS_DATA)
330 .addScalar("description", StandardBasicTypes.STRING) 369 .addScalar("description", StandardBasicTypes.STRING)
331 .addScalar("startYear", StandardBasicTypes.DATE) 370 .addScalar("startYear", StandardBasicTypes.DATE)
332 .addScalar("load", StandardBasicTypes.DOUBLE) 371 .addScalar("load", StandardBasicTypes.DOUBLE)
333 .addScalar("km", StandardBasicTypes.DOUBLE) 372 .addScalar("km", StandardBasicTypes.DOUBLE)
334 .addScalar("endYear", StandardBasicTypes.DATE); 373 .addScalar("endYear", StandardBasicTypes.DATE)
374 .addScalar("unit", StandardBasicTypes.STRING);
335 sqlQuery.setString("name", river); 375 sqlQuery.setString("name", river);
336 sqlQuery.setDouble("startKm", startKm); 376 sqlQuery.setDouble("startKm", startKm);
337 sqlQuery.setDouble("endKm", endKm); 377 sqlQuery.setDouble("endKm", endKm);
338 sqlQuery.setDate("sbegin", start.getTime()); 378 sqlQuery.setDate("sbegin", start.getTime());
339 sqlQuery.setDate("send", end.getTime()); 379 sqlQuery.setDate("send", end.getTime());
348 Object[] row = results.get(0); 388 Object[] row = results.get(0);
349 load = new SedimentLoad( 389 load = new SedimentLoad(
350 (String) row[0], 390 (String) row[0],
351 (Date) row[1], 391 (Date) row[1],
352 (Date) row[4], 392 (Date) row[4],
353 true); 393 true,
394 (String)row[5]);
354 TDoubleArrayList kms = new TDoubleArrayList(); 395 TDoubleArrayList kms = new TDoubleArrayList();
355 for (int i = 0; i < results.size(); i++) { 396 for (int i = 0; i < results.size(); i++) {
356 row = results.get(i); 397 row = results.get(i);
357 kms.add((Double)row[3]); 398 kms.add((Double)row[3]);
358 load.setLoadTotal((Double)row[3], (Double)row[2]); 399 load.setLoadTotal((Double)row[3], (Double)row[2]);
428 else if (fraction.equals("susp_sand_bed")) { 469 else if (fraction.equals("susp_sand_bed")) {
429 load.setSuspSandBed(km, v, range); 470 load.setSuspSandBed(km, v, range);
430 } 471 }
431 } 472 }
432 } 473 }
474
475 public static SedimentLoad getLoadUnknown(
476 String river,
477 String description
478 ) {
479 log.debug("SedimentLoadFactory.getLoadWithData");
480 Cache cache = CacheFactory.getCache(LOAD_DATA_CACHE_NAME);
481
482 if (cache == null) {
483 log.debug("Cache not configured.");
484 return getSedimentLoadUnknownUncached(river, description);
485 }
486
487 StaticSedimentLoadCacheKey key =
488 new StaticSedimentLoadCacheKey(river, 0d, 0d, 0, 0);
489
490 Element element = cache.get(key);
491
492 if (element != null) {
493 log.debug("SedimentLoad found in cache");
494 return (SedimentLoad)element.getValue();
495 }
496
497 SedimentLoad values = getSedimentLoadUnknownUncached(river, description);
498
499 if (values != null && key != null) {
500 log.debug("Store static bed height values in cache.");
501 element = new Element(key, values);
502 cache.put(element);
503 }
504 return values;
505 }
506
507 /**
508 * Get sediment loads with fraction 'unknown' from db.
509 * @param river the river
510 * @param type the sediment load type (year or epoch)
511 * @return according sediment loads.
512 */
513 public static SedimentLoad getSedimentLoadUnknownUncached(
514 String river,
515 String description
516 ) {
517 log.debug("SedimentLoadFactory.getSedimentLoadWithDataUncached");
518 Session session = SessionHolder.HOLDER.get();
519 SQLQuery sqlQuery = null;
520
521 sqlQuery = session.createSQLQuery(SQL_SELECT_UNKNOWN_DATA)
522 .addScalar("description", StandardBasicTypes.STRING)
523 .addScalar("start", StandardBasicTypes.DATE)
524 .addScalar("end", StandardBasicTypes.DATE)
525 .addScalar("load", StandardBasicTypes.DOUBLE)
526 .addScalar("km", StandardBasicTypes.DOUBLE)
527 .addScalar("unit", StandardBasicTypes.STRING);
528 sqlQuery.setString("name", river);
529 sqlQuery.setString("descr", description);
530 List<Object []> results = sqlQuery.list();
531 SedimentLoad load = new SedimentLoad();
532 if (results.isEmpty()) {
533 return new SedimentLoad();
534 }
535 Object[] row = results.get(0);
536 load = new SedimentLoad(
537 (String) row[0],
538 (Date) row[1],
539 (Date) row[2],
540 false,
541 (String)row[5]);
542
543 for (int i = 0; i < results.size(); i++) {
544 row = results.get(i);
545 SedimentLoadFraction fraction = new SedimentLoadFraction();
546 fraction.setUnknown((Double)row[3]);
547 load.addKm((Double)row[4], fraction);
548 }
549 return load;
550 }
551
552 public static SedimentLoad[] getSedimentLoadUnknown(String river) {
553 Session session = SessionHolder.HOLDER.get();
554 SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT_UNKNOWN)
555 .addScalar("description", StandardBasicTypes.STRING)
556 .addScalar("start", StandardBasicTypes.DATE)
557 .addScalar("end", StandardBasicTypes.DATE);
558 sqlQuery.setString("river", river);
559 List<Object[]> results = sqlQuery.list();
560 SedimentLoad[] loads = new SedimentLoad[results.size()];
561 int counter = 0;
562 for (Object[] row: results) {
563 loads[counter] = new SedimentLoad(
564 (String)row[0], (Date)row[1], (Date)row[2], false, "");
565 counter++;
566 }
567 return loads;
568 }
433 } 569 }
434 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : 570 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org