diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java @ 4001:ab3a4ad82ae1

S(Q) accumulated same diameter meassurements per bank distance.
author Sascha L. Teichmann <teichmann@intevation.de>
date Mon, 01 Oct 2012 14:03:13 +0200
parents a9c93b7c9da1
children 3b79e8afca7e
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java	Mon Oct 01 10:42:53 2012 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java	Mon Oct 01 14:03:13 2012 +0200
@@ -2,6 +2,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.TreeMap;
 
 import de.intevation.flys.artifacts.model.DateRange;
 
@@ -102,7 +103,7 @@
                 "COALESCE(gs.RSIEB17, 0) + COALESCE(gs.RSIEB18, 0) +" +
                 "COALESCE(gs.RSIEB19, 0) + COALESCE(gs.RSIEB20, 0) +" +
                 "COALESCE(gs.RSIEB21, 0) + COALESCE(gs.REST, 0)) > 0 " +
-        "ORDER BY m.DATUM, gp.LFDNR, g.UFERABST";
+        "ORDER BY m.DATUM, g.UFERABST, g.GLOTRECHTEID, gp.LFDNR";
 
     public static final class MeasurementResultTransformer
     extends                   BasicTransformerAdapter
@@ -237,29 +238,70 @@
         @SuppressWarnings("unchecked")
 		List<Measurement> measuments = (List<Measurement>)query.list();
 
+        List<Measurement> same = new ArrayList<Measurement>();
+
         Integer lastLR = null;
 
-        for (int i = 0, N = measuments.size(); i < N; ++i) {
-            Measurement m = measuments.get(i);
+        List<Measurement> accumulated = new ArrayList<Measurement>();
+
+        for (Measurement m: measuments) {
 
             Integer currentLR = (Integer)m.getData("GLOTRECHTEID");
 
             boolean newDS = lastLR == null
                 || (currentLR != null && !lastLR.equals(currentLR));
 
-            Measurement p = i >   0 ? measuments.get(i-1) : null;
-            Measurement n = i < N-1 ? measuments.get(i+1) : null;
-            m.setPrev(newDS ? null : p);
-            m.setNext(n);
-
-            if (p != null && newDS) {
-                p.setNext(null);
+            if (newDS && !same.isEmpty()) {
+                accumulated.add(accumulate(same));
+                same.clear();
             }
 
             lastLR = currentLR;
         }
 
-        return new Measurements(measuments);
+        if (!same.isEmpty()) {
+            accumulated.add(accumulate(same));
+        }
+
+        for (Measurement m: accumulated) {
+            m.adjustSieves();
+        }
+
+        return new Measurements(measuments, accumulated);
+    }
+
+    protected static Measurement accumulate(List<Measurement> measuments) {
+
+        int N = measuments.size();
+        if (N == 1) {
+            return measuments.get(0);
+        }
+
+        TreeMap<Double, double []> diameters =
+            new TreeMap<Double, double []>(Sieve.DIAMETER_CMP);
+
+        for (Measurement m: measuments) {
+            for (Sieve s: m.getSieves()) {
+                Double key = s.getDiameter();
+                double [] sum = diameters.get(key);
+                if (sum == null) {
+                    sum = new double[1];
+                    diameters.put(key, sum);
+                }
+                sum[0] += s.getLoad();
+            }
+        }
+        List<Sieve> accumulatedSieves = new ArrayList<Sieve>(diameters.size());
+        for (Map.Entry<Double, double []> entry: diameters.entrySet()) {
+            accumulatedSieves.add(
+                new Sieve(entry.getKey(),
+                    entry.getValue()[0]/N));
+        }
+
+        Map<String, Object> data =
+            new HashMap<String, Object>(measuments.get(0).getData());
+
+        return new Measurement(data, accumulatedSieves);
     }
 
     public static Measurements getMeasurements(

http://dive4elements.wald.intevation.org