mschaefer@9117: /* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde mschaefer@9117: * Software engineering by mschaefer@9117: * Björnsen Beratende Ingenieure GmbH mschaefer@9117: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt mschaefer@9117: * mschaefer@9117: * This file is Free Software under the GNU AGPL (>=v3) mschaefer@9117: * and comes with ABSOLUTELY NO WARRANTY! Check out the mschaefer@9117: * documentation coming with Dive4Elements River for details. mschaefer@9117: */ mschaefer@9117: mschaefer@9117: package org.dive4elements.river.model.sinfo; mschaefer@9117: mschaefer@9117: import java.io.Serializable; mschaefer@9117: import java.util.ArrayList; mschaefer@9117: import java.util.Date; mschaefer@9117: import java.util.List; mschaefer@9117: mschaefer@9117: import org.dive4elements.river.backend.SessionHolder; mschaefer@9117: import org.hibernate.SQLQuery; mschaefer@9117: import org.hibernate.Session; mschaefer@9117: import org.hibernate.type.StandardBasicTypes; mschaefer@9117: mschaefer@9117: mschaefer@9117: /** mschaefer@9117: * Aggregation of collision_values mschaefer@9117: * mschaefer@9117: * @author Matthias Schäfer mschaefer@9117: * mschaefer@9117: */ mschaefer@9117: public class CollisionAggregateValue implements Serializable { mschaefer@9117: mschaefer@9117: /***** FIELDS *****/ mschaefer@9117: mschaefer@9117: private static final long serialVersionUID = 1; mschaefer@9117: mschaefer@9117: private Collision parent; mschaefer@9117: mschaefer@9117: private double station; mschaefer@9117: mschaefer@9117: // private CollisionType collisionType; mschaefer@9117: mschaefer@9117: private Date minDate; mschaefer@9117: mschaefer@9117: private Date maxDate; mschaefer@9117: mschaefer@9117: private int count; mschaefer@9117: mschaefer@9117: private double gaugeW; mschaefer@9117: mschaefer@9117: mschaefer@9117: /***** CONSTRUCTORS *****/ mschaefer@9117: mschaefer@9117: public CollisionAggregateValue() { mschaefer@9117: } mschaefer@9117: mschaefer@9117: public CollisionAggregateValue(final Collision collision, final double station, final Date minDate, final Date maxDate, final int count, mschaefer@9117: final double gaugeW) { mschaefer@9117: this.parent = collision; mschaefer@9117: this.station = station; mschaefer@9117: // this.collisionType = collisionType; mschaefer@9117: this.minDate = minDate; mschaefer@9117: this.maxDate = maxDate; mschaefer@9117: this.count = count; mschaefer@9117: this.gaugeW = gaugeW; mschaefer@9117: } mschaefer@9117: mschaefer@9117: mschaefer@9117: /***** METHODS *****/ mschaefer@9117: mschaefer@9117: public int getCount() { mschaefer@9117: return this.count; mschaefer@9117: } mschaefer@9117: mschaefer@9117: public Collision getCollision() { mschaefer@9117: return this.parent; mschaefer@9117: } mschaefer@9117: mschaefer@9117: public double getStation() { mschaefer@9117: return this.station; mschaefer@9117: } mschaefer@9117: mschaefer@9117: // public CollisionType getCollisionType() { mschaefer@9117: // return this.collisionType; mschaefer@9117: // } mschaefer@9117: mschaefer@9117: public Date getMinDate() { mschaefer@9117: return this.minDate; mschaefer@9117: } mschaefer@9117: mschaefer@9117: public Date getMaxDate() { mschaefer@9117: return this.maxDate; mschaefer@9117: } mschaefer@9117: mschaefer@9117: public Double getGaugeW() { mschaefer@9117: return this.gaugeW; mschaefer@9117: } mschaefer@9117: mschaefer@9117: /** mschaefer@9117: * Selects the collision aggregate values of a data series in a km range from the database mschaefer@9117: */ mschaefer@9117: public static List getValuesByKm(final Collision parent, final double kmLo, final double kmHi) { mschaefer@9117: final Session session = SessionHolder.HOLDER.get(); mschaefer@9117: final SQLQuery query = session.createSQLQuery("SELECT FLOOR(station+0.4999) AS station, COUNT(*) AS count," mschaefer@9117: + " MIN(event_date) AS date_min, MAX(event_date) AS date_max," mschaefer@9117: + " AVG(gauge_w) AS gauge_w" mschaefer@9117: + " FROM collision_values v INNER JOIN collision s ON v.collision_id=s.id" mschaefer@9117: + " WHERE (collision_id=:parent)" mschaefer@9117: + " AND (station BETWEEN (:kmLo - 0.0001) AND (:kmHi + 0.0001))" mschaefer@9117: + " GROUP BY FLOOR(station+0.4999);").addScalar("station", StandardBasicTypes.DOUBLE) mschaefer@9117: .addScalar("count", StandardBasicTypes.INTEGER).addScalar("date_min", StandardBasicTypes.DATE) mschaefer@9117: .addScalar("date_max", StandardBasicTypes.DATE).addScalar("gauge_w", StandardBasicTypes.DOUBLE); mschaefer@9117: query.setInteger("parent", parent.getId()); mschaefer@9117: query.setDouble("kmLo", new Double(kmLo)); mschaefer@9117: query.setDouble("kmHi", new Double(kmHi)); mschaefer@9117: final List values = new ArrayList(); mschaefer@9117: final List rows = query.list(); mschaefer@9117: if (rows != null) { mschaefer@9117: for (int i = 0; i <= rows.size() - 1; i++) { mschaefer@9117: values.add(new CollisionAggregateValue(parent, (double) rows.get(i)[0], (Date) rows.get(i)[2], (Date) rows.get(i)[3], mschaefer@9117: (int) rows.get(i)[1], (double) rows.get(i)[4])); mschaefer@9117: } mschaefer@9117: } mschaefer@9117: return values; mschaefer@9117: } mschaefer@9117: }