comparison backend/src/main/java/org/dive4elements/river/model/sinfo/DailyDischargeValue.java @ 9409:38201f5b0dd9

Changed bundu bzws workflow to stop in case of missing daily discharge values and other minor changes
author mschaefer
date Thu, 16 Aug 2018 08:47:41 +0200
parents 34cd4faf43f4
children
comparison
equal deleted inserted replaced
9408:66a43d9f65c8 9409:38201f5b0dd9
11 package org.dive4elements.river.model.sinfo; 11 package org.dive4elements.river.model.sinfo;
12 12
13 import java.io.Serializable; 13 import java.io.Serializable;
14 import java.util.Date; 14 import java.util.Date;
15 import java.util.List; 15 import java.util.List;
16 import java.util.Map;
17 import java.util.TreeMap;
16 18
17 import javax.persistence.Column; 19 import javax.persistence.Column;
18 import javax.persistence.Entity; 20 import javax.persistence.Entity;
19 import javax.persistence.GeneratedValue; 21 import javax.persistence.GeneratedValue;
20 import javax.persistence.GenerationType; 22 import javax.persistence.GenerationType;
25 import javax.persistence.Table; 27 import javax.persistence.Table;
26 28
27 import org.dive4elements.river.backend.SessionHolder; 29 import org.dive4elements.river.backend.SessionHolder;
28 import org.dive4elements.river.model.Gauge; 30 import org.dive4elements.river.model.Gauge;
29 import org.hibernate.Query; 31 import org.hibernate.Query;
32 import org.hibernate.SQLQuery;
30 import org.hibernate.Session; 33 import org.hibernate.Session;
34 import org.hibernate.type.StandardBasicTypes;
31 35
32 /** 36 /**
33 * Hibernate binding for the DB table daily_discharge_values 37 * Hibernate binding for the DB table daily_discharge_values
34 * 38 *
35 * @author Matthias Schäfer 39 * @author Matthias Schäfer
47 */ 51 */
48 public enum OrderByField { 52 public enum OrderByField {
49 DAY, DISCHARGE; 53 DAY, DISCHARGE;
50 } 54 }
51 55
52 public enum MinMax {
53 min, max
54 }
55 56
56 /***** FIELDS *****/ 57 /***** FIELDS *****/
57 58
58 private static final long serialVersionUID = -6192738825193230784L; 59 private static final long serialVersionUID = -6192738825193230784L;
59 60
62 private DailyDischarge dailyDischarge; 63 private DailyDischarge dailyDischarge;
63 64
64 private Date day; 65 private Date day;
65 66
66 private Double discharge; 67 private Double discharge;
68
67 69
68 /***** CONSTRUCTORS *****/ 70 /***** CONSTRUCTORS *****/
69 71
70 public DailyDischargeValue() { 72 public DailyDischargeValue() {
71 } 73 }
80 * Parameter constructor with primitive parameter types 82 * Parameter constructor with primitive parameter types
81 */ 83 */
82 public DailyDischargeValue(final DailyDischarge dailyDischarge, final Date day, final double discharge) { 84 public DailyDischargeValue(final DailyDischarge dailyDischarge, final Date day, final double discharge) {
83 this(dailyDischarge, day, Double.valueOf(discharge)); 85 this(dailyDischarge, day, Double.valueOf(discharge));
84 } 86 }
87
85 88
86 /***** METHODS *****/ 89 /***** METHODS *****/
87 90
88 @Id 91 @Id
89 @SequenceGenerator(name = "SEQUENCE_DAILY_DISCHARGE_VALUE_ID_SEQ", sequenceName = "DAILY_DISCHARGE_VALUES_ID_SEQ", allocationSize = 1) 92 @SequenceGenerator(name = "SEQUENCE_DAILY_DISCHARGE_VALUE_ID_SEQ", sequenceName = "DAILY_DISCHARGE_VALUES_ID_SEQ", allocationSize = 1)
140 } 143 }
141 144
142 /** 145 /**
143 * Selects from the database the daily discharge, puts the first and the last into a List (min, max day) 146 * Selects from the database the daily discharge, puts the first and the last into a List (min, max day)
144 */ 147 */
145 148 public static Date[] getTimePeriod(final Gauge gauge, final Date fromDay, final Date toDay) {
146 public static Date getGlobalMinMax(final Gauge gauge, final MinMax minmax) {
147 final Session session = SessionHolder.HOLDER.get(); 149 final Session session = SessionHolder.HOLDER.get();
148 final Query query = session.createQuery( 150 final Query query = session.createQuery("SELECT MIN(v.day), MAX(v.day)"
149 "SELECT " + minmax.toString() + "(v.day) " + " FROM DailyDischargeValue AS v JOIN v.dailyDischarge AS s" + " WHERE (s.gauge.id=:gaugeid)"); 151 + " FROM DailyDischargeValue AS v JOIN v.dailyDischarge AS s"
152 + " WHERE (s.gauge.id=:gaugeid) AND (v.day BETWEEN :startDate AND :endDate)");
150 query.setParameter("gaugeid", gauge.getId()); 153 query.setParameter("gaugeid", gauge.getId());
151 final List<Date> list = query.list(); 154 query.setDate("startDate", fromDay);
152 if (list != null && list.size() == 1) { 155 query.setDate("endDate", toDay);
153 return list.get(0); 156 final List<Object[]> list = query.list();
157 if (!list.isEmpty()) {
158 return new Date[] { (Date) list.get(0)[0], (Date) list.get(0)[1] };
154 } 159 }
155 return null; 160 return null;
156 } 161 }
157 162
163 /**
164 * Fetches a map of minimum+maximum daily discharge dates (or null) by gauge for a list of gauges and a time period
165 */
166 public static Map<Gauge, Date[]> fetchGaugesTimePeriod(final List<Gauge> gauges, final Date fromDay, final Date toDay) {
167 final Map<Gauge, Date[]> result = new TreeMap<>();
168 final Map<Integer, Gauge> gaugelookup = new TreeMap<>();
169 String gaugeids = "";
170 String sep = "";
171 for (final Gauge gauge : gauges) {
172 gaugeids += sep + gauge.getId().toString();
173 sep = ",";
174 result.put(gauge, null);
175 gaugelookup.put(gauge.getId(), gauge);
176 }
177 final Session session = SessionHolder.HOLDER.get();
178 final SQLQuery query = session.createSQLQuery("SELECT g.id AS gauge_id, MIN(v.day) AS min_day, MAX(v.day) AS max_day"
179 + "FROM (gauges g LEFT JOIN daily_discharge s ON g.id=s.gauge_id)"
180 + " LEFT JOIN daily_discharge_values v ON s.id=v.daily_discharge_id"
181 + " WHERE g.id IN (:gaugeids)"
182 + " AND v.day BETWEEN :fromDay AND :toDay"
183 + " GROUP BY g.id"
184 + "UNION SELECT id, NULL, NULL"
185 + " FROM gauges"
186 + " WHERE id IN (:gaugeids)"
187 + " AND id NOT IN "
188 +" (SELECT s2.gauge_id FROM daily_discharge s2 INNER JOIN daily_discharge_values v2 ON s2.id=v2.daily_discharge_id"
189 + " WHERE v2.day BETWEEN :fromDay AND :toDay)"
190 + "ORDER BY 1")
191 .addScalar("gauge_id", StandardBasicTypes.INTEGER)
192 .addScalar("min_day", StandardBasicTypes.DATE)
193 .addScalar("max_day", StandardBasicTypes.DATE);
194 query.setString("gaugeids", gaugeids);
195 query.setDate("fromDay", fromDay);
196 query.setDate("toDay", toDay);
197 final List<Object[]> rows = query.list();
198 if (!rows.isEmpty()) {
199 // TODO handle nulls
200 for (int i = 0; i <= rows.size() - 1; i++)
201 result.put(gaugelookup.get(rows.get(i)[0]), new Date[] { (Date) rows.get(i)[1], (Date) rows.get(i)[2] });
202 return result;
203 }
204 return new TreeMap<>();
205 }
158 } 206 }

http://dive4elements.wald.intevation.org