view artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/ColumnQRangeLoader.java @ 9646:0380717105ba

Implemented alternative fitting strategy for Log-Linear function.
author Gernot Belger <g.belger@bjoernsen.de>
date Mon, 02 Dec 2019 17:56:15 +0100
parents 9744ce3c3853
children
line wrap: on
line source
/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
 * Software engineering by
 *  Björnsen Beratende Ingenieure GmbH
 *  Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
 *
 * This file is Free Software under the GNU AGPL (>=v3)
 * and comes with ABSOLUTELY NO WARRANTY! Check out the
 * documentation coming with Dive4Elements River for details.
 */
package org.dive4elements.river.artifacts.model.fixings;

import java.util.ArrayList;
import java.util.List;

import org.dive4elements.river.utils.BatchLoader;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.type.StandardBasicTypes;

final class ColumnQRangeLoader extends BatchLoader<List<double[]>> {

    private static final String SQL_FIXING_COLUMN_Q_RANGES_BATCH = "SELECT " + "wcqr.wst_column_id AS wst_column_id," + "wqr.q              AS q,"
            + "r.a                AS start_km," + "r.b                AS stop_km " + "FROM wst_column_q_ranges wcqr "
            + "JOIN wst_q_ranges wqr ON wcqr.wst_q_range_id = wqr.id " + "JOIN ranges       r   ON wqr.range_id        = r.id " + "WHERE "
            + "wcqr.wst_column_id IN ($IDS) " + "ORDER BY wcqr.wst_column_id, r.a";

    public ColumnQRangeLoader(final List<Integer> columns, final Session session) {
        super(columns, session, SQL_FIXING_COLUMN_Q_RANGES_BATCH);
    }

    @Override
    protected void fill(final SQLQuery query) {
        query.addScalar("wst_column_id", StandardBasicTypes.INTEGER).addScalar("q", StandardBasicTypes.DOUBLE).addScalar("start_km", StandardBasicTypes.DOUBLE)
        .addScalar("stop_km", StandardBasicTypes.DOUBLE);

        int lastId = Integer.MIN_VALUE;
        List<double[]> column = new ArrayList<>();

        final List<Object[]> ranges = query.list();
        for (final Object[] r : ranges) {
            final int cid = (Integer) r[0];

            if (cid != lastId && !column.isEmpty()) {
                cache(lastId, column);
                column = new ArrayList<>();
            }
            column.add(new double[] { (Double) r[1], (Double) r[2], (Double) r[3] });

            lastId = cid;
        }

        if (!column.isEmpty()) {
            cache(lastId, column);
        }
    }
}

http://dive4elements.wald.intevation.org