diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/FixingsColumnFactory.java @ 2619:6ed24efc80de

Loaded columns of fixings from database and store them into the cache. flys-artifacts/trunk@4204 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 05 Apr 2012 15:29:52 +0000
parents b0597a63fe70
children cc0fa1798a3c
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/FixingsColumnFactory.java	Thu Apr 05 15:29:25 2012 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/FixingsColumnFactory.java	Thu Apr 05 15:29:52 2012 +0000
@@ -2,17 +2,31 @@
 
 import de.intevation.flys.artifacts.model.FixingsOverview.Fixing;
 
+import de.intevation.flys.artifacts.cache.CacheFactory;
+
+import de.intevation.flys.backend.SessionHolder;
+
+import java.util.List;
+
+import net.sf.ehcache.Cache;
+import net.sf.ehcache.Element;
+
+import org.hibernate.Session;
+import org.hibernate.SQLQuery;
+
+import org.hibernate.type.StandardBasicTypes;
+
 public class FixingsColumnFactory
 {
     public static final String CACHE_NAME = "fixing-columns";
 
-    public static final String SQL_COLUMN_W =
+    public static final String SQL_COLUMN_WS =
         "SELECT wcv.position AS km, wcv.w AS w " +
         "FROM wst_column_values wcv " +
         "WHERE wst_column_id = :column_id " +
         "ORDER by wcv.position";
 
-    public static final String SQL_COLUMN_Q =
+    public static final String SQL_COLUMN_QS =
         "SELECT wqr.q AS q, r.a AS a, r.b AS b " +
         "FROM wst_column_q_ranges wcqr " +
         "JOIN wst_q_ranges wqr ON wcqr.wst_q_range_id = wqr.id " +
@@ -26,8 +40,62 @@
     }
 
     public FixingsColumn getColumnData(Fixing.Column column) {
-        // TODO: Implement me!
-        return null;
+
+        FixingsColumn result;
+
+        Cache cache = CacheFactory.getCache(CACHE_NAME);
+
+        if (cache != null) {
+            Integer cacheKey = Integer.valueOf(column.getId());
+            Element element = cache.get(cacheKey);
+
+            if (element != null) {
+                return (FixingsColumn)element.getValue();
+            }
+
+            result = getUncached(column);
+            cache.put(new Element(cacheKey, result));
+        }
+        else {
+            result = getUncached(column);
+        }
+
+        return result;
+    }
+
+    protected FixingsColumn getUncached(Fixing.Column column) {
+        Session session = SessionHolder.HOLDER.get();
+
+        SQLQuery sqlQuery = session.createSQLQuery(SQL_COLUMN_WS)
+            .addScalar("km", StandardBasicTypes.DOUBLE)
+            .addScalar("w",  StandardBasicTypes.DOUBLE);
+
+        sqlQuery.setInteger("column_id", column.getId());
+
+        List<Object []> results = sqlQuery.list();
+
+        double [] kms = new double[results.size()];
+        double [] ws  = new double[kms.length];
+
+        for (int i = 0; i < kms.length; ++i) {
+            Object [] row = results.get(i);
+            kms[i] = ((Double)row[0]).doubleValue();
+            ws [i] = ((Double)row[1]).doubleValue();
+        }
+
+        sqlQuery = session.createSQLQuery(SQL_COLUMN_QS)
+            .addScalar("q", StandardBasicTypes.DOUBLE)
+            .addScalar("a", StandardBasicTypes.DOUBLE)
+            .addScalar("b", StandardBasicTypes.DOUBLE);
+
+        sqlQuery.setInteger("column_id", column.getId());
+
+        results = sqlQuery.list();
+
+        QRangeTree qs = new QRangeTree(
+            results, QRangeTree.WITHOUT_COLUMN, 0, results.size());
+
+        return new FixingsColumn(kms, ws, qs);
     }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org