Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WstValueTableFactory2.java @ 632:07640ab913fd
First part of storing qs in ranges
flys-artifacts/trunk@1997 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Tue, 24 May 2011 14:46:45 +0000 |
parents | |
children |
line wrap: on
line source
package de.intevation.flys.artifacts.model; import java.util.List; import net.sf.ehcache.Cache; import net.sf.ehcache.Element; import de.intevation.flys.artifacts.cache.CacheFactory; import de.intevation.flys.backend.SessionHolder; import org.apache.log4j.Logger; import de.intevation.flys.model.River; import de.intevation.flys.model.Wst; import org.hibernate.Session; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.type.StandardBasicTypes; public class WstValueTableFactory2 { private static Logger log = Logger.getLogger(WstValueTableFactory2.class); public static final int DEFAULT_KIND = 0; // TODO: put this into a property file public static final String HQL_WST = "from Wst where river=:river and kind=:kind"; public static final String SQL_SELECT_NAMES_POS = "SELECT position, name FROM wst_columns " + "WHERE wst_id = :wst_id ORDER BY position"; public static final String SQL_SELECT_QS = "SELECT column_pos, q, a, b FROM wst_q_values " + "WHERE wst_id = :wst_id"; public static final String SQL_SELECT_WS = "SELECT km, w, column_pos FROM wst_w_values " + "WHERE wst_id = :wst_id"; private WstValueTableFactory2() { } public static WstValueTable getTable(River river) { return getTable(river, DEFAULT_KIND); } public static WstValueTable getTable(River river, int kind) { Cache cache = CacheFactory.getCache(WstValueTableCacheKey.CACHE_NAME); WstValueTableCacheKey cacheKey; if (cache != null) { cacheKey = new WstValueTableCacheKey(river.getId(), kind); Element element = cache.get(cacheKey); if (element != null) { log.debug("got wst value table from cache"); return (WstValueTable)element.getValue(); } } else { cacheKey = null; } WstValueTable valueTable = getTableUncached(river, kind); if (valueTable != null && cacheKey != null) { log.debug("store wst value table in cache"); Element element = new Element(cacheKey, valueTable); cache.put(element); } return valueTable; } public static WstValueTable getTableUncached(River river) { return getTableUncached(river, DEFAULT_KIND); } public static WstValueTable getTableUncached(River river, int kind) { Session session = SessionHolder.HOLDER.get(); Query query = session.createQuery(HQL_WST); query.setParameter("river", river); query.setInteger("kind", kind); List<Wst> wsts = query.list(); if (wsts.isEmpty()) { return null; } Wst wst = wsts.get(0); SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT_NAMES_POS) .addScalar("position", StandardBasicTypes.INTEGER) .addScalar("name", StandardBasicTypes.STRING); sqlQuery.setInteger("wst_id", wst.getId()); List<Object []> columnNames = sqlQuery.list(); WstValueTable.Column [] columns = new WstValueTable.Column[columnNames.size()]; for (int i = 0; i < columns.length; ++i) { columns[i] = new WstValueTable.Column( (String)columnNames.get(i)[1]); } sqlQuery = session.createSQLQuery(SQL_SELECT_QS) .addScalar("column_pos", StandardBasicTypes.INTEGER) .addScalar("q", StandardBasicTypes.DOUBLE) .addScalar("a", StandardBasicTypes.DOUBLE) .addScalar("b", StandardBasicTypes.DOUBLE); sqlQuery.setInteger("wst_id", wst.getId()); Integer lastColumn = null; List<Object []> qRanges = sqlQuery.list(); int start = -1; int Q = qRanges.size(); for (int i = 0; i < Q; ++i) { Object [] qRange = qRanges.get(i); Integer columnId = (Integer)qRange[0]; if (lastColumn == null) { lastColumn = columnId; start = i; } else if (!lastColumn.equals(columnId)) { QRangeTree qRangeTree = new QRangeTree(qRanges, start, i); columns[lastColumn].setQRangeTree(qRangeTree); lastColumn = columnId; start = i; } } if (start != -1) { QRangeTree qRangeTree = new QRangeTree(qRanges, start, Q); columns[lastColumn].setQRangeTree(qRangeTree); } /* This is debug code to visualize the q ranges trees java.io.PrintWriter out = null; try { out = new java.io.PrintWriter( new java.io.FileWriter( "/tmp/qranges" + System.currentTimeMillis() + ".dot")); out.println("graph \"Q ranges trees\" {"); for (int i = 0; i < columns.length; ++i) { QRangeTree tree = columns[i].getQRangeTree(); out.println(tree.toGraph()); } out.println("}"); out.flush(); } catch (java.io.IOException ioe) { log.error(ioe); } finally { if (out != null) { out.close(); } } */ // TODO: Implement me! return null; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :