Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/artifacts/model/SQOverview.java @ 5838:5aa05a7a34b7
Rename modules to more fitting names.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 15:23:37 +0200 |
parents | flys-artifacts/src/main/java/org/dive4elements/river/artifacts/model/SQOverview.java@bd047b71ab37 |
children | 4897a58c8746 |
comparison
equal
deleted
inserted
replaced
5837:d9901a08d0a6 | 5838:5aa05a7a34b7 |
---|---|
1 package org.dive4elements.river.artifacts.model; | |
2 | |
3 import java.io.Serializable; | |
4 | |
5 import java.text.SimpleDateFormat; | |
6 | |
7 import java.util.ArrayList; | |
8 import java.util.Date; | |
9 import java.util.List; | |
10 | |
11 import org.apache.log4j.Logger; | |
12 | |
13 import org.hibernate.SQLQuery; | |
14 import org.hibernate.Session; | |
15 | |
16 import org.hibernate.type.StandardBasicTypes; | |
17 | |
18 import org.w3c.dom.Document; | |
19 import org.w3c.dom.Element; | |
20 | |
21 import org.dive4elements.river.utils.KMIndex; | |
22 | |
23 public class SQOverview | |
24 implements Serializable | |
25 { | |
26 private static Logger log = Logger.getLogger(SQOverview.class); | |
27 | |
28 /** | |
29 * Serial version UId. | |
30 */ | |
31 private static final long serialVersionUID = -8934372438968398508L; | |
32 | |
33 public interface Filter { | |
34 | |
35 boolean accept(KMIndex<List<Date>> entry); | |
36 | |
37 } // interface Filter | |
38 | |
39 | |
40 public static final Filter ACCEPT = new Filter() { | |
41 @Override | |
42 public boolean accept(KMIndex<List<Date>> entry) { | |
43 return true; | |
44 } | |
45 }; | |
46 | |
47 public static class KmFilter implements Filter { | |
48 | |
49 protected double km; | |
50 | |
51 public KmFilter (double km) { | |
52 this.km = km; | |
53 } | |
54 @Override | |
55 public boolean accept(KMIndex<List<Date>> list) { | |
56 for (KMIndex.Entry<List<Date>> e: list){ | |
57 if (e.getKm() == km) { | |
58 return true; | |
59 } | |
60 } | |
61 return false; | |
62 } | |
63 }; | |
64 | |
65 public static class DateFilter implements Filter { | |
66 | |
67 protected Date date; | |
68 | |
69 public DateFilter (Date date) { | |
70 this.date = date; | |
71 } | |
72 @Override | |
73 public boolean accept(KMIndex<List<Date>> list) { | |
74 for (KMIndex.Entry<List<Date>> e: list){ | |
75 if (e.getValue().equals(this.date)) { | |
76 return true; | |
77 } | |
78 } | |
79 return false; | |
80 } | |
81 }; | |
82 | |
83 public static final double EPSILON = 1e-4; | |
84 | |
85 public static final String DATE_FORMAT = "dd.MM.yyyy"; | |
86 | |
87 public static final String SQL_SQ = | |
88 "SELECT" + | |
89 " s.km AS km," + | |
90 " m.datum AS datum " + | |
91 "FROM messung m " + | |
92 " JOIN station s" + | |
93 " ON m.stationid = s.stationid " + | |
94 " JOIN gewaesser g " + | |
95 " ON s.gewaesserid = g.gewaesserid " + | |
96 "WHERE" + | |
97 " m.q_bpegel IS NOT NULL AND" + | |
98 " g.name = :name " + | |
99 "ORDER by" + | |
100 " s.km, m.datum"; | |
101 | |
102 protected String riverName; | |
103 | |
104 protected KMIndex<List<Date>> entries; | |
105 | |
106 public SQOverview() { | |
107 entries = new KMIndex<List<Date>>(); | |
108 } | |
109 | |
110 public SQOverview(String riverName) { | |
111 this(); | |
112 this.riverName = riverName; | |
113 } | |
114 | |
115 private static final boolean epsilonEquals(double a, double b) { | |
116 return Math.abs(a - b) < EPSILON; | |
117 } | |
118 | |
119 protected void loadData(Session session) { | |
120 SQLQuery query = session.createSQLQuery(SQL_SQ) | |
121 .addScalar("km", StandardBasicTypes.DOUBLE) | |
122 .addScalar("datum", StandardBasicTypes.DATE); | |
123 | |
124 query.setString("name", riverName); | |
125 | |
126 List<Object []> list = query.list(); | |
127 | |
128 if (list.isEmpty()) { | |
129 log.warn("No river '" + riverName + "' found."); | |
130 } | |
131 | |
132 Double prevKm = -Double.MAX_VALUE; | |
133 List<Date> dates = new ArrayList<Date>(); | |
134 | |
135 for (Object [] row: list) { | |
136 Double km = (Double)row[0]; | |
137 if (!epsilonEquals(km, prevKm) && !dates.isEmpty()) { | |
138 entries.add(prevKm, dates); | |
139 dates = new ArrayList<Date>(); | |
140 } | |
141 dates.add((Date)row[1]); | |
142 prevKm = km; | |
143 } | |
144 | |
145 if (!dates.isEmpty()) { | |
146 entries.add(prevKm, dates); | |
147 } | |
148 } | |
149 | |
150 public boolean load(Session session) { | |
151 | |
152 loadData(session); | |
153 | |
154 return true; | |
155 } | |
156 | |
157 | |
158 public void generateOverview(Document document) { | |
159 generateOverview(document, ACCEPT); | |
160 } | |
161 | |
162 public KMIndex<List<Date>> filter(Filter f) { | |
163 // TODO: Apply filter | |
164 return entries; | |
165 } | |
166 | |
167 public void generateOverview( | |
168 Document document, | |
169 Filter filter | |
170 ) { | |
171 KMIndex<List<Date>> filtered = filter(ACCEPT); | |
172 | |
173 Element sqElement = document.createElement("sq"); | |
174 | |
175 Element riverElement = document.createElement("river"); | |
176 | |
177 riverElement.setAttribute("name", riverName); | |
178 | |
179 sqElement.appendChild(riverElement); | |
180 | |
181 SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT); | |
182 | |
183 Element kmE = document.createElement("km"); | |
184 | |
185 for (KMIndex.Entry<List<Date>> e: filtered) { | |
186 | |
187 List<Date> dates = e.getValue(); | |
188 | |
189 if (!dates.isEmpty()) { | |
190 Element dEs = document.createElement("dates"); | |
191 | |
192 for (Date d: dates) { | |
193 Element dE = document.createElement("date"); | |
194 | |
195 dE.setAttribute("value", df.format(d)); | |
196 | |
197 dEs.appendChild(dE); | |
198 } | |
199 | |
200 kmE.appendChild(dEs); | |
201 } | |
202 } | |
203 | |
204 sqElement.appendChild(kmE); | |
205 | |
206 document.appendChild(sqElement); | |
207 } | |
208 } | |
209 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |