mschaefer@8971: /* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde mschaefer@8971: * Software engineering by mschaefer@8971: * Björnsen Beratende Ingenieure GmbH mschaefer@8971: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt mschaefer@8971: * mschaefer@8971: * This file is Free Software under the GNU AGPL (>=v3) mschaefer@8971: * and comes with ABSOLUTELY NO WARRANTY! Check out the mschaefer@8971: * documentation coming with Dive4Elements River for details. mschaefer@8971: */ mschaefer@8971: mschaefer@8971: package org.dive4elements.river.model.sinfo; mschaefer@8971: mschaefer@8971: import java.io.Serializable; mschaefer@8971: import java.util.Date; mschaefer@9392: import java.util.List; mschaefer@8971: mschaefer@8971: import javax.persistence.Column; mschaefer@8971: import javax.persistence.Entity; mschaefer@8971: import javax.persistence.GeneratedValue; mschaefer@8971: import javax.persistence.GenerationType; mschaefer@8971: import javax.persistence.Id; mschaefer@8971: import javax.persistence.JoinColumn; mschaefer@8971: import javax.persistence.OneToOne; mschaefer@8971: import javax.persistence.SequenceGenerator; mschaefer@8971: import javax.persistence.Table; mschaefer@8971: mschaefer@9392: import org.dive4elements.river.backend.SessionHolder; mschaefer@9392: import org.dive4elements.river.model.Gauge; mschaefer@9392: import org.hibernate.Query; mschaefer@9392: import org.hibernate.Session; mschaefer@9392: mschaefer@8971: /** mschaefer@8971: * Hibernate binding for the DB table daily_discharge_values mschaefer@8971: * mschaefer@8971: * @author Matthias Schäfer mschaefer@8971: * mschaefer@8971: */ mschaefer@8971: @Entity mschaefer@8971: @Table(name = "daily_discharge_values") mschaefer@8971: public class DailyDischargeValue implements Serializable { mschaefer@8971: mschaefer@9392: /***** TYPES *****/ mschaefer@9392: mschaefer@9392: /** mschaefer@9392: * Field to use in a query's order-by clause mschaefer@9392: * mschaefer@9392: */ mschaefer@9392: public enum OrderByField { mschaefer@9392: DAY, DISCHARGE; mschaefer@9392: } mschaefer@9392: gernotbelger@9405: public enum MinMax { gernotbelger@9405: min, max gernotbelger@9405: } gernotbelger@9405: mschaefer@8971: /***** FIELDS *****/ mschaefer@8971: mschaefer@8971: private static final long serialVersionUID = -6192738825193230784L; mschaefer@8971: mschaefer@8971: private Integer id; mschaefer@8971: mschaefer@8971: private DailyDischarge dailyDischarge; mschaefer@8971: mschaefer@8971: private Date day; mschaefer@8971: mschaefer@8971: private Double discharge; mschaefer@8971: mschaefer@8971: /***** CONSTRUCTORS *****/ mschaefer@8971: mschaefer@8971: public DailyDischargeValue() { mschaefer@8971: } mschaefer@8971: mschaefer@8971: public DailyDischargeValue(final DailyDischarge dailyDischarge, final Date day, final Double discharge) { mschaefer@8971: this.dailyDischarge = dailyDischarge; mschaefer@8971: this.day = day; mschaefer@8971: this.discharge = discharge; mschaefer@8971: } mschaefer@8971: mschaefer@8971: /** mschaefer@8971: * Parameter constructor with primitive parameter types mschaefer@8971: */ mschaefer@8971: public DailyDischargeValue(final DailyDischarge dailyDischarge, final Date day, final double discharge) { mschaefer@8971: this(dailyDischarge, day, Double.valueOf(discharge)); mschaefer@8971: } mschaefer@8971: mschaefer@8971: /***** METHODS *****/ mschaefer@8971: mschaefer@8971: @Id mschaefer@8971: @SequenceGenerator(name = "SEQUENCE_DAILY_DISCHARGE_VALUE_ID_SEQ", sequenceName = "DAILY_DISCHARGE_VALUES_ID_SEQ", allocationSize = 1) mschaefer@8971: @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQUENCE_DAILY_DISCHARGE_VALUE_ID_SEQ") mschaefer@8971: @Column(name = "id") mschaefer@8971: public Integer getId() { mschaefer@8971: return this.id; mschaefer@8971: } mschaefer@8971: mschaefer@8971: public void setId(final Integer id) { mschaefer@8971: this.id = id; mschaefer@8971: } mschaefer@8971: mschaefer@8971: @OneToOne mschaefer@8971: @JoinColumn(name = "daily_discharge_id") mschaefer@8971: public DailyDischarge getDailyDischarge() { mschaefer@8971: return this.dailyDischarge; mschaefer@8971: } mschaefer@8971: mschaefer@8971: public void setDailyDischarge(final DailyDischarge dailyDischarge) { mschaefer@8971: this.dailyDischarge = dailyDischarge; mschaefer@8971: } mschaefer@8971: mschaefer@8971: @Column(name = "discharge") mschaefer@8971: public Double getDischarge() { mschaefer@8971: return this.discharge; mschaefer@8971: } mschaefer@8971: mschaefer@8971: public void setDischarge(final Double discharge) { mschaefer@8971: this.discharge = discharge; mschaefer@8971: } mschaefer@8971: mschaefer@8971: @Column(name = "day") mschaefer@8971: public Date getDay() { mschaefer@8971: return this.day; mschaefer@8971: } mschaefer@8971: mschaefer@8971: public void setDay(final Date day) { mschaefer@8971: this.day = day; mschaefer@8971: } mschaefer@9392: mschaefer@9392: /** mschaefer@9392: * Selects from the database the daily discharge values of a gauge and a date range mschaefer@9392: */ mschaefer@9392: public static List getValues(final Gauge gauge, final Date startDate, final Date endDate, final OrderByField orderBy) { mschaefer@9392: final Session session = SessionHolder.HOLDER.get(); mschaefer@9392: final String orderField = (orderBy == OrderByField.DISCHARGE) ? "discharge" : "day"; gernotbelger@9404: final Query query = session.createQuery("SELECT v" + " FROM DailyDischargeValue AS v JOIN v.dailyDischarge AS s" gernotbelger@9404: + " WHERE (s.gauge.id=:gaugeid) AND (v.day BETWEEN :startDate AND :endDate)" + " ORDER BY " + orderField); mschaefer@9392: query.setParameter("gaugeid", gauge.getId()); mschaefer@9392: query.setParameter("startDate", startDate); mschaefer@9392: query.setParameter("endDate", endDate); mschaefer@9392: return query.list(); mschaefer@9392: } gernotbelger@9404: gernotbelger@9404: /** gernotbelger@9404: * Selects from the database the daily discharge, puts the first and the last into a List (min, max day) gernotbelger@9404: */ gernotbelger@9405: gernotbelger@9405: public static Date getGlobalMinMax(final Gauge gauge, final MinMax minmax) { gernotbelger@9404: final Session session = SessionHolder.HOLDER.get(); gernotbelger@9405: final Query query = session.createQuery( gernotbelger@9405: "SELECT " + minmax.toString() + "(v.day) " + " FROM DailyDischargeValue AS v JOIN v.dailyDischarge AS s" + " WHERE (s.gauge.id=:gaugeid)"); gernotbelger@9404: query.setParameter("gaugeid", gauge.getId()); gernotbelger@9405: final List list = query.list(); gernotbelger@9405: if (list != null && list.size() == 1) { gernotbelger@9405: return list.get(0); gernotbelger@9405: } gernotbelger@9405: return null; gernotbelger@9404: } gernotbelger@9404: mschaefer@8971: }