[PATCH] SQ Relation: Added CSV dumping to raw SedDB query results
Wald Commits
scm-commit at wald.intevation.org
Mon Dec 16 16:39:16 CET 2013
# HG changeset patch
# User Sascha L. Teichmann <teichmann at intevation.de>
# Date 1387208352 -3600
# Node ID 7efeaa2058e1f9d1bc48523fd237052497a74fc4
# Parent 640342d9ab8a1ee130558ba156c1a760db24a497
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.
diff -r 640342d9ab8a -r 7efeaa2058e1 artifacts/src/main/java/org/dive4elements/river/artifacts/model/sq/MeasurementFactory.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/sq/MeasurementFactory.java Mon Dec 16 16:24:07 2013 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/sq/MeasurementFactory.java Mon Dec 16 16:39:12 2013 +0100
@@ -8,6 +8,9 @@
package org.dive4elements.river.artifacts.model.sq;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
@@ -30,11 +33,15 @@
import org.dive4elements.river.backend.SedDBSessionHolder;
+import au.com.bytecode.opencsv.CSVWriter;
+
public class MeasurementFactory
{
private static final Logger log =
Logger.getLogger(MeasurementFactory.class);
+ public static final String MINFO_DUMP_SQ_SEDDB_PREFIX = "minfo.dump.sq.seddb.prefix";
+
public static final String SQL_TOTALS =
"SELECT " +
"m.Q_BPEGEL AS Q_BPEGEL,"+
@@ -113,78 +120,132 @@
"ORDER BY " +
"m.DATUM, g.UFERABST, g.GLOTRECHTEID, gp.LFDNR";
- public static final BasicTransformerAdapter TOTALS_TRANSFORMER =
- new BasicTransformerAdapter() {
- private static final long serialVersionUID = 1L;
-
- @Override
- public Object transformTuple(Object [] tuple, String [] aliases) {
- Map<String, Object> map = new HashMap<String, Object>();
- for (int i = 0; i < tuple.length; ++i) {
- Object value = tuple[i];
- if (value != null) {
- map.put(aliases[i], value);
- }
- }
- return new Measurement(map, Collections.<Sieve>emptyList());
- }
- };
-
private static final int index(String s) {
return Integer.parseInt(s.substring(s.length()-2))-1;
}
- public static final BasicTransformerAdapter FRACTIONS_TRANSFORMER =
- new BasicTransformerAdapter() {
- private static final long serialVersionUID = 1L;
+ public abstract static class CSVTransformer extends BasicTransformerAdapter {
+ private static final long serialVersionUID = 1L;
- @Override
- public Object transformTuple(Object [] tuple, String [] aliases) {
- Map<String, Object> map = new HashMap<String, Object>();
+ private CSVWriter rawWriter;
+ private boolean metaDataWritten;
- Sieve [] sieves = new Sieve[21];
+ public CSVTransformer() {
+ this(null);
+ }
- List<Sieve> validSieves = new ArrayList<Sieve>(21);
+ public CSVTransformer(CSVWriter rawWriter) {
+ this.rawWriter = rawWriter;
+ }
- for (int i = 0; i < tuple.length; ++i) {
- Object value = tuple[i];
- if (value == null) {
- continue;
+ protected void writeRaw(Object [] tuple, String [] aliases) {
+ if (rawWriter == null) {
+ return;
+ }
+
+ if (!metaDataWritten) {
+ rawWriter.writeNext(aliases);
+ metaDataWritten = true;
+ }
+
+ String [] nextLine = new String[tuple.length];
+ for (int i = 0; i < tuple.length; ++i) {
+ nextLine[i] = tuple[i] != null ? tuple[i].toString() : "";
+ }
+ rawWriter.writeNext(nextLine);
+ }
+ }
+
+ public static class FractionsTransformer extends CSVTransformer {
+
+ private static final long serialVersionUID = 1L;
+
+ public FractionsTransformer() {
+ this(null);
+ }
+
+ public FractionsTransformer(CSVWriter rawWriter) {
+ super(rawWriter);
+ }
+
+ @Override
+ public Object transformTuple(Object [] tuple, String [] aliases) {
+
+ writeRaw(tuple, aliases);
+
+ Map<String, Object> map = new HashMap<String, Object>();
+
+ Sieve [] sieves = new Sieve[21];
+
+ List<Sieve> validSieves = new ArrayList<Sieve>(21);
+
+ for (int i = 0; i < tuple.length; ++i) {
+ Object value = tuple[i];
+ if (value == null) {
+ continue;
+ }
+ String alias = aliases[i];
+ if (alias.startsWith("SIEB")
+ || alias.startsWith("RSIEB")) {
+ int idx = index(alias);
+ Sieve s = sieves[idx];
+ double v = (Double)value;
+ if (s == null) {
+ s = new Sieve();
+ sieves[idx] = s;
}
- String alias = aliases[i];
- if (alias.startsWith("SIEB")
- || alias.startsWith("RSIEB")) {
- int idx = index(alias);
- Sieve s = sieves[idx];
- double v = (Double)value;
- if (s == null) {
- s = new Sieve();
- sieves[idx] = s;
- }
- if (alias.startsWith("SIEB")) {
- s.setDiameter(v);
- }
- else {
- s.setLoad(v);
- }
- }
- else if (alias.equals("REST")) {
- Sieve s = new Sieve(0d, (Double)value);
- validSieves.add(s);
+ if (alias.startsWith("SIEB")) {
+ s.setDiameter(v);
}
else {
- map.put(alias, value);
- }
-
- }
- for (Sieve s: sieves) {
- if (s != null) {
- validSieves.add(s);
+ s.setLoad(v);
}
}
- return new Measurement(map, validSieves);
+ else if (alias.equals("REST")) {
+ Sieve s = new Sieve(0d, (Double)value);
+ validSieves.add(s);
+ }
+ else {
+ map.put(alias, value);
+ }
+
}
- };
+ for (Sieve s: sieves) {
+ if (s != null) {
+ validSieves.add(s);
+ }
+ }
+ return new Measurement(map, validSieves);
+ }
+ } // class FractionsTransformer
+
+ public static class TotalsTransformer extends CSVTransformer {
+
+ private static final long serialVersionUID = 1L;
+
+ public TotalsTransformer() {
+ this(null);
+ }
+
+ public TotalsTransformer(CSVWriter rawWriter) {
+ super(rawWriter);
+ }
+
+ @Override
+ public Object transformTuple(Object [] tuple, String [] aliases) {
+
+ writeRaw(tuple, aliases);
+
+ Map<String, Object> map = new HashMap<String, Object>();
+ for (int i = 0; i < tuple.length; ++i) {
+ Object value = tuple[i];
+ if (value != null) {
+ map.put(aliases[i], value);
+ }
+ }
+ return new Measurement(map, Collections.<Sieve>emptyList());
+ }
+ } // class TotalsTransformer
private MeasurementFactory() {
}
@@ -210,6 +271,7 @@
}
}
+ @SuppressWarnings("unchecked")
protected static List<Measurement> loadTotals(
Session session,
String river,
@@ -226,13 +288,69 @@
query.setDate("from", dateRange.getFrom());
query.setDate("to", dateRange.getTo());
- query.setResultTransformer(TOTALS_TRANSFORMER);
+ CSVWriter csvWriter =
+ getCVSWriter("totals", river, location, dateRange);
- @SuppressWarnings("unchecked")
- List<Measurement> result = (List<Measurement>)query.list();
- return result;
+ try {
+ TotalsTransformer totalTransformer = new TotalsTransformer(csvWriter);
+ query.setResultTransformer(totalTransformer);
+
+ return (List<Measurement>)query.list();
+ }
+ finally {
+ closeGraceful(csvWriter);
+ }
}
+ private static CSVWriter getCVSWriter(
+ String type,
+ String river,
+ double location,
+ DateRange dateRange
+ ) {
+ String dumpPrefix = System.getProperty(MINFO_DUMP_SQ_SEDDB_PREFIX);
+ if (dumpPrefix == null) {
+ return null;
+ }
+
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-ddd");
+ StringBuilder sb = new StringBuilder(dumpPrefix);
+ Date from = dateRange.getFrom();
+ Date to = dateRange.getTo();
+
+ sb.append(type)
+ .append('-').append(df.format(new Date()))
+ .append('-').append(river)
+ .append('-').append(location)
+ .append('-').append(from != null ? df.format(from) : "")
+ .append('-').append(to != null ? df.format(to) : "")
+ .append(".csv");
+
+ String fileName = sb.toString();
+
+ try {
+ return new CSVWriter(new FileWriter(fileName), ';');
+ }
+ catch (IOException ioe) {
+ log.error("Cannot open '" + fileName + "' for writing.", ioe);
+ }
+
+ return null;
+ }
+
+ private static void closeGraceful(CSVWriter writer) {
+ if (writer != null) {
+ try {
+ writer.flush();
+ writer.close();
+ }
+ catch (IOException ioe) {
+ log.error(ioe);
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
protected static List<Measurement> loadFractions(
Session session,
String river,
@@ -301,10 +419,22 @@
query.setDate("from", dateRange.getFrom());
query.setDate("to", dateRange.getTo());
- query.setResultTransformer(FRACTIONS_TRANSFORMER);
+ List<Measurement> measuments;
- @SuppressWarnings("unchecked")
- List<Measurement> measuments = (List<Measurement>)query.list();
+ CSVWriter csvWriter =
+ getCVSWriter("fractions", river, location, dateRange);
+
+ try {
+ FractionsTransformer fractionsTransformer =
+ new FractionsTransformer(csvWriter);
+
+ query.setResultTransformer(fractionsTransformer);
+
+ measuments = (List<Measurement>)query.list();
+ }
+ finally {
+ closeGraceful(csvWriter);
+ }
if (debug) {
log.debug("num fraction results: " + measuments.size());
More information about the Dive4elements-commits
mailing list