teichmann@5831: package org.dive4elements.river.artifacts.model; sascha@2615: teichmann@5831: import org.dive4elements.river.artifacts.model.FixingsOverview.Fixing; sascha@2615: teichmann@5831: import org.dive4elements.river.artifacts.cache.CacheFactory; sascha@2619: teichmann@5831: import org.dive4elements.river.backend.SessionHolder; sascha@2619: sascha@2619: import java.util.List; sascha@2619: sascha@2619: import net.sf.ehcache.Cache; sascha@2619: import net.sf.ehcache.Element; sascha@2619: sascha@2619: import org.hibernate.Session; sascha@2619: import org.hibernate.SQLQuery; sascha@2619: sascha@2619: import org.hibernate.type.StandardBasicTypes; sascha@2619: sascha@2622: import org.apache.log4j.Logger; sascha@2622: sascha@2615: public class FixingsColumnFactory sascha@2615: { sascha@2622: private static Logger log = Logger.getLogger(FixingsColumnFactory.class); sascha@2622: sascha@2622: public static final String CACHE_NAME = "fixings-columns"; sascha@2615: sascha@2619: public static final String SQL_COLUMN_WS = sascha@2615: "SELECT wcv.position AS km, wcv.w AS w " + sascha@2615: "FROM wst_column_values wcv " + sascha@2615: "WHERE wst_column_id = :column_id " + sascha@2615: "ORDER by wcv.position"; sascha@2615: sascha@2619: public static final String SQL_COLUMN_QS = sascha@2615: "SELECT wqr.q AS q, r.a AS a, r.b AS b " + sascha@2615: "FROM wst_column_q_ranges wcqr " + sascha@2615: "JOIN wst_q_ranges wqr ON wcqr.wst_q_range_id = wqr.id " + sascha@2615: "JOIN ranges r ON wqr.range_id = r.id " + sascha@2615: "WHERE wcqr.wst_column_id = :column_id ORDER by r.a"; sascha@2615: sascha@2615: public static final FixingsColumnFactory INSTANCE = sascha@2615: new FixingsColumnFactory(); sascha@2615: sascha@2615: private FixingsColumnFactory() { sascha@2615: } sascha@2615: sascha@2729: public static FixingsColumnFactory getInstance() { sascha@2729: return INSTANCE; sascha@2729: } sascha@2729: sascha@2615: public FixingsColumn getColumnData(Fixing.Column column) { sascha@2619: sascha@2622: boolean debug = log.isDebugEnabled(); sascha@2622: sascha@2622: if (debug) { sascha@2622: log.debug("FixingsColumnFactory.getColumnData"); sascha@2622: } sascha@2619: sascha@2619: Cache cache = CacheFactory.getCache(CACHE_NAME); sascha@2619: sascha@2622: if (cache == null) { sascha@2622: if (debug) { sascha@2622: log.debug("Cache unconfigured."); sascha@2622: } sascha@2622: return getUncached(column); sascha@2622: } sascha@2619: sascha@2622: Integer cacheKey = Integer.valueOf(column.getId()); sascha@2622: Element element = cache.get(cacheKey); sascha@2622: sascha@2622: if (element != null) { sascha@2622: if (debug) { sascha@2622: log.debug("Column " + cacheKey + " found in cache."); sascha@2619: } sascha@2622: return (FixingsColumn)element.getValue(); sascha@2622: } sascha@2622: else { sascha@2622: FixingsColumn result = getUncached(column); sascha@2622: if (result != null) { sascha@2622: if (debug) { sascha@2622: log.debug("Store column " + cacheKey + " into cache."); sascha@2622: } sascha@2620: cache.put(new Element(cacheKey, result)); sascha@2620: } sascha@2622: return result; sascha@2619: } sascha@2619: } sascha@2619: sascha@2619: protected FixingsColumn getUncached(Fixing.Column column) { sascha@2619: Session session = SessionHolder.HOLDER.get(); sascha@2619: sascha@2619: SQLQuery sqlQuery = session.createSQLQuery(SQL_COLUMN_WS) sascha@2619: .addScalar("km", StandardBasicTypes.DOUBLE) sascha@2619: .addScalar("w", StandardBasicTypes.DOUBLE); sascha@2619: sascha@2619: sqlQuery.setInteger("column_id", column.getId()); sascha@2619: sascha@2619: List results = sqlQuery.list(); sascha@2619: sascha@2620: if (results.isEmpty()) { sascha@2620: return null; sascha@2620: } sascha@2620: sascha@2619: double [] kms = new double[results.size()]; sascha@2619: double [] ws = new double[kms.length]; sascha@2619: sascha@2619: for (int i = 0; i < kms.length; ++i) { sascha@2619: Object [] row = results.get(i); sascha@2619: kms[i] = ((Double)row[0]).doubleValue(); sascha@2619: ws [i] = ((Double)row[1]).doubleValue(); sascha@2619: } sascha@2619: sascha@2619: sqlQuery = session.createSQLQuery(SQL_COLUMN_QS) sascha@2619: .addScalar("q", StandardBasicTypes.DOUBLE) sascha@2619: .addScalar("a", StandardBasicTypes.DOUBLE) sascha@2619: .addScalar("b", StandardBasicTypes.DOUBLE); sascha@2619: sascha@2619: sqlQuery.setInteger("column_id", column.getId()); sascha@2619: sascha@2619: results = sqlQuery.list(); sascha@2619: sascha@2620: if (results.isEmpty()) { sascha@2620: return null; sascha@2620: } sascha@2620: sascha@2619: QRangeTree qs = new QRangeTree( sascha@2619: results, QRangeTree.WITHOUT_COLUMN, 0, results.size()); sascha@2619: sascha@2619: return new FixingsColumn(kms, ws, qs); sascha@2615: } sascha@2615: } sascha@2615: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :