Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/artifacts/model/sq/MeasurementFactory.java @ 7698:7efeaa2058e1
SQ Relation: Added CSV dumping to raw SedDB query results.
If system property 'minfo.dump.sq.seddb.prefix' is set
files are generate from this to contain the results of the
raw SQL queries.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Mon, 16 Dec 2013 16:39:12 +0100 |
parents | 90a3bcd8060a |
children | a877d2680a4a |
comparison
equal
deleted
inserted
replaced
7697:640342d9ab8a | 7698:7efeaa2058e1 |
---|---|
6 * documentation coming with Dive4Elements River for details. | 6 * documentation coming with Dive4Elements River for details. |
7 */ | 7 */ |
8 | 8 |
9 package org.dive4elements.river.artifacts.model.sq; | 9 package org.dive4elements.river.artifacts.model.sq; |
10 | 10 |
11 import java.io.FileWriter; | |
12 import java.io.IOException; | |
13 import java.text.SimpleDateFormat; | |
11 import java.util.ArrayList; | 14 import java.util.ArrayList; |
12 import java.util.Calendar; | 15 import java.util.Calendar; |
13 import java.util.Collections; | 16 import java.util.Collections; |
14 import java.util.Date; | 17 import java.util.Date; |
15 import java.util.HashMap; | 18 import java.util.HashMap; |
28 | 31 |
29 import org.dive4elements.river.artifacts.model.DateRange; | 32 import org.dive4elements.river.artifacts.model.DateRange; |
30 | 33 |
31 import org.dive4elements.river.backend.SedDBSessionHolder; | 34 import org.dive4elements.river.backend.SedDBSessionHolder; |
32 | 35 |
36 import au.com.bytecode.opencsv.CSVWriter; | |
37 | |
33 public class MeasurementFactory | 38 public class MeasurementFactory |
34 { | 39 { |
35 private static final Logger log = | 40 private static final Logger log = |
36 Logger.getLogger(MeasurementFactory.class); | 41 Logger.getLogger(MeasurementFactory.class); |
42 | |
43 public static final String MINFO_DUMP_SQ_SEDDB_PREFIX = "minfo.dump.sq.seddb.prefix"; | |
37 | 44 |
38 public static final String SQL_TOTALS = | 45 public static final String SQL_TOTALS = |
39 "SELECT " + | 46 "SELECT " + |
40 "m.Q_BPEGEL AS Q_BPEGEL,"+ | 47 "m.Q_BPEGEL AS Q_BPEGEL,"+ |
41 "m.TSCHWEB AS TSCHWEB," + | 48 "m.TSCHWEB AS TSCHWEB," + |
111 "COALESCE(gs.RSIEB19, 0) + COALESCE(gs.RSIEB20, 0) +" + | 118 "COALESCE(gs.RSIEB19, 0) + COALESCE(gs.RSIEB20, 0) +" + |
112 "COALESCE(gs.RSIEB21, 0) + COALESCE(gs.REST, 0)) >= 0 " + | 119 "COALESCE(gs.RSIEB21, 0) + COALESCE(gs.REST, 0)) >= 0 " + |
113 "ORDER BY " + | 120 "ORDER BY " + |
114 "m.DATUM, g.UFERABST, g.GLOTRECHTEID, gp.LFDNR"; | 121 "m.DATUM, g.UFERABST, g.GLOTRECHTEID, gp.LFDNR"; |
115 | 122 |
116 public static final BasicTransformerAdapter TOTALS_TRANSFORMER = | |
117 new BasicTransformerAdapter() { | |
118 private static final long serialVersionUID = 1L; | |
119 | |
120 @Override | |
121 public Object transformTuple(Object [] tuple, String [] aliases) { | |
122 Map<String, Object> map = new HashMap<String, Object>(); | |
123 for (int i = 0; i < tuple.length; ++i) { | |
124 Object value = tuple[i]; | |
125 if (value != null) { | |
126 map.put(aliases[i], value); | |
127 } | |
128 } | |
129 return new Measurement(map, Collections.<Sieve>emptyList()); | |
130 } | |
131 }; | |
132 | |
133 private static final int index(String s) { | 123 private static final int index(String s) { |
134 return Integer.parseInt(s.substring(s.length()-2))-1; | 124 return Integer.parseInt(s.substring(s.length()-2))-1; |
135 } | 125 } |
136 | 126 |
137 public static final BasicTransformerAdapter FRACTIONS_TRANSFORMER = | 127 public abstract static class CSVTransformer extends BasicTransformerAdapter { |
138 new BasicTransformerAdapter() { | 128 private static final long serialVersionUID = 1L; |
139 private static final long serialVersionUID = 1L; | 129 |
140 | 130 private CSVWriter rawWriter; |
141 @Override | 131 private boolean metaDataWritten; |
142 public Object transformTuple(Object [] tuple, String [] aliases) { | 132 |
143 Map<String, Object> map = new HashMap<String, Object>(); | 133 public CSVTransformer() { |
144 | 134 this(null); |
145 Sieve [] sieves = new Sieve[21]; | 135 } |
146 | 136 |
147 List<Sieve> validSieves = new ArrayList<Sieve>(21); | 137 public CSVTransformer(CSVWriter rawWriter) { |
148 | 138 this.rawWriter = rawWriter; |
149 for (int i = 0; i < tuple.length; ++i) { | 139 } |
150 Object value = tuple[i]; | 140 |
151 if (value == null) { | 141 protected void writeRaw(Object [] tuple, String [] aliases) { |
152 continue; | 142 if (rawWriter == null) { |
143 return; | |
144 } | |
145 | |
146 if (!metaDataWritten) { | |
147 rawWriter.writeNext(aliases); | |
148 metaDataWritten = true; | |
149 } | |
150 | |
151 String [] nextLine = new String[tuple.length]; | |
152 for (int i = 0; i < tuple.length; ++i) { | |
153 nextLine[i] = tuple[i] != null ? tuple[i].toString() : ""; | |
154 } | |
155 rawWriter.writeNext(nextLine); | |
156 } | |
157 } | |
158 | |
159 public static class FractionsTransformer extends CSVTransformer { | |
160 | |
161 private static final long serialVersionUID = 1L; | |
162 | |
163 public FractionsTransformer() { | |
164 this(null); | |
165 } | |
166 | |
167 public FractionsTransformer(CSVWriter rawWriter) { | |
168 super(rawWriter); | |
169 } | |
170 | |
171 @Override | |
172 public Object transformTuple(Object [] tuple, String [] aliases) { | |
173 | |
174 writeRaw(tuple, aliases); | |
175 | |
176 Map<String, Object> map = new HashMap<String, Object>(); | |
177 | |
178 Sieve [] sieves = new Sieve[21]; | |
179 | |
180 List<Sieve> validSieves = new ArrayList<Sieve>(21); | |
181 | |
182 for (int i = 0; i < tuple.length; ++i) { | |
183 Object value = tuple[i]; | |
184 if (value == null) { | |
185 continue; | |
186 } | |
187 String alias = aliases[i]; | |
188 if (alias.startsWith("SIEB") | |
189 || alias.startsWith("RSIEB")) { | |
190 int idx = index(alias); | |
191 Sieve s = sieves[idx]; | |
192 double v = (Double)value; | |
193 if (s == null) { | |
194 s = new Sieve(); | |
195 sieves[idx] = s; | |
153 } | 196 } |
154 String alias = aliases[i]; | 197 if (alias.startsWith("SIEB")) { |
155 if (alias.startsWith("SIEB") | 198 s.setDiameter(v); |
156 || alias.startsWith("RSIEB")) { | |
157 int idx = index(alias); | |
158 Sieve s = sieves[idx]; | |
159 double v = (Double)value; | |
160 if (s == null) { | |
161 s = new Sieve(); | |
162 sieves[idx] = s; | |
163 } | |
164 if (alias.startsWith("SIEB")) { | |
165 s.setDiameter(v); | |
166 } | |
167 else { | |
168 s.setLoad(v); | |
169 } | |
170 } | |
171 else if (alias.equals("REST")) { | |
172 Sieve s = new Sieve(0d, (Double)value); | |
173 validSieves.add(s); | |
174 } | 199 } |
175 else { | 200 else { |
176 map.put(alias, value); | 201 s.setLoad(v); |
177 } | 202 } |
178 | 203 } |
179 } | 204 else if (alias.equals("REST")) { |
180 for (Sieve s: sieves) { | 205 Sieve s = new Sieve(0d, (Double)value); |
181 if (s != null) { | 206 validSieves.add(s); |
182 validSieves.add(s); | 207 } |
183 } | 208 else { |
184 } | 209 map.put(alias, value); |
185 return new Measurement(map, validSieves); | 210 } |
186 } | 211 |
187 }; | 212 } |
213 for (Sieve s: sieves) { | |
214 if (s != null) { | |
215 validSieves.add(s); | |
216 } | |
217 } | |
218 return new Measurement(map, validSieves); | |
219 } | |
220 } // class FractionsTransformer | |
221 | |
222 public static class TotalsTransformer extends CSVTransformer { | |
223 | |
224 private static final long serialVersionUID = 1L; | |
225 | |
226 public TotalsTransformer() { | |
227 this(null); | |
228 } | |
229 | |
230 public TotalsTransformer(CSVWriter rawWriter) { | |
231 super(rawWriter); | |
232 } | |
233 | |
234 @Override | |
235 public Object transformTuple(Object [] tuple, String [] aliases) { | |
236 | |
237 writeRaw(tuple, aliases); | |
238 | |
239 Map<String, Object> map = new HashMap<String, Object>(); | |
240 for (int i = 0; i < tuple.length; ++i) { | |
241 Object value = tuple[i]; | |
242 if (value != null) { | |
243 map.put(aliases[i], value); | |
244 } | |
245 } | |
246 return new Measurement(map, Collections.<Sieve>emptyList()); | |
247 } | |
248 } // class TotalsTransformer | |
188 | 249 |
189 private MeasurementFactory() { | 250 private MeasurementFactory() { |
190 } | 251 } |
191 | 252 |
192 public static Measurements getMeasurements( | 253 public static Measurements getMeasurements( |
208 finally { | 269 finally { |
209 session.close(); | 270 session.close(); |
210 } | 271 } |
211 } | 272 } |
212 | 273 |
274 @SuppressWarnings("unchecked") | |
213 protected static List<Measurement> loadTotals( | 275 protected static List<Measurement> loadTotals( |
214 Session session, | 276 Session session, |
215 String river, | 277 String river, |
216 double location, | 278 double location, |
217 DateRange dateRange | 279 DateRange dateRange |
224 query.setString("river_name", river); | 286 query.setString("river_name", river); |
225 query.setDouble("location", location); | 287 query.setDouble("location", location); |
226 query.setDate("from", dateRange.getFrom()); | 288 query.setDate("from", dateRange.getFrom()); |
227 query.setDate("to", dateRange.getTo()); | 289 query.setDate("to", dateRange.getTo()); |
228 | 290 |
229 query.setResultTransformer(TOTALS_TRANSFORMER); | 291 CSVWriter csvWriter = |
230 | 292 getCVSWriter("totals", river, location, dateRange); |
231 @SuppressWarnings("unchecked") | 293 |
232 List<Measurement> result = (List<Measurement>)query.list(); | 294 try { |
233 return result; | 295 TotalsTransformer totalTransformer = new TotalsTransformer(csvWriter); |
234 } | 296 query.setResultTransformer(totalTransformer); |
235 | 297 |
298 return (List<Measurement>)query.list(); | |
299 } | |
300 finally { | |
301 closeGraceful(csvWriter); | |
302 } | |
303 } | |
304 | |
305 private static CSVWriter getCVSWriter( | |
306 String type, | |
307 String river, | |
308 double location, | |
309 DateRange dateRange | |
310 ) { | |
311 String dumpPrefix = System.getProperty(MINFO_DUMP_SQ_SEDDB_PREFIX); | |
312 if (dumpPrefix == null) { | |
313 return null; | |
314 } | |
315 | |
316 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-ddd"); | |
317 StringBuilder sb = new StringBuilder(dumpPrefix); | |
318 Date from = dateRange.getFrom(); | |
319 Date to = dateRange.getTo(); | |
320 | |
321 sb.append(type) | |
322 .append('-').append(df.format(new Date())) | |
323 .append('-').append(river) | |
324 .append('-').append(location) | |
325 .append('-').append(from != null ? df.format(from) : "") | |
326 .append('-').append(to != null ? df.format(to) : "") | |
327 .append(".csv"); | |
328 | |
329 String fileName = sb.toString(); | |
330 | |
331 try { | |
332 return new CSVWriter(new FileWriter(fileName), ';'); | |
333 } | |
334 catch (IOException ioe) { | |
335 log.error("Cannot open '" + fileName + "' for writing.", ioe); | |
336 } | |
337 | |
338 return null; | |
339 } | |
340 | |
341 private static void closeGraceful(CSVWriter writer) { | |
342 if (writer != null) { | |
343 try { | |
344 writer.flush(); | |
345 writer.close(); | |
346 } | |
347 catch (IOException ioe) { | |
348 log.error(ioe); | |
349 } | |
350 } | |
351 } | |
352 | |
353 @SuppressWarnings("unchecked") | |
236 protected static List<Measurement> loadFractions( | 354 protected static List<Measurement> loadFractions( |
237 Session session, | 355 Session session, |
238 String river, | 356 String river, |
239 double location, | 357 double location, |
240 DateRange dateRange | 358 DateRange dateRange |
299 query.setString("river_name", river); | 417 query.setString("river_name", river); |
300 query.setDouble("location", location); | 418 query.setDouble("location", location); |
301 query.setDate("from", dateRange.getFrom()); | 419 query.setDate("from", dateRange.getFrom()); |
302 query.setDate("to", dateRange.getTo()); | 420 query.setDate("to", dateRange.getTo()); |
303 | 421 |
304 query.setResultTransformer(FRACTIONS_TRANSFORMER); | 422 List<Measurement> measuments; |
305 | 423 |
306 @SuppressWarnings("unchecked") | 424 CSVWriter csvWriter = |
307 List<Measurement> measuments = (List<Measurement>)query.list(); | 425 getCVSWriter("fractions", river, location, dateRange); |
426 | |
427 try { | |
428 FractionsTransformer fractionsTransformer = | |
429 new FractionsTransformer(csvWriter); | |
430 | |
431 query.setResultTransformer(fractionsTransformer); | |
432 | |
433 measuments = (List<Measurement>)query.list(); | |
434 } | |
435 finally { | |
436 closeGraceful(csvWriter); | |
437 } | |
308 | 438 |
309 if (debug) { | 439 if (debug) { |
310 log.debug("num fraction results: " + measuments.size()); | 440 log.debug("num fraction results: " + measuments.size()); |
311 } | 441 } |
312 | 442 |