changeset 4370:6a65e7ef43c0

Updated data object and factory for sediment load. * Added new data fields to object and cache key. * Fixed SQL statement in factory and fill load objects correctly. *
author Raimund Renkert <rrenkert@intevation.de>
date Fri, 02 Nov 2012 14:48:16 +0100
parents 8ddab49ff297
children 26afee1b8959
files flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/StaticSedimentLoadCacheKey.java flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoad.java flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadFactory.java
diffstat 3 files changed, 186 insertions(+), 123 deletions(-) [+]
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/StaticSedimentLoadCacheKey.java	Fri Nov 02 14:44:11 2012 +0100
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/StaticSedimentLoadCacheKey.java	Fri Nov 02 14:48:16 2012 +0100
@@ -12,18 +12,21 @@
     private String river;
     private double startKm;
     private double endKm;
-    private Date date;
+    private int sYear;
+    private int eYear;
 
     public StaticSedimentLoadCacheKey(
         String river,
         double startKm,
         double endKm,
-        Date date
+        int sYear,
+        int eYear
     ) {
         this.river = river;
         this.startKm = startKm;
         this.endKm = endKm;
-        this.date = date;
+        this.sYear = sYear;
+        this.eYear = eYear;
     }
 
     public int hashCode() {
@@ -31,7 +34,8 @@
         builder.append(river);
         builder.append(startKm);
         builder.append(endKm);
-        builder.append(date);
+        builder.append(sYear);
+        builder.append(eYear);
         return builder.toHashCode();
     }
 
@@ -43,6 +47,7 @@
         return this.river == o.river &&
             this.startKm == o.startKm &&
             this.endKm == o.endKm &&
-            this.date == o.date;
+            this.sYear == o.sYear &&
+            this.eYear == o.eYear;
     }
 }
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoad.java	Fri Nov 02 14:44:11 2012 +0100
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoad.java	Fri Nov 02 14:48:16 2012 +0100
@@ -1,8 +1,13 @@
 package de.intevation.flys.artifacts.model.minfo;
 
 import gnu.trove.TDoubleArrayList;
+import gnu.trove.TDoubleByteHashMap;
+import gnu.trove.TDoubleHash;
+import gnu.trove.TDoubleHashSet;
 
 import java.util.Date;
+import java.util.HashMap;
+import java.util.Set;
 
 import org.apache.log4j.Logger;
 
@@ -19,14 +24,10 @@
     protected Date end;
     protected boolean isEpoch;
 
-    protected TDoubleArrayList sand_values;
-    protected TDoubleArrayList fine_middle_values;
-    protected TDoubleArrayList coarse_values;
-    protected TDoubleArrayList susp_sediment_values;
-    protected TDoubleArrayList susp_sand_bed_values;
-
+    protected HashMap<Double, SedimentLoadFraction> kms;
 
     public SedimentLoad() {
+        kms = new HashMap<Double, SedimentLoadFraction>();
     }
 
     public SedimentLoad(
@@ -35,6 +36,7 @@
         Date end,
         boolean isEpoch
     ) {
+        this();
         this.description = description;
         this.start = start;
         this.end = end;
@@ -73,63 +75,95 @@
         this.isEpoch = isEpoch;
     }
 
-    public void addSandValue(double value) {
-        this.sand_values.add(value);
-    }
-
-    public void addSandValues(TDoubleArrayList values) {
-        this.sand_values.add(values.toNativeArray());
-    }
-
-    public TDoubleArrayList getSandValues() {
-        return this.sand_values;
-    }
-
-    public void addFineMiddleValue(double value) {
-        this.fine_middle_values.add(value);
-    }
-
-    public void addFineMiddleValues(TDoubleArrayList values) {
-        this.fine_middle_values.add(values.toNativeArray());
-    }
-
-    public TDoubleArrayList getFineMiddleValues() {
-        return this.fine_middle_values;
-    }
-
-    public void addCoarseValue(double value) {
-        this.coarse_values.add(value);
+    public Set<Double> getKms() {
+        return kms.keySet();
     }
 
-    public void addCoarseValues(TDoubleArrayList values) {
-        this.coarse_values.add(values.toNativeArray());
-    }
-
-    public TDoubleArrayList getCoarseValues() {
-        return this.coarse_values;
-    }
-
-    public void addSuspSedimentValue(double value) {
-        this.susp_sediment_values.add(value);
-    }
-
-    public void addSuspSedimentValues(TDoubleArrayList values) {
-        this.susp_sediment_values.add(values.toNativeArray());
+    public void addKm(double km, SedimentLoadFraction fraction) {
+        kms.put(km, fraction);
     }
 
-   public TDoubleArrayList getSuspSedimentValues() {
-        return this.susp_sediment_values;
-    }
-
-    public void addSuspSandBedValue(double value) {
-        this.susp_sand_bed_values.add(value);
+    public SedimentLoadFraction getFraction(double km) {
+        if (kms.get(km) == null) {
+            return new SedimentLoadFraction();
+        }
+        return kms.get(km);
     }
 
-    public void addSuspSandBedValues(TDoubleArrayList values) {
-        this.susp_sand_bed_values.add(values.toNativeArray());
+    public void setCoarse(double km, double coarse) {
+        if (kms.containsKey(km)) {
+            kms.get(km).setCoarse(coarse);
+        }
+        else {
+            SedimentLoadFraction f = new SedimentLoadFraction();
+            f.setCoarse(coarse);
+            kms.put(km, f);
+        }
     }
 
-    public TDoubleArrayList getSuspSandBedValues() {
-        return this.susp_sand_bed_values;
+    public void setFineMiddle(double km, double fine_middle) {
+        if (kms.containsKey(km)) {
+            kms.get(km).setFine_middle(fine_middle);
+        }
+        else {
+            SedimentLoadFraction f = new SedimentLoadFraction();
+            f.setFine_middle(fine_middle);
+            kms.put(km, f);
+        }
+    }
+
+    public void setSand(double km, double sand) {
+        if (kms.containsKey(km)) {
+            kms.get(km).setSand(sand);
+        }
+        else {
+            SedimentLoadFraction f = new SedimentLoadFraction();
+            f.setSand(sand);
+            kms.put(km, f);
+        }
+    }
+
+    public void setSuspSand(double km, double susp_sand) {
+        if (kms.containsKey(km)) {
+            kms.get(km).setSusp_sand(susp_sand);
+        }
+        else {
+            SedimentLoadFraction f = new SedimentLoadFraction();
+            f.setSusp_sand(susp_sand);
+            kms.put(km, f);
+        }
+    }
+
+    public void setSuspSandBed(double km, double susp_sand_bed) {
+        if (kms.containsKey(km)) {
+            kms.get(km).setSusp_sand_bed(susp_sand_bed);
+        }
+        else {
+            SedimentLoadFraction f = new SedimentLoadFraction();
+            f.setSusp_sand_bed(susp_sand_bed);
+            kms.put(km, f);
+        }
+    }
+
+    public void setSuspSediment(double km, double susp_sediment) {
+        if (kms.containsKey(km)) {
+            kms.get(km).setSusp_sediment(susp_sediment);
+        }
+        else {
+            SedimentLoadFraction f = new SedimentLoadFraction();
+            f.setSusp_sediment(susp_sediment);
+            kms.put(km, f);
+        }
+    }
+
+    public void setTotal(double km, double total) {
+        if (kms.containsKey(km)) {
+            kms.get(km).setTotal(total);
+        }
+        else {
+            SedimentLoadFraction f = new SedimentLoadFraction();
+            f.setTotal(total);
+            kms.put(km, f);
+        }
     }
 }
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadFactory.java	Fri Nov 02 14:44:11 2012 +0100
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadFactory.java	Fri Nov 02 14:48:16 2012 +0100
@@ -58,32 +58,34 @@
         "SELECT" +
         "       sy.description AS description, " +
         "       ti.start_time AS year, " +
-        "       syv.value AS load " +
+        "       syv.value AS load, " +
+        "       syv.station AS km " +
         "   FROM     sediment_yield sy " +
         "       JOIN rivers r ON sy.river_id = r.id " +
         "       JOIN time_intervals ti ON sy.time_interval_id = ti.id " +
-        "       JOIN sediment_yield_vales syv ON sy.id = syv.sediment_yield_id " +
+        "       JOIN sediment_yield_values syv ON sy.id = syv.sediment_yield_id " +
         "       JOIN grain_fraction gf ON sy.grain_fraction_id = gf.id " +
         "   WHERE   r.name = :name " +
         "       AND ti.start_time BETWEEN :begin AND :end " +
-        "       AND ti_stop_time IS NULL " +
+        "       AND ti.stop_time IS NULL " +
         "       AND gf.name = :grain " +
         "       AND syv.station BETWEEN :startKm AND :endKm";
 
     public static final String SQL_SELECT_EPOCHS_DATA =
         "SELECT" +
-        "       sy.description AS description," +
-        "       ti.start_time AS year," +
-        "       syv.value AS load" +
+        "       sy.description AS description, " +
+        "       ti.start_time AS year, " +
+        "       syv.value AS load, " +
+        "       syv.station AS km " +
         "   FROM     sediment_yield sy" +
         "       JOIN rivers r ON sy.river_id = r.id " +
         "       JOIN time_intervals ti ON sy.time_interval_id = ti.id" +
-        "       JOIN sediment_yield_vales syv ON sy.id = syv.sediment_yield_id" +
+        "       JOIN sediment_yield_values syv ON sy.id = syv.sediment_yield_id" +
         "       JOIN grain_fraction gf ON sy.grain_fraction_id = gf.id" +
         "   WHERE   r.name = :name" +
         "       AND ti.start_time BETWEEN :sbegin AND :send" +
-        "       AND ti_stop_time IS NOT NULL" +
-        "       AND ti_stop_time BETWEEN :ebegin AND :eend" +
+        "       AND ti.stop_time IS NOT NULL" +
+        "       AND ti.stop_time BETWEEN :ebegin AND :eend" +
         "       AND gf.name = :grain " +
         "       AND syv.station BETWEEN :startKm AND :endKm";
 
@@ -108,7 +110,7 @@
         }
 
         StaticSedimentLoadCacheKey key =
-            new StaticSedimentLoadCacheKey(river, startKm, endKm, null);
+            new StaticSedimentLoadCacheKey(river, startKm, endKm, 0, 0);
 
         Element element = cache.get(key);
 
@@ -121,7 +123,7 @@
             getSedimentLoadsUncached(river, type, startKm, endKm);
 
         if (values != null && key != null) {
-            log.debug("Store static sediment loads  values in cache.");
+            log.debug("Store static sediment load values in cache.");
             element = new Element(key, values);
             cache.put(element);
         }
@@ -133,8 +135,8 @@
         String type,
         double startKm,
         double endKm,
-        Date startDate,
-        Date endDate
+        int syear,
+        int eyear
     ) {
         log.debug("SedimentLoadFactory.getLoadWithData");
         Cache cache = CacheFactory.getCache(LOAD_DATA_CACHE_NAME);
@@ -146,12 +148,12 @@
                 type,
                 startKm,
                 endKm,
-                startDate,
-                endDate);
+                syear,
+                eyear);
         }
 
         StaticSedimentLoadCacheKey key =
-            new StaticSedimentLoadCacheKey(river, startKm, endKm, startDate);
+            new StaticSedimentLoadCacheKey(river, startKm, endKm, syear, eyear);
 
         Element element = cache.get(key);
 
@@ -160,8 +162,13 @@
             return (SedimentLoad)element.getValue();
         }
 
-        SedimentLoad values =
-            getSedimentLoadWithDataUncached(river, type, startKm, endKm, startDate, endDate);
+        SedimentLoad values = getSedimentLoadWithDataUncached(
+            river,
+            type,
+            startKm,
+            endKm,
+            syear,
+            eyear);
 
         if (values != null && key != null) {
             log.debug("Store static bed height values in cache.");
@@ -243,58 +250,52 @@
         String type,
         double startKm,
         double endKm,
-        Date sdate,
-        Date edate
+        int syear,
+        int eyear
     ) {
-        log.debug("SedimentLoadFactory.getBedHeightUncached");
+        log.debug("SedimentLoadFactory.getSedimentLoadWithDataUncached");
 
         Session session = SessionHolder.HOLDER.get();
         SQLQuery sqlQuery = null;
 
-        Calendar cal = Calendar.getInstance();
-        cal.setTime(sdate);
-        int year = cal.get(Calendar.YEAR);
-        cal.set(year, 1, 1);
+        Calendar start = Calendar.getInstance();
+        start.set(syear, 1, 1);
         Calendar end = Calendar.getInstance();
-        end.set(year, 12, 31);
+        end.set(syear, 12, 31);
 
-        if (type.equals("single")) {
+        if (type.equals("year") || type.equals("epoch")) {
             sqlQuery = session.createSQLQuery(SQL_SELECT_SINGLES_DATA)
                 .addScalar("description", StandardBasicTypes.STRING)
                 .addScalar("year", StandardBasicTypes.DATE)
-                .addScalar("load", StandardBasicTypes.DOUBLE);
+                .addScalar("load", StandardBasicTypes.DOUBLE)
+                .addScalar("km", StandardBasicTypes.DOUBLE);
             sqlQuery.setString("name", river);
             sqlQuery.setDouble("startKm", startKm);
             sqlQuery.setDouble("endKm", endKm);
-            sqlQuery.setDate("begin", cal.getTime());
+            sqlQuery.setDate("begin", start.getTime());
             sqlQuery.setDate("end", end.getTime());
             sqlQuery.setString("grain", "total");
             List<Object []> results = sqlQuery.list();
             SedimentLoad load = new SedimentLoad();
-            if (results.size() != 1) {
-                // should not happen. throw some exception.
-                return new SedimentLoad();
-            }
             Object[] row = results.get(0);
             load = new SedimentLoad(
                     (String) row[0],
                     (Date) row[1],
                     null,
                     false);
-            load.addCoarseValues(getValues("coarse", sqlQuery));
-            load.addFineMiddleValues(getValues("fine_middle", sqlQuery));
-            load.addSandValues(getValues("sand", sqlQuery));
-            load.addSuspSandBedValues(getValues("suspended_sediment", sqlQuery));
-            load.addSuspSandBedValues(getValues("susp_sand_bed", sqlQuery));
+            getValues("coarse", sqlQuery, load);
+            getValues("fine_middle", sqlQuery, load);
+            getValues("sand", sqlQuery, load);
+            getValues("suspended_sediment", sqlQuery, load);
+            getValues("susp_sand_bed", sqlQuery, load);
+            getValues("susp_sand", sqlQuery, load);
             return load;
         }
-        else if (type.equals("epoch")) {
-            Calendar send = Calendar.getInstance();
-            send.setTime(edate);
-            int eyear = send.get(Calendar.YEAR);
-            send.set(year, 1, 1);
-            Calendar eend = Calendar.getInstance();
-            eend.set(eyear, 12, 31);
+        else if (type.equals("off_epoch")) {
+            Calendar toStart = Calendar.getInstance();
+            toStart.set(eyear, 1, 1);
+            Calendar toEnd = Calendar.getInstance();
+            toEnd.set(eyear, 12, 31);
 
             sqlQuery = session.createSQLQuery(SQL_SELECT_EPOCHS)
                 .addScalar("description", StandardBasicTypes.STRING)
@@ -304,30 +305,32 @@
             sqlQuery.setString("name", river);
             sqlQuery.setDouble("startKm", startKm);
             sqlQuery.setDouble("endKm", endKm);
-            sqlQuery.setDate("sbegin", cal.getTime());
+            sqlQuery.setDate("sbegin", start.getTime());
             sqlQuery.setDate("sbegin", end.getTime());
-            sqlQuery.setDate("ebegin",send.getTime());
-            sqlQuery.setDate("eend", eend.getTime());
+            sqlQuery.setDate("ebegin",toStart.getTime());
+            sqlQuery.setDate("eend", toEnd.getTime());
             sqlQuery.setString("grain", "total");
 
             List<Object []> results = sqlQuery.list();
 
             SedimentLoad load = new SedimentLoad();
-            if (results.size() != 1) {
-                // should not happen. throw some exception.
-                return new SedimentLoad();
-            }
             Object[] row = results.get(0);
             load = new SedimentLoad(
                     (String) row[0],
                     (Date) row[1],
                     null,
                     false);
-            load.addCoarseValues(getValues("coarse", sqlQuery));
-            load.addFineMiddleValues(getValues("fine_middle", sqlQuery));
-            load.addSandValues(getValues("sand", sqlQuery));
-            load.addSuspSandBedValues(getValues("suspended_sediment", sqlQuery));
-            load.addSuspSandBedValues(getValues("susp_sand_bed", sqlQuery));
+            TDoubleArrayList kms = new TDoubleArrayList();
+            for (int i = 0; i < results.size(); i++) {
+                row = results.get(i);
+                kms.add((Double)row[3]);
+            }
+            getValues("coarse", sqlQuery, load);
+            getValues("fine_middle", sqlQuery, load);
+            getValues("sand", sqlQuery, load);
+            getValues("suspended_sediment", sqlQuery, load);
+            getValues("susp_sand_bed", sqlQuery, load);
+            getValues("susp_sand", sqlQuery, load);
             return load;
         }
         return new SedimentLoad();
@@ -336,17 +339,38 @@
     /**
      * 
      */
-    protected static TDoubleArrayList getValues (
+    protected static void getValues (
         String fraction,
-        SQLQuery query
+        SQLQuery query,
+        SedimentLoad load
     ) {
         query.setString("grain", fraction);
         List<Object[]> results = query.list();
-        TDoubleArrayList values = new TDoubleArrayList();
         for (int i = 0; i < results.size(); i++) {
             Object[] row = results.get(i);
-            values.add(((Double)row[2]).doubleValue());
+            double km = (Double)row[3];
+            double v = -1;
+            if (row[2] != null) {
+                v = ((Double)row[2]).doubleValue();
+            }
+            if (fraction.equals("coarse")) {
+                load.setCoarse(km, v);
+            }
+            else if (fraction.equals("sand")) {
+                load.setSand(km, v);
+            }
+            else if (fraction.equals("fine_middle")) {
+                load.setFineMiddle(km, v);
+            }
+            else if (fraction.equals("suspended_sediment")) {
+                load.setSuspSediment(km, v);
+            }
+            else if (fraction.equals("sups_sand")) {
+                load.setSuspSand(km, v);
+            }
+            else if (fraction.equals("susp_sand_bed")) {
+                load.setSuspSandBed(km, v);
+            }
         }
-        return values;
     }
 }

http://dive4elements.wald.intevation.org