ingo@1077: package de.intevation.gnv.statistics;
ingo@1077: 
ingo@1077: import de.intevation.gnv.geobackend.base.Result;
ingo@1077: import de.intevation.gnv.geobackend.base.ResultDescriptor;
ingo@1077: 
ingo@1077: import de.intevation.gnv.state.describedata.KeyValueDescibeData;
ingo@1077: 
ingo@1077: import de.intevation.gnv.statistics.exception.StatisticsException;
ingo@1077: 
ingo@1077: import java.sql.SQLException;
ingo@1077: 
ingo@1077: import java.util.ArrayList;
ingo@1077: import java.util.Collection;
ingo@1077: import java.util.Iterator;
ingo@1077: 
ingo@1077: import org.apache.commons.math.stat.descriptive.DescriptiveStatistics;
ingo@1077: 
ingo@1077: import org.apache.commons.math.stat.regression.SimpleRegression;
ingo@1077: 
ingo@1077: import org.apache.log4j.Logger;
ingo@1077: 
ingo@1077: 
ingo@1077: /**
ingo@1077:  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
ingo@1077:  */
ingo@1077: public abstract class VectorStatistics
ingo@1077: extends      AbstractStatistics
ingo@1077: {
ingo@1077:     private static Logger logger =
ingo@1077:         Logger.getLogger(VectorStatistics.class);
ingo@1077: 
ingo@1077:     private ResultDescriptor rd;
ingo@1077: 
ingo@1077: 
ingo@1077:     public VectorStatistics() {
ingo@1077:     }
ingo@1077: 
ingo@1077: 
ingo@1077:     public Collection<StatisticSet> calculateStatistics(
ingo@1077:         Object                          result,
ingo@1077:         Collection<KeyValueDescibeData> parameters,
ingo@1077:         Collection<KeyValueDescibeData> measurements,
ingo@1077:         Collection<KeyValueDescibeData> dates
ingo@1077:     ) throws StatisticsException {
ingo@1077:         if (!(result instanceof Collection))
ingo@1077:             return new ArrayList<StatisticSet>();
ingo@1077: 
ingo@1077:         Collection<Result>     results = (Collection<Result>) result;
ingo@1077:         Collection<StatisticSet> stats = new ArrayList<StatisticSet>();
ingo@1077: 
ingo@1077:         SimpleRegression lRegression      = new SimpleRegression();
ingo@1077:         DescriptiveStatistics lStatistics = new DescriptiveStatistics();
ingo@1077: 
ingo@1077:         Result previous   = null;
ingo@1077:         Result row        = null;
ingo@1077:         String seriesName = null;
ingo@1077:         int valueIdx      = -1;
ingo@1077:         int seriesIdx     = -1;
ingo@1077: 
ingo@1077:         Iterator<Result> iter = results.iterator();
ingo@1077: 
ingo@1077:         while (iter.hasNext()) {
ingo@1077:             row      = iter.next();
ingo@1077:             previous = previous == null ? row : previous;
ingo@1077: 
ingo@1077:             if (rd == null || seriesIdx == -1) {
ingo@1077:                 rd        = row.getResultDescriptor();
ingo@1077:                 valueIdx  = getValueIdx(rd);
ingo@1077:                 seriesIdx = rd.getColumnIndex("SERIES");
ingo@1077:             }
ingo@1077: 
ingo@1077:             if (seriesName != null
ingo@1077:             && !row.getString(seriesIdx).equals(seriesName))
ingo@1077:             {
ingo@1077:                 stats.add(generateStatisticsValues(
ingo@1077:                     lStatistics, lRegression, seriesName));
ingo@1077: 
ingo@1077:                 lStatistics.clear();
ingo@1077:                 lRegression.clear();
ingo@1078: 
ingo@1078:                 clear();
ingo@1077:             }
ingo@1077: 
ingo@1077:             Double yValue = getValue(row, valueIdx);
ingo@1077: 
ingo@1077:             if (yValue != null) {
ingo@1077:                 lStatistics.addValue(yValue);
ingo@1077: 
ingo@1077:                 try {
ingo@1077:                     double x = calculateXOrdinateValue(previous, row);
ingo@1077:                     lRegression.addData(x, yValue);
ingo@1077:                 }
ingo@1077:                 catch (SQLException sqle) {
ingo@1077:                     logger.warn(sqle, sqle);
ingo@1077:                 }
ingo@1077:             }
ingo@1077: 
ingo@1077:             seriesName = row.getString(seriesIdx);
ingo@1077:             previous   = row;
ingo@1077:         }
ingo@1077: 
ingo@1077:         if (seriesName != null && row != null) {
ingo@1077:             stats.add(generateStatisticsValues(
ingo@1077:                 lStatistics, lRegression, seriesName));
ingo@1077: 
ingo@1077:             lStatistics.clear();
ingo@1077:             lRegression.clear();
ingo@1077:         }
ingo@1077: 
ingo@1077:         return stats;
ingo@1077:     }
ingo@1077: 
ingo@1077: 
ingo@1077:     protected Double getValue(Result row, int idx) {
ingo@1077:         return row.getDouble(idx);
ingo@1077:     }
ingo@1077: 
ingo@1077: 
ingo@1078:     abstract protected void clear();
ingo@1078: 
ingo@1077:     abstract protected int getValueIdx(ResultDescriptor rd);
ingo@1077: 
ingo@1077:     abstract protected double calculateXOrdinateValue(Result prev, Result now)
ingo@1077:     throws SQLException;
ingo@1077: }
ingo@1077: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :