view flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/QualityMeasurementFactory.java @ 3755:9c555ce5ca50

Data objects and factory for minfo bedquality calculation. flys-artifacts/trunk@5450 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Raimund Renkert <raimund.renkert@intevation.de>
date Thu, 13 Sep 2012 10:34:51 +0000
parents
children 912a398968b6
line wrap: on
line source
package de.intevation.flys.artifacts.model.minfo;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.transform.BasicTransformerAdapter;
import org.hibernate.type.StandardBasicTypes;

import de.intevation.flys.backend.SedDBSessionHolder;

public class QualityMeasurementFactory {

    private static final String SQL_MEASUREMENT = 
        "SELECT st.km    as km," +
        "       st.datum as date,"+
        "       sa.d10   as d10," +
        "       sa.d16   as d16," +
        "       sa.d20   as d20," +
        "       sa.d25   as d25," +
        "       sa.d30   as d30," +
        "       sa.d40   as d40," +
        "       sa.d50   as d50," +
        "       sa.d60   as d60," +
        "       sa.d70   as d70," +
        "       sa.d75   as d75," +
        "       sa.d80   as d80," +
        "       sa.d84   as d84," +
        "       sa.d90   as d90," +
        "       sa.dmin  as dmin," +
        "       sa.dmax  as dmax " +
        "FROM sohltest st" +
        "    JOIN station sn ON sn.stationid = st.stationid" +
        "    JOIN gewaesser gw ON gw.gewaesserid = sn.gewaesserid" +
        "    JOIN sohlprobe sp ON sp.sohltestid = st.sohltestid" +
        "    JOIN siebanalyse sa ON sa.sohlprobeid = sp.sohlprobeid" +
        "WHERE gw.name = :name AND " +
        "      st.km IS NOT NULL AND " +
        "      st.km BETWEEN :from - 0.001 AND :to + 0.001 AND" +
        "      st.datum BETWEEN :start AND :end";

    public static final class QualityMeasurementResultTransformer
    extends                   BasicTransformerAdapter
    {
        public static QualityMeasurementResultTransformer INSTANCE =
            new QualityMeasurementResultTransformer();

        public QualityMeasurementResultTransformer() {
        }

        @Override
        public Object transformTuple(Object [] tuple, String [] aliases) {
            Map<String, Double> map = new HashMap<String, Double>();
            double km = 0;
            Date d = null;
            for (int i = 0; i < tuple.length; ++i) {
                if (tuple[i] != null) {
                    if (aliases[i].equals("km")) {
                        km = ((Number)tuple[i]).doubleValue();
                    }
                    else if (aliases[i].equals("date")) {
                        d = (Date)tuple[i];
                    }
                    else {
                        map.put(aliases[i], (Double)tuple[i]);
                    }
                }
            }
            return new QualityMeasurement(km, d, map);
        }
    } // class BasicTransformerAdapter

    private QualityMeasurementFactory() {
    }

    protected static QualityMeasurements load(
        Session session,
        String river,
        double from,
        double to,
        Date start,
        Date end
    ) {
        SQLQuery query = session.createSQLQuery(SQL_MEASUREMENT)
            .addScalar("km",    StandardBasicTypes.DOUBLE)
            .addScalar("date",  StandardBasicTypes.DATE)
            .addScalar("d10",  StandardBasicTypes.DOUBLE)
            .addScalar("d16",  StandardBasicTypes.DOUBLE)
            .addScalar("d20",  StandardBasicTypes.DOUBLE)
            .addScalar("d25",  StandardBasicTypes.DOUBLE)
            .addScalar("d30",  StandardBasicTypes.DOUBLE)
            .addScalar("d40",  StandardBasicTypes.DOUBLE)
            .addScalar("d50",  StandardBasicTypes.DOUBLE)
            .addScalar("d60",  StandardBasicTypes.DOUBLE)
            .addScalar("d70",  StandardBasicTypes.DOUBLE)
            .addScalar("d75",  StandardBasicTypes.DOUBLE)
            .addScalar("d80",  StandardBasicTypes.DOUBLE)
            .addScalar("d84",  StandardBasicTypes.DOUBLE)
            .addScalar("d90",  StandardBasicTypes.DOUBLE)
            .addScalar("dmin",  StandardBasicTypes.DOUBLE)
            .addScalar("dmax",  StandardBasicTypes.DOUBLE);

        query.setString("name", river);
        query.setDouble("from", from);
        query.setDouble("to", to); 
        query.setDate("start", start);
        query.setDate("end", end);

        query.setResultTransformer(
            QualityMeasurementResultTransformer.INSTANCE);

        return new QualityMeasurements(query.list());
    }

    public static QualityMeasurements getMeasurements(
        String river,
        double from,
        double to,
        Date start,
        Date end
    ) {
        Session session = SedDBSessionHolder.HOLDER.get();
        try {
            return load(session, river, from, to, start, end);
        }
        finally {
            session.close();
        }
    }
}

http://dive4elements.wald.intevation.org