teichmann@5844: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5844: * Software engineering by Intevation GmbH teichmann@5844: * teichmann@5992: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5844: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5992: * documentation coming with Dive4Elements River for details. teichmann@5844: */ teichmann@5844: teichmann@5829: package org.dive4elements.river.model; sascha@167: gernotbelger@9404: import java.io.Serializable; sascha@167: import java.math.BigDecimal; sascha@203: import java.util.List; sascha@203: gernotbelger@9404: import javax.persistence.Column; sascha@171: import javax.persistence.Entity; gernotbelger@9404: import javax.persistence.GeneratedValue; gernotbelger@9404: import javax.persistence.GenerationType; sascha@171: import javax.persistence.Id; gernotbelger@9404: import javax.persistence.JoinColumn; gernotbelger@9404: import javax.persistence.OneToMany; gernotbelger@9404: import javax.persistence.OneToOne; sascha@171: import javax.persistence.SequenceGenerator; gernotbelger@9404: import javax.persistence.Table; ingo@468: teichmann@5969: import org.apache.log4j.Logger; teichmann@5829: import org.dive4elements.river.backend.SessionHolder; gernotbelger@9404: import org.hibernate.Query; gernotbelger@9404: import org.hibernate.Session; ingo@468: felix@5374: /** Database-mapped Gauge with all info about it. */ sascha@171: @Entity sascha@171: @Table(name = "gauges") gernotbelger@9404: public class Gauge implements Serializable, Comparable { teichmann@5969: private static final Logger log = Logger.getLogger(Gauge.class); teichmann@5969: ingo@2385: public static final int MASTER_DISCHARGE_TABLE = 0; ingo@2385: gernotbelger@9404: private Integer id; gernotbelger@9404: private String name; gernotbelger@9404: private River river; sascha@167: private BigDecimal station; sascha@167: private BigDecimal aeo; sascha@167: private BigDecimal datum; gernotbelger@9404: private Long officialNumber; gernotbelger@9404: private Range range; sascha@167: sascha@203: private List dischargeTables; sascha@203: felix@1233: /** MainValues at this Gauge. */ felix@1233: protected List mainValues; felix@1233: sascha@167: public Gauge() { sascha@167: } sascha@167: gernotbelger@9404: public Gauge(final String name, final River river, final BigDecimal station, final BigDecimal aeo, final BigDecimal datum, final Long officialNumber, gernotbelger@9404: final Range range) { gernotbelger@9404: this.name = name; gernotbelger@9404: this.river = river; gernotbelger@9404: this.station = station; gernotbelger@9404: this.aeo = aeo; gernotbelger@9404: this.datum = datum; gernotbelger@9404: this.officialNumber = officialNumber; gernotbelger@9404: this.range = range; sascha@192: } sascha@192: sascha@171: @Id gernotbelger@9404: @SequenceGenerator(name = "SEQUENCE_GAUGES_ID_SEQ", sequenceName = "GAUGES_ID_SEQ", allocationSize = 1) gernotbelger@9404: @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQUENCE_GAUGES_ID_SEQ") sascha@171: @Column(name = "id") sascha@171: public Integer getId() { gernotbelger@9404: return this.id; sascha@171: } sascha@171: gernotbelger@9404: public void setId(final Integer id) { sascha@167: this.id = id; sascha@167: } sascha@167: sascha@193: @OneToOne gernotbelger@9404: @JoinColumn(name = "river_id") sascha@193: public River getRiver() { gernotbelger@9404: return this.river; sascha@193: } sascha@193: gernotbelger@9404: public void setRiver(final River river) { sascha@193: this.river = river; sascha@193: } sascha@193: sascha@172: @Column(name = "name") sascha@172: public String getName() { gernotbelger@9404: return this.name; sascha@172: } sascha@172: gernotbelger@9404: public void setName(final String name) { sascha@167: this.name = name; sascha@167: } sascha@167: sascha@172: @Column(name = "station") // FIXME: type mapping needed sascha@172: public BigDecimal getStation() { gernotbelger@9404: return this.station; sascha@167: } sascha@167: gernotbelger@9404: public void setStation(final BigDecimal station) { sascha@167: this.station = station; sascha@167: } sascha@167: sascha@172: @Column(name = "aeo") // FIXME: type mapping needed sascha@172: public BigDecimal getAeo() { gernotbelger@9404: return this.aeo; sascha@167: } sascha@167: gernotbelger@9404: public void setAeo(final BigDecimal aeo) { sascha@167: this.aeo = aeo; sascha@167: } sascha@167: sascha@172: @Column(name = "datum") // FIXME: type mapping needed sascha@172: public BigDecimal getDatum() { gernotbelger@9404: return this.datum; sascha@167: } sascha@167: gernotbelger@9404: public void setDatum(final BigDecimal datum) { sascha@167: this.datum = datum; sascha@167: } sascha@167: sascha@2371: @Column(name = "official_number") sascha@2371: public Long getOfficialNumber() { gernotbelger@9404: return this.officialNumber; sascha@2371: } sascha@2371: gernotbelger@9404: public void setOfficialNumber(final Long officialNumber) { sascha@2371: this.officialNumber = officialNumber; sascha@2371: } sascha@2371: sascha@174: @OneToOne gernotbelger@9404: @JoinColumn(name = "range_id") sascha@172: public Range getRange() { gernotbelger@9404: return this.range; sascha@167: } sascha@167: gernotbelger@9404: public void setRange(final Range range) { sascha@167: this.range = range; sascha@167: } sascha@203: sascha@203: @OneToMany sascha@203: @JoinColumn(name = "gauge_id") sascha@203: public List getDischargeTables() { gernotbelger@9404: return this.dischargeTables; sascha@203: } sascha@203: gernotbelger@9404: public void setDischargeTables(final List dischargeTables) { sascha@203: this.dischargeTables = dischargeTables; sascha@203: } ingo@468: ingo@468: /** ingo@468: * Returns min and max W values of this gauge. ingo@468: * felix@1233: * @return the min and max W value of this gauge [min,max]. ingo@468: */ teichmann@6327: public double[] determineMinMaxW() { gernotbelger@9404: final Session session = SessionHolder.HOLDER.get(); ingo@468: gernotbelger@9404: final DischargeTable dischargeTable = fetchMasterDischargeTable(); ingo@468: ingo@468: if (dischargeTable == null) { ingo@468: return null; ingo@468: } ingo@468: gernotbelger@9404: final Query query = session.createQuery("select min(w) as min, max(w) as max from DischargeTableValue " + "where table_id =:table"); ingo@468: query.setParameter("table", dischargeTable.getId()); ingo@468: gernotbelger@9404: final List results = query.list(); teichmann@5969: if (results.isEmpty()) { teichmann@5969: log.error("No values in discharge table found."); teichmann@5969: return null; teichmann@5969: } ingo@468: gernotbelger@9404: final Object[] result = (Object[]) results.get(0); teichmann@5969: gernotbelger@9404: final BigDecimal a = (BigDecimal) result[0]; gernotbelger@9404: final BigDecimal b = (BigDecimal) result[1]; teichmann@5969: gernotbelger@9404: return a != null && b != null ? new double[] { a.doubleValue(), b.doubleValue() } : null; ingo@468: } felix@1233: felix@1233: @OneToMany felix@1233: @JoinColumn(name = "gauge_id") felix@1233: public List getMainValues() { gernotbelger@9404: return this.mainValues; felix@1233: } felix@1233: gernotbelger@9404: public void setMainValues(final List mainValues) { felix@1233: this.mainValues = mainValues; ingo@2381: } ingo@2381: gernotbelger@9404: public static Gauge getGaugeByOfficialNumber(final long number) { gernotbelger@9404: final Session session = SessionHolder.HOLDER.get(); ingo@2381: gernotbelger@9404: final Query query = session.createQuery("from Gauge where officialNumber=:number"); ingo@2381: ingo@2381: query.setParameter("number", number); ingo@2381: gernotbelger@9404: final List results = query.list(); ingo@2381: ingo@2381: return results.isEmpty() ? null : results.get(0); ingo@2381: } ingo@2385: gernotbelger@9404: public static Gauge getGaugeByOfficialNumber(final long number, final String river_name) { gernotbelger@9404: final Session session = SessionHolder.HOLDER.get(); aheinecke@6838: gernotbelger@9404: final Query query = session.createQuery("from Gauge as gau " + "where gau.officialNumber=:number and gau.river.name=:river_name"); aheinecke@6838: aheinecke@6838: query.setParameter("number", number); aheinecke@6838: query.setParameter("river_name", river_name); aheinecke@6838: gernotbelger@9404: final List results = query.list(); aheinecke@6838: aheinecke@6838: return results.isEmpty() ? null : results.get(0); aheinecke@6838: } aheinecke@6838: gernotbelger@9404: public static Gauge getGaugeByNameAndRiver(final String gauge_name, final River river) { gernotbelger@9404: final Session session = SessionHolder.HOLDER.get(); gernotbelger@9404: gernotbelger@9404: final Query query = session.createQuery("from Gauge as gau " + "where gau.name=:name and gau.river=:river"); gernotbelger@9404: gernotbelger@9404: query.setParameter("name", gauge_name); gernotbelger@9404: query.setParameter("river", river); gernotbelger@9404: gernotbelger@9404: final List results = query.list(); gernotbelger@9404: gernotbelger@9404: return results.isEmpty() ? null : results.get(0); gernotbelger@9404: } ingo@2385: ingo@2385: public DischargeTable fetchMasterDischargeTable() { gernotbelger@9404: final Session session = SessionHolder.HOLDER.get(); ingo@2385: gernotbelger@9404: final Query query = session.createQuery("from DischargeTable " + "where kind = 0 " + "and gauge = :gauge"); tom@8482: tom@8482: query.setParameter("gauge", this); tom@8482: gernotbelger@9404: final List results = query.list(); tom@8482: gernotbelger@9404: return results.isEmpty() ? null : (DischargeTable) results.get(0); ingo@2385: } bjoern@3686: bjoern@3686: /** mschaefer@9633: * Fetches from the database the most recent discharge table mschaefer@9633: */ mschaefer@9633: public DischargeTable fetchRecentDischargeTable() { mschaefer@9633: final Session session = SessionHolder.HOLDER.get(); mschaefer@9633: mschaefer@9633: final Query query = session.createQuery("FROM DischargeTable" // mschaefer@9633: + " WHERE (gauge = :gauge)" // mschaefer@9633: + " ORDER BY timeInterval.startTime DESC"); mschaefer@9633: mschaefer@9633: query.setParameter("gauge", this); mschaefer@9633: mschaefer@9633: final List results = query.list(); mschaefer@9633: mschaefer@9633: return results.isEmpty() ? null : (DischargeTable) results.get(0); mschaefer@9633: } mschaefer@9633: mschaefer@9633: /** bjoern@3686: * Returns an array of [days, qs] necessary to create duration curves. bjoern@3686: * bjoern@3686: * @return a 2dim array of [days, qs] where days is an int[] and qs is gernotbelger@9404: * an double[]. bjoern@3686: */ bjoern@3688: public Object[] fetchDurationCurveData() { gernotbelger@9404: final Session session = SessionHolder.HOLDER.get(); bjoern@3686: mschaefer@9633: final Query query = session.createQuery("select cast(nmv.name as integer) as days, mv.value as q " // mschaefer@9633: + "from MainValue as mv " // mschaefer@9633: + "join mv.mainValue as nmv " // mschaefer@9633: + "join nmv.type mvt " // mschaefer@9633: + "where mvt.name = 'D' and mv.gauge.id = :gauge_id " + "order by days"); bjoern@3686: bjoern@3686: query.setParameter("gauge_id", getId()); bjoern@3686: gernotbelger@9404: final List results = query.list(); gernotbelger@9404: final int[] days = new int[results.size()]; gernotbelger@9404: final double[] qs = new double[results.size()]; bjoern@3686: bjoern@3686: int idx = 0; bjoern@3686: gernotbelger@9404: for (final Object obj : results) { gernotbelger@9404: final Object[] arr = (Object[]) obj; bjoern@3686: bjoern@3686: try { gernotbelger@9404: final int day = ((Integer) arr[0]).intValue(); gernotbelger@9404: final double q = ((BigDecimal) arr[1]).doubleValue(); bjoern@3686: bjoern@3686: days[idx] = day; bjoern@3686: qs[idx++] = q; bjoern@3686: } gernotbelger@9404: catch (final NumberFormatException nfe) { bjoern@3686: } bjoern@3686: } bjoern@3686: bjoern@3686: return new Object[] { days, qs }; bjoern@3686: } bjoern@3686: bjoern@3789: /** bjoern@3789: * Calculates the maximum and minimum W and Q values bjoern@3789: * bjoern@3789: * @return the MaxMinWQ object representing the calculated values bjoern@3789: */ bjoern@3789: public MinMaxWQ fetchMaxMinWQ() { gernotbelger@9404: final Session session = SessionHolder.HOLDER.get(); bjoern@3789: gernotbelger@9404: final Query query = session.createQuery("select max(mv.value) as max, min(mv.value) as min " + "from MainValue as mv " + "join mv.mainValue as nmv " gernotbelger@9404: + "join nmv.type mvt " + "where mvt.name in ('W', 'Q') " + "and mv.gauge.id = :gauge_id " + "group by mvt.name order by mvt.name"); bjoern@3789: bjoern@3789: query.setParameter("gauge_id", getId()); bjoern@3789: gernotbelger@9404: final List results = query.list(); sascha@3790: if (results.isEmpty()) { bjoern@3789: // No values found bjoern@3789: return new MinMaxWQ(); bjoern@3789: } bjoern@3789: sascha@3790: Object[] arr = (Object[]) results.get(0); gernotbelger@9404: final BigDecimal maxw = (BigDecimal) arr[0]; gernotbelger@9404: final BigDecimal minw = (BigDecimal) arr[1]; bjoern@3789: BigDecimal maxq = null; bjoern@3789: BigDecimal minq = null; bjoern@3789: bjoern@3789: if (results.size() > 1) { bjoern@3789: arr = (Object[]) results.get(1); gernotbelger@9404: maxq = (BigDecimal) arr[0]; gernotbelger@9404: minq = (BigDecimal) arr[1]; bjoern@3789: } bjoern@3789: bjoern@3789: return new MinMaxWQ(minw, maxw, minq, maxq); bjoern@3789: } ingo@4174: ingo@4174: @Override gernotbelger@9404: public int compareTo(final Gauge o) { ingo@4174: return getName().compareTo(o.getName()); ingo@4174: } sascha@167: } sascha@167: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :