Mercurial > dive4elements > river
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(