teichmann@8033: /* Copyright (C) 2014 by Bundesanstalt für Gewässerkunde teichmann@8033: * Software engineering by Intevation GmbH teichmann@8033: * teichmann@8033: * This file is Free Software under the GNU AGPL (>=v3) teichmann@8033: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@8033: * documentation coming with Dive4Elements River for details. teichmann@8033: */ teichmann@8033: package org.dive4elements.river.artifacts.model.minfo; teichmann@8033: teichmann@8033: import java.sql.Timestamp; teichmann@8033: import java.util.HashMap; teichmann@8033: import java.util.Iterator; teichmann@8033: teichmann@8033: import net.sf.ehcache.Cache; teichmann@8033: import net.sf.ehcache.Element; teichmann@8033: teichmann@8033: import org.apache.log4j.Logger; teichmann@8033: import org.dive4elements.river.artifacts.cache.CacheFactory; teichmann@8033: import org.dive4elements.river.backend.SessionHolder; teichmann@8033: import org.hibernate.SQLQuery; teichmann@8033: import org.hibernate.Session; teichmann@8033: import org.hibernate.type.StandardBasicTypes; teichmann@8033: teichmann@8033: public class SedimentLoadDataFactory teichmann@8033: { teichmann@8033: private static Logger log = Logger.getLogger(SedimentLoadDataFactory.class); teichmann@8033: teichmann@8033: public static final String CACHE_NAME = "sediment-load-data"; teichmann@8033: teichmann@8033: public static final String SUSPENDED_STRING = "Schwebstoff"; teichmann@8033: teichmann@8033: public static final String SQL_LOAD_RIVER_SEDIMENT_LOADS = teichmann@8033: "SELECT " + teichmann@8033: "sl.id AS sl_id, " + teichmann@8033: "sl.description AS sl_description, " + teichmann@8033: "ti.start_time AS ti_start_time, " + teichmann@8033: "ti.stop_time AS ti_stoptime, " + teichmann@8033: "slv.value AS slv_value, " + teichmann@8033: "gf.name AS gf_name, " + teichmann@8033: "ms.id AS ms_id, " + teichmann@8033: "ms.station AS ms_station, " + teichmann@8033: "ms.measurement_type AS ms_type " + teichmann@8033: "FROM sediment_load_values slv " + teichmann@8033: "JOIN sediment_load sl ON slv.sediment_load_id = sl.id " + teichmann@8033: "JOIN time_intervals ti ON sl.time_interval_id = ti.id " + teichmann@8033: "JOIN grain_fraction gf ON sl.grain_fraction_id = gf.id " + teichmann@8033: "JOIN measurement_station ms ON slv.measurement_station_id = ms.id " + teichmann@8033: "JOIN rivers r ON ms.river_id = r.id " + teichmann@8033: "WHERE r.name = :river " + teichmann@8033: "ORDER BY sl.id"; teichmann@8033: teichmann@8033: private SedimentLoadDataFactory() { teichmann@8033: } teichmann@8033: teichmann@8033: public SedimentLoadData getSedimentLoadData(String river) { teichmann@8033: boolean debug = log.isDebugEnabled(); teichmann@8033: teichmann@8033: if (debug) { teichmann@8033: log.debug( teichmann@8033: "Looking for sediment load data for river '" + river + "'"); teichmann@8033: } teichmann@8033: teichmann@8033: Cache cache = CacheFactory.getCache(CACHE_NAME); teichmann@8033: teichmann@8033: if (cache == null) { teichmann@8033: if (debug) { teichmann@8033: log.debug("Cache not configured."); teichmann@8033: } teichmann@8033: return getUncached(river); teichmann@8033: } teichmann@8033: teichmann@8033: String key = "sediment-load-" + river; teichmann@8033: teichmann@8033: Element element = cache.get(key); teichmann@8033: teichmann@8033: if (element != null) { teichmann@8033: if (debug) { teichmann@8033: log.debug("Sediment load data found in cache"); teichmann@8033: } teichmann@8033: return (SedimentLoadData)element.getValue(); teichmann@8033: } teichmann@8033: teichmann@8033: SedimentLoadData sedimentLoad = getUncached(river); teichmann@8033: teichmann@8033: if (sedimentLoad != null) { teichmann@8033: if (debug) { teichmann@8033: log.debug("Store sediment load data in cache."); teichmann@8033: } teichmann@8033: cache.put(new Element(key, sedimentLoad)); teichmann@8033: } teichmann@8033: teichmann@8033: return sedimentLoad; teichmann@8033: } teichmann@8033: teichmann@8033: public SedimentLoadData getUncached(String river) { teichmann@8033: teichmann@8033: Session session = SessionHolder.HOLDER.get(); teichmann@8033: teichmann@8033: SQLQuery sqlQuery = session.createSQLQuery(SQL_LOAD_RIVER_SEDIMENT_LOADS) teichmann@8033: .addScalar("sl_id", StandardBasicTypes.INTEGER) teichmann@8033: .addScalar("sl_description", StandardBasicTypes.STRING) teichmann@8033: .addScalar("ti_start_time", StandardBasicTypes.TIMESTAMP) teichmann@8033: .addScalar("ti_stop_time", StandardBasicTypes.TIMESTAMP) teichmann@8033: .addScalar("slv_value", StandardBasicTypes.DOUBLE) teichmann@8033: .addScalar("gf_name", StandardBasicTypes.STRING) teichmann@8033: .addScalar("ms_id", StandardBasicTypes.INTEGER) teichmann@8033: .addScalar("ms_station", StandardBasicTypes.DOUBLE) teichmann@8033: .addScalar("ms_type", StandardBasicTypes.STRING); teichmann@8033: teichmann@8033: sqlQuery.setString("river", river); teichmann@8033: teichmann@8033: SedimentLoadData.Load load = null; teichmann@8033: int grainFractionIndex = -1; teichmann@8033: teichmann@8033: HashMap id2station teichmann@8033: = new HashMap(); teichmann@8033: teichmann@8033: for (Iterator iter = sqlQuery.iterate(); iter.hasNext();) { teichmann@8033: Object [] row = (Object [])iter.next(); teichmann@8033: teichmann@8033: Integer sl_id = (Integer)row[0]; teichmann@8033: String sl_description = (String)row[1]; teichmann@8033: Timestamp ti_start_time = (Timestamp)row[2]; teichmann@8033: Timestamp ti_stop_time = (Timestamp)row[3]; teichmann@8033: Double slv_value = (Double)row[4]; teichmann@8033: String gf_name = (String)row[5]; teichmann@8033: Integer ms_id = (Integer)row[6]; teichmann@8033: Double ms_station = (Double)row[7]; teichmann@8033: String ms_type = (String)row[8]; teichmann@8033: teichmann@8033: if (load == null || load.getId() != sl_id) { teichmann@8033: load = new SedimentLoadData.Load( teichmann@8033: sl_id, sl_description, ti_start_time, ti_stop_time); teichmann@8033: teichmann@8033: // Grain fractions only change when a new sediment load starts. teichmann@8033: grainFractionIndex = teichmann@8033: SedimentLoadData.grainFractionIndex(gf_name); teichmann@8033: teichmann@8033: if (grainFractionIndex == -1) { teichmann@8033: log.error("Unknown grain fraction type: " + gf_name); teichmann@8033: break; teichmann@8033: } teichmann@8033: } teichmann@8033: teichmann@8033: SedimentLoadData.Station station = id2station.get(ms_id); teichmann@8033: if (station == null) { teichmann@8033: int type = ms_type.equalsIgnoreCase(SUSPENDED_STRING) teichmann@8033: ? SedimentLoadData.Station.SUSPENDED teichmann@8033: : SedimentLoadData.Station.BED_LOAD; teichmann@8033: teichmann@8033: station = new SedimentLoadData.Station(type, ms_station); teichmann@8033: id2station.put(ms_id, station); teichmann@8033: } teichmann@8033: teichmann@8033: station.addValue( teichmann@8033: grainFractionIndex, teichmann@8033: new SedimentLoadData.Value(load, slv_value)); teichmann@8033: } teichmann@8033: teichmann@8033: SedimentLoadData sld = new SedimentLoadData(); teichmann@8033: teichmann@8033: for (SedimentLoadData.Station station: id2station.values()) { teichmann@8033: sld.addStation(station); teichmann@8033: } teichmann@8033: teichmann@8033: return sld; teichmann@8033: } teichmann@8033: } teichmann@8033: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :