Mercurial > dive4elements > river
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 } |