annotate artifacts/src/main/java/org/dive4elements/river/artifacts/states/WaterlevelFetcher.java @ 9425:3f49835a00c3

Extended CrossSectionFacet so it may fetch different data from within the artifact result. Also allows to have acces to the potentially already computed artifact result via its normal computation cache.
author gernotbelger
date Fri, 17 Aug 2018 15:31:02 +0200
parents 392745cccede
children 93389a05119e
rev   line source
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
2 * Software engineering by
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
3 * Björnsen Beratende Ingenieure GmbH
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
5 *
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
6 * This file is Free Software under the GNU AGPL (>=v3)
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
8 * documentation coming with Dive4Elements River for details.
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
9 */
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
10 package org.dive4elements.river.artifacts.states;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
11
8962
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
12 import java.util.Calendar;
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
13 import java.util.Date;
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
14 import java.util.List;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
15
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
16 import org.apache.commons.lang.math.DoubleRange;
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
17 import org.apache.log4j.Logger;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
18 import org.dive4elements.artifacts.CallContext;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
19 import org.dive4elements.river.artifacts.D4EArtifact;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
20 import org.dive4elements.river.artifacts.FixationArtifact;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
21 import org.dive4elements.river.artifacts.StaticWKmsArtifact;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
22 import org.dive4elements.river.artifacts.StaticWQKmsArtifact;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
23 import org.dive4elements.river.artifacts.WINFOArtifact;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
24 import org.dive4elements.river.artifacts.access.FixRealizingAccess;
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8883
diff changeset
25 import org.dive4elements.river.artifacts.model.Calculation;
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
26 import org.dive4elements.river.artifacts.model.CalculationResult;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
27 import org.dive4elements.river.artifacts.model.Segment;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
28 import org.dive4elements.river.artifacts.model.WKms;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
29 import org.dive4elements.river.artifacts.model.WQKms;
8962
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
30 import org.dive4elements.river.artifacts.model.WstColumnFactory;
8883
a536e1aacf0f Further work on SINFO-FlowDepth
gernotbelger
parents: 8881
diff changeset
31 import org.dive4elements.river.artifacts.model.fixings.FixRealizingCalculationExtended;
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
32 import org.dive4elements.river.artifacts.model.fixings.FixRealizingResult;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
33 import org.dive4elements.river.artifacts.states.DefaultState.ComputeType;
8962
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
34 import org.dive4elements.river.model.TimeInterval;
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
35 import org.dive4elements.river.model.WstColumn;
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
36 import org.dive4elements.river.utils.RiverUtils;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
37
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
38 /**
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
39 * Helper class that accesses existing waterlevels (in most cases) from the data-cage.
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
40 * This is mainly a refaktoring of org.dive4elements.river.artifacts.states.WDifferencesState.getWKms(String,
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
41 * CallContext, double, double), adding more infos to the fetched water levels.
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
42 *
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
43 * @author Gernot Belger
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
44 */
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
45 public class WaterlevelFetcher {
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
46 private static Logger log = Logger.getLogger(WaterlevelFetcher.class);
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
47
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
48 /**
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
49 * @param simulationRange
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
50 * This range is used to check if the found waterlevel covers it. It is NOT used to reduce the fetched data,
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
51 * because in case of waterlevels we always need to full set in order to determine the relevant gauge.
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
52 */
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
53 public WaterlevelData findWaterlevel(final CallContext context, final String mingle, final DoubleRange simulationRange, final Calculation problems) {
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
54
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
55 final String[] def = mingle.split(";");
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
56 final String uuid = def[0];
8947
86650594f051 FixeD: waterlevel got wrong name
gernotbelger
parents: 8946
diff changeset
57 // final String factory = def[1];
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
58 final int idx = Integer.parseInt(def[2]);
8947
86650594f051 FixeD: waterlevel got wrong name
gernotbelger
parents: 8946
diff changeset
59 final String name = def[3];
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
60 final D4EArtifact d4eArtifact = RiverUtils.getArtifact(uuid, context);
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
61 if (d4eArtifact == null)
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
62 return null;
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
63
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
64 final WaterlevelData data = fetchWaterlevelFromArtifact(context, d4eArtifact, idx, Double.NaN, Double.NaN);
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
65 if (data == null) {
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
66 problems.addProblem("waterlevelfetcher.missing", mingle);
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
67 return null;
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
68 }
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8883
diff changeset
69
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
70 if (!data.covers(simulationRange)) {
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
71 problems.addProblem("waterlevelfetcher.empty", data.getName());
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
72 return null;
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
73 }
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
74
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
75 return data.withName(name);
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
76 }
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
77
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
78 private WaterlevelData fetchWaterlevelFromArtifact(final CallContext context, final D4EArtifact d4eArtifact, final int idx, final double from,
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
79 final double to) {
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
80
9362
392745cccede Fixed: waterlevels from database should not get the "Bezugspegel" column in the result output.
gernotbelger
parents: 8964
diff changeset
81 if (d4eArtifact instanceof StaticWKmsArtifact)
9425
3f49835a00c3 Extended CrossSectionFacet so it may fetch different data from within the artifact result.
gernotbelger
parents: 9362
diff changeset
82 return fetchStaticWKmsArtifactWaterlevel((StaticWKmsArtifact) d4eArtifact, from, to);
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
83
9362
392745cccede Fixed: waterlevels from database should not get the "Bezugspegel" column in the result output.
gernotbelger
parents: 8964
diff changeset
84 if (d4eArtifact instanceof StaticWQKmsArtifact)
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
85 return fetchStaticWQKmsArtifactWaterlevel((StaticWQKmsArtifact) d4eArtifact, from, to);
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
86
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
87 if (d4eArtifact instanceof WINFOArtifact)
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
88 return fetchWINFOArtifactWaterlevel(context, (WINFOArtifact) d4eArtifact, idx, from, to);
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
89
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
90 if (d4eArtifact instanceof FixationArtifact)
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
91 return fetchFixationArtifactWaterlevel(context, (FixationArtifact) d4eArtifact, idx, from, to);
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
92
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
93 log.warn(String.format("Get Waterlevel from %s not implemented!", d4eArtifact.getClass().getSimpleName()));
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
94 return null;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
95 }
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
96
8962
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
97 // REMARK: instead of several helper methods here this would be a good place for abstraction, in order to push
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
98 // this logic back to the corresponding artifacts. However this will most certainly break existing
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
99 // artifact-serialization
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
100
9425
3f49835a00c3 Extended CrossSectionFacet so it may fetch different data from within the artifact result.
gernotbelger
parents: 9362
diff changeset
101 private WaterlevelData fetchStaticWKmsArtifactWaterlevel(final StaticWKmsArtifact staticWKms, final double from, final double to) {
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
102
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
103 log.debug("WDifferencesState obtain data from StaticWKms");
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
104
9425
3f49835a00c3 Extended CrossSectionFacet so it may fetch different data from within the artifact result.
gernotbelger
parents: 9362
diff changeset
105 final WKms wkms = staticWKms.getWKms(from, to);
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
106
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
107 if (wkms != null) {
8962
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
108 final int year = fetchStaticWKmsYear(staticWKms);
9362
392745cccede Fixed: waterlevels from database should not get the "Bezugspegel" column in the result output.
gernotbelger
parents: 8964
diff changeset
109 return new WaterlevelData(wkms, year, false, false);
8883
a536e1aacf0f Further work on SINFO-FlowDepth
gernotbelger
parents: 8881
diff changeset
110 }
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
111
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
112 log.error("No WKms from Static artifact for this range.");
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
113 return null;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
114 }
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
115
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
116 private WaterlevelData fetchStaticWQKmsArtifactWaterlevel(final StaticWQKmsArtifact staticWKms, final double from, final double to) {
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
117
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
118 log.debug("WDifferencesState obtain data from StaticWQKms");
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
119
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
120 final WQKms wkms = staticWKms.getWQKms(from, to);
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
121
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
122 if (wkms != null) {
8962
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
123 final int year = fetchStaticWKmsYear(staticWKms);
9362
392745cccede Fixed: waterlevels from database should not get the "Bezugspegel" column in the result output.
gernotbelger
parents: 8964
diff changeset
124 return new WaterlevelData(wkms, year, false, false);
8883
a536e1aacf0f Further work on SINFO-FlowDepth
gernotbelger
parents: 8881
diff changeset
125 }
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
126
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
127 log.error("No WKms from Static artifact for this range.");
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
128 return null;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
129 }
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
130
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
131 private WaterlevelData fetchWINFOArtifactWaterlevel(final CallContext context, final WINFOArtifact flys, final int idx, final double from,
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
132 final double to) {
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
133 log.debug("Get WKms from WINFOArtifact");
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
134
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
135 final WKms[] wkms = (WKms[]) flys.getWaterlevelData(context).getData();
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
136
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
137 if (wkms == null || wkms.length == 0) {
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
138 log.warn("no waterlevels in artifact");
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
139 return null;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
140 }
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
141
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
142 if (wkms.length < idx + 1) {
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
143 log.warn("Not enough waterlevels in artifact.");
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
144 return null;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
145 }
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
146
8883
a536e1aacf0f Further work on SINFO-FlowDepth
gernotbelger
parents: 8881
diff changeset
147 // REAMRK: W_INFO results does not know any 'year'
a536e1aacf0f Further work on SINFO-FlowDepth
gernotbelger
parents: 8881
diff changeset
148 final int year = -1;
9362
392745cccede Fixed: waterlevels from database should not get the "Bezugspegel" column in the result output.
gernotbelger
parents: 8964
diff changeset
149 return new WaterlevelData(wkms[idx], year, false, true).filterByRange(from, to);
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
150 }
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
151
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
152 private WaterlevelData fetchFixationArtifactWaterlevel(final CallContext context, final FixationArtifact fixation, final int idx, final double from,
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8962
diff changeset
153 final double to) {
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
154
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
155 log.debug("Get WKms from FixationArtifact.");
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
156
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
157 final CalculationResult r = (CalculationResult) fixation.compute(context, ComputeType.ADVANCE, false);
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
158 final FixRealizingResult frR = (FixRealizingResult) r.getData();
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
159
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
160 // Get W/Q input per gauge for this case.
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
161 final FixRealizingAccess fixAccess = new FixRealizingAccess(fixation);
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
162 final List<Segment> segments = fixAccess.getSegments();
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
163 final boolean isFixRealize = (segments != null && !segments.isEmpty());
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
164
8883
a536e1aacf0f Further work on SINFO-FlowDepth
gernotbelger
parents: 8881
diff changeset
165 /* ugly but necessary to keep this logic at least a bit inside the FixRealizing stuff */
a536e1aacf0f Further work on SINFO-FlowDepth
gernotbelger
parents: 8881
diff changeset
166 final FixRealizingCalculationExtended calculation = new FixRealizingCalculationExtended(fixAccess);
a536e1aacf0f Further work on SINFO-FlowDepth
gernotbelger
parents: 8881
diff changeset
167 final int year = calculation.determineMeanYear();
a536e1aacf0f Further work on SINFO-FlowDepth
gernotbelger
parents: 8881
diff changeset
168
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
169 // REMARK: same logic as in WaterlevelExporter
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
170 final boolean showAllGauges = isFixRealize;
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
171
9362
392745cccede Fixed: waterlevels from database should not get the "Bezugspegel" column in the result output.
gernotbelger
parents: 8964
diff changeset
172 return new WaterlevelData(frR.getWQKms()[idx], year, showAllGauges, true).filterByRange(from, to);
8881
6b93a2498e06 Slightly better abstraction for extraction waterlevels via datacage
gernotbelger
parents:
diff changeset
173 }
8962
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
174
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
175 /**
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
176 * Fetches the 'year' for a staticXXX-artifact.
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
177 * REMARK: actually this should happen inside the staticWKms artifact and eventually in the WKmsFactory, but the code
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
178 * there is already awful and it will also break the old artifact-serialization...
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
179 */
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
180 private int fetchStaticWKmsYear(final D4EArtifact staticWKms) {
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
181
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
182 final int colPos = Integer.parseInt(staticWKms.getDataAsString("col_pos"));
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
183 final int wstId = Integer.parseInt(staticWKms.getDataAsString("wst_id"));
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
184
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
185 final WstColumn wstColumn = WstColumnFactory.getWstColumn(wstId, colPos);
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
186 final TimeInterval timeInterval = wstColumn.getTimeInterval();
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
187 if (timeInterval == null)
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
188 return -1;
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
189
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
190 final Date startTime = timeInterval.getStartTime();
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
191 if (startTime == null)
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
192 return -1;
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
193
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
194 // REMARK: the times are stored without timezone in the DB, so it is unclear what hibernate makes of it.
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
195 // We simply use the default timezone here and hope we never get problems...
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
196 // Actually we always have 12:00 as time in the db data, so a smal timeshift due to winter/sommertime or UTC/GMT+1 will
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
197 // no change anything regarding the year.
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
198 final Calendar cal = Calendar.getInstance();
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
199 cal.setTime(startTime);
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
200 return cal.get(Calendar.YEAR);
708f210ff242 Fetching year informations for waterlevels used in sinfo
gernotbelger
parents: 8947
diff changeset
201 }
8883
a536e1aacf0f Further work on SINFO-FlowDepth
gernotbelger
parents: 8881
diff changeset
202 }

http://dive4elements.wald.intevation.org