Mercurial > dive4elements > river
changeset 7181:805021c04861
issue1435: Add method to SedimentLoadFactory to fetch a SedimentLoad by id.
author | Felix Wolfsteller <felix.wolfsteller@intevation.de> |
---|---|
date | Thu, 26 Sep 2013 21:44:53 +0200 (2013-09-26) |
parents | e0b6b6cf4708 |
children | 87c32adb7088 |
files | artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadFactory.java |
diffstat | 1 files changed, 110 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadFactory.java Thu Sep 26 21:30:19 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadFactory.java Thu Sep 26 21:44:53 2013 +0200 @@ -86,6 +86,20 @@ " AND ti.stop_time IS NOT NULL " + " AND syv.station BETWEEN :startKm AND :endKm"; + public static final String SQL_SELECT_SINGLES_DATA_BY_ID = + "SELECT" + + " sy.description AS description, " + + " syv.value AS load, " + + " syv.station AS km, " + + " u.name AS unit " + + " gf.name AS fraction " + + " FROM sediment_yield sy " + + " JOIN sediment_yield_values syv ON sy.id = syv.sediment_yield_id " + + " JOIN units u ON u.id = sy.unit_id" + + " JOIN grain_fraction gf ON sy.grain_fraction_id = gf.id " + + " WHERE sy.id = :id" + + " ORDER BY syv.station"; + public static final String SQL_SELECT_SINGLES_DATA = "SELECT" + " sy.description AS description, " + @@ -343,7 +357,103 @@ } /** + * Get a specific sediment load from db. + * + * @param id the sediment yields id. + * + * @return according sediment load. + */ + public static SedimentLoad getSedimentLoadWithDataUncached( + String id, + String river + ) { + log.debug("SedimentLoadFactory.getSedimentLoadWithDataUncached / id " + id); + Session session = SessionHolder.HOLDER.get(); + SQLQuery sqlQuery = null; + + // Measurement stations: all, for float-stuff, for suspended stuff. + // Because they need fast sorted access, use TreeMaps. + // They map the starting validity range km to the station itself. + List<MeasurementStation> allStations = + RiverFactory.getRiver(river).getMeasurementStations(); + TreeMap<Double,MeasurementStation> floatStations = + new TreeMap<Double, MeasurementStation>(); + TreeMap<Double,MeasurementStation> suspStations = + new TreeMap<Double, MeasurementStation>(); + + // From all stations, sort into the two kinds, skip undefined ones. + for (MeasurementStation measurementStation: allStations) { + if (measurementStation.getMeasurementType() == null || + measurementStation.getRange() == null) { + continue; + } + if (measurementStation.getMeasurementType().equals("Schwebstoff")) { + suspStations.put( + measurementStation.getRange().getA().doubleValue(), + measurementStation); + } + else if (measurementStation.getMeasurementType().equals("Geschiebe")) { + floatStations.put( + measurementStation.getRange().getA().doubleValue(), + measurementStation); + } + } + + sqlQuery = session.createSQLQuery(SQL_SELECT_SINGLES_DATA_BY_ID) + .addScalar("description", StandardBasicTypes.STRING) + .addScalar("load", StandardBasicTypes.DOUBLE) + .addScalar("km", StandardBasicTypes.DOUBLE) + .addScalar("fraction", StandardBasicTypes.STRING) + .addScalar("unit", StandardBasicTypes.STRING); + sqlQuery.setInteger("id", Integer.valueOf(id)); + + List<Object []> results = sqlQuery.list(); + SedimentLoad load = new SedimentLoad(); + if (results.isEmpty()) { + log.warn("Empty result for year calculation."); + } + else { + Object[] row = results.get(0); + load = new SedimentLoad( + (String) row[0], //description + null,//(Date) row[1], //start + null, //end + false, //isEpoch + (String) row[4]); //unit + + String fraction = (String) row[3]; + + TreeMap<Double,MeasurementStation> relevantStations = + fraction.equals("suspended_sediment") + ? suspStations + : floatStations; + + for (int i = 0; i < results.size(); i++) { + row = results.get(i); + double km = (Double) row[2]; + Range range = findMeasurementStationRange(relevantStations, km); + if (range == null) { + log.warn("No measurement station for " + fraction + " km " + km); + continue; + } + + double v = -1; + + if (row[1] != null) { + v = ((Double)row[1]).doubleValue(); + } + + setLoadFraction(load, km, v, range, fraction); + } + + } + + return load; + } + + /** * Get sediment loads from db. + * * @param river the river * @param type the sediment load type (year, epoch or off_epoch) *