raimund@3614: package de.intevation.flys.artifacts.model.minfo; raimund@3614: raimund@3614: raimund@3886: import java.util.Date; raimund@3614: import java.util.List; raimund@3614: raimund@3614: import net.sf.ehcache.Cache; raimund@3614: import net.sf.ehcache.Element; raimund@3614: raimund@3614: import org.apache.log4j.Logger; raimund@3614: import org.hibernate.SQLQuery; raimund@3614: import org.hibernate.Session; raimund@3614: import org.hibernate.type.StandardBasicTypes; raimund@3614: raimund@3614: import de.intevation.flys.artifacts.cache.CacheFactory; raimund@3614: import de.intevation.flys.artifacts.model.StaticBedHeightCacheKey; raimund@3614: import de.intevation.flys.backend.SessionHolder; raimund@3614: raimund@3614: public class BedHeightFactory { raimund@3614: /** Private logger to use here. */ raimund@3614: private static Logger log = Logger.getLogger(BedHeightFactory.class); raimund@3614: raimund@3614: /** Query to get km and ws for wst_id and column_pos. */ raimund@3614: public static final String SQL_SELECT_SINGLE = raimund@3897: "SELECT bhsv.height, bhsv.station, bhsv.data_gap, bhsv.sounding_width, bhs.year " + raimund@3897: " FROM bed_height_single bhs" + raimund@3897: " JOIN bed_height_single_values bhsv on bhsv.bed_height_single_id = bhs.id" + raimund@3897: " WHERE bhs.id = :height_id"; raimund@3614: raimund@3614: /** Query to get name for wst_id and column_pos. */ raimund@3614: public static final String SQL_SELECT_EPOCH = raimund@3897: "SELECT bv.height, bv.station, ti.start_time, ti.stop_time" + raimund@3897: " FROM bed_height_epoch b" + raimund@3897: " JOIN bed_height_epoch_values bv ON b.id = bv.bed_height_epoch_id" + raimund@3897: " JOIN time_intervals ti ON b.time_interval_id = ti.id" + raimund@3897: " WHERE b.id = :height_id"; raimund@3614: raimund@3614: /** Query to get name (description) for wst_id. */ raimund@3614: public static final String SQL_SELECT_DESCR_SINGLE = raimund@3614: "SELECT description FROM bed_height_single "+ raimund@3614: "WHERE id = :height_id"; raimund@3614: raimund@3614: /** Query to get name (description) for wst_id. */ raimund@3614: public static final String SQL_SELECT_DESCR_EPOCH = raimund@3614: "SELECT description from bed_height_epoch "+ raimund@3614: "WHERE id = :height_id"; raimund@3614: raimund@3614: raimund@3614: private BedHeightFactory() { raimund@3614: } raimund@3614: raimund@3614: raimund@3614: /** raimund@3614: * Get WKms for given column and wst_id, caring about the cache. raimund@3614: */ raimund@3614: public static BedHeight getHeight(String type, int height_id, int time) { raimund@3614: log.debug("BedHeightFactory.getHeight"); raimund@3614: Cache cache = CacheFactory.getCache(StaticBedHeightCacheKey.CACHE_NAME); raimund@3614: raimund@3614: StaticBedHeightCacheKey cacheKey; raimund@3614: raimund@3614: if (cache != null) { raimund@3614: cacheKey = new StaticBedHeightCacheKey(height_id, time); raimund@3614: Element element = cache.get(cacheKey); raimund@3614: if (element != null) { raimund@3614: log.debug("Got static bedheight values from cache"); raimund@3614: return (BedHeight)element.getValue(); raimund@3614: } raimund@3614: } raimund@3614: else { raimund@3614: cacheKey = null; raimund@3614: } raimund@3614: raimund@3614: BedHeight values = getBedHeightUncached(type, height_id, time); raimund@3614: raimund@3614: if (values != null && cacheKey != null) { raimund@3614: log.debug("Store static bed height values in cache."); raimund@3614: Element element = new Element(cacheKey, values); raimund@3614: cache.put(element); raimund@3614: } raimund@3614: return values; raimund@3614: } raimund@3614: raimund@3614: /** Get name for a WKms. */ raimund@3614: public static String getHeightName(String type, int height_id) { raimund@3614: log.debug("BedHeightFactory.getHeightName height_id/" + height_id); raimund@3614: raimund@3614: String name = null; raimund@3614: Session session = SessionHolder.HOLDER.get(); raimund@3614: raimund@3614: SQLQuery nameQuery = null; raimund@3614: if (type.equals("single")) { raimund@3614: nameQuery = session.createSQLQuery(SQL_SELECT_DESCR_SINGLE) raimund@3614: .addScalar("description", StandardBasicTypes.STRING); raimund@3614: nameQuery.setInteger("height_id", height_id); raimund@3614: } raimund@3614: else if (type.equals("epoch")) { raimund@3614: nameQuery = session.createSQLQuery(SQL_SELECT_DESCR_EPOCH) raimund@3614: .addScalar("description", StandardBasicTypes.STRING); raimund@3614: nameQuery.setInteger("height_id", height_id); raimund@3614: } raimund@3614: else { raimund@3614: return "none"; raimund@3614: } raimund@3614: List names = nameQuery.list(); teichmann@4051: if (!names.isEmpty()) { raimund@3614: name = names.get(0); raimund@3614: } raimund@3614: raimund@3614: return name; raimund@3614: } raimund@3614: raimund@3614: raimund@3614: /** raimund@3614: * Get WKms from db. raimund@3614: * @param column the position columns value raimund@3614: * @param wst_id database id of the wst raimund@3614: * @return according WKms. raimund@3614: */ raimund@3614: public static BedHeight getBedHeightUncached( raimund@3614: String type, raimund@3614: int height_id, raimund@3614: int time) raimund@3614: { raimund@3614: if (log.isDebugEnabled()) { raimund@3614: log.debug("BedHeightFactory.getBedHeightUncached"); raimund@3614: } raimund@3614: raimund@3614: Session session = SessionHolder.HOLDER.get(); raimund@3614: SQLQuery sqlQuery = null; raimund@3614: if (type.equals("single")) { raimund@3886: BedHeightSingle height = raimund@3886: new BedHeightSingle(getHeightName(type, height_id)); raimund@3614: sqlQuery = session.createSQLQuery(SQL_SELECT_SINGLE) raimund@3614: .addScalar("height", StandardBasicTypes.DOUBLE) raimund@3614: .addScalar("station", StandardBasicTypes.DOUBLE) raimund@3886: .addScalar("data_gap", StandardBasicTypes.DOUBLE) raimund@3886: .addScalar("sounding_width", StandardBasicTypes.DOUBLE) raimund@3886: .addScalar("year", StandardBasicTypes.INTEGER); raimund@3614: sqlQuery.setInteger("height_id", height_id); raimund@3614: List results = sqlQuery.list(); raimund@3614: raimund@3897: for (int i = 0; i < results.size(); i++) { raimund@3614: Object[] row = results.get(i); raimund@3897: log.debug("got station: " + (Double)row[1]); raimund@3886: height.add( raimund@3886: (Double) row[0], raimund@3886: (Double) row[1], raimund@3886: (Double) row[2], raimund@3886: (Double) row[3], raimund@3886: (Integer) row[4]); raimund@3614: } raimund@3886: return height; raimund@3614: } raimund@3614: else if (type.equals("epoch")) { raimund@3886: BedHeightEpoch height = raimund@3886: new BedHeightEpoch(getHeightName(type, height_id)); raimund@3614: sqlQuery = session.createSQLQuery(SQL_SELECT_EPOCH) raimund@3614: .addScalar("height", StandardBasicTypes.DOUBLE) raimund@3886: .addScalar("station", StandardBasicTypes.DOUBLE) raimund@3886: .addScalar("start_time", StandardBasicTypes.DATE) raimund@3886: .addScalar("stop_time", StandardBasicTypes.DATE); raimund@3614: sqlQuery.setInteger("height_id", height_id); raimund@3614: List results = sqlQuery.list(); raimund@3614: teichmann@4051: for (Object [] row: results) { raimund@3886: height.add( raimund@3886: (Double) row[0], raimund@3886: (Double) row[1], teichmann@4051: (Date) row[2], teichmann@4051: (Date) row[3]); raimund@3614: } raimund@3886: return height; raimund@3614: } raimund@3886: return new BedHeight(); raimund@3614: } raimund@3614: } raimund@3614: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :