Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java @ 326:07eba6d3b4a5
Fetches w/q value tables from the backend.
flys-artifacts/trunk@1722 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 18 Apr 2011 14:40:35 +0000 |
parents | |
children | e09634fbf6bc |
comparison
equal
deleted
inserted
replaced
325:7a0907742cc0 | 326:07eba6d3b4a5 |
---|---|
1 package de.intevation.flys.artifacts.model; | |
2 | |
3 import java.io.Serializable; | |
4 | |
5 import de.intevation.flys.model.River; | |
6 import de.intevation.flys.model.Wst; | |
7 import de.intevation.flys.model.WstColumn; | |
8 | |
9 import de.intevation.flys.backend.SessionHolder; | |
10 | |
11 import java.util.ArrayList; | |
12 import java.util.Comparator; | |
13 import java.util.List; | |
14 import java.util.Collections; | |
15 import java.util.Iterator; | |
16 | |
17 import org.hibernate.Session; | |
18 import org.hibernate.Query; | |
19 import org.hibernate.SQLQuery; | |
20 | |
21 import org.hibernate.type.StandardBasicTypes; | |
22 | |
23 public class WstValueTable | |
24 implements Serializable | |
25 { | |
26 | |
27 // TODO: put this into a property file | |
28 public static final String SQL_POS_WQ = | |
29 "SELECT wcv.position AS position," + | |
30 " w," + | |
31 " (SELECT q" + | |
32 " FROM wst_column_q_ranges wcqr" + | |
33 " JOIN wst_q_ranges wqr" + | |
34 " ON wcqr.wst_q_range_id = wqr.id" + | |
35 " JOIN ranges r" + | |
36 " ON r.id = wqr.range_id" + | |
37 " WHERE wcqr.wst_column_id = wc.id" + | |
38 " AND wcv.position BETWEEN r.a AND r.b) AS q," + | |
39 " wc.position AS column_pos " + | |
40 "FROM wst_column_values wcv" + | |
41 " JOIN wst_columns wc" + | |
42 " ON wcv.wst_column_id = wc.id" + | |
43 " JOIN wsts w" + | |
44 " ON wc.wst_id = w.id " + | |
45 "WHERE w.id = :wst_id" + | |
46 "ORDER BY wcv.position ASC," + | |
47 " wc.position DESC"; | |
48 | |
49 public static class Column | |
50 implements Serializable | |
51 { | |
52 protected String name; | |
53 | |
54 public Column() { | |
55 } | |
56 | |
57 public Column(String name) { | |
58 this.name = name; | |
59 } | |
60 | |
61 public String getName() { | |
62 return name; | |
63 } | |
64 | |
65 public void setName(String name) { | |
66 this.name = name; | |
67 } | |
68 } | |
69 // class Column | |
70 | |
71 public static class Row | |
72 implements Serializable | |
73 { | |
74 double km; | |
75 double [] wq; | |
76 | |
77 public Row() { | |
78 } | |
79 | |
80 public Row(double km, double [] wq) { | |
81 this.km = km; | |
82 this.wq = wq; | |
83 } | |
84 } | |
85 // class Row | |
86 | |
87 protected List<Row> rows; | |
88 | |
89 protected Column [] columns; | |
90 | |
91 public WstValueTable() { | |
92 rows = new ArrayList<Row>(); | |
93 } | |
94 | |
95 public WstValueTable(Column [] columns) { | |
96 this(); | |
97 this.columns = columns; | |
98 } | |
99 | |
100 public static WstValueTable getTable(River river) { | |
101 return getTable(river, 0); | |
102 } | |
103 | |
104 public static WstValueTable getTable(River river, int kind) { | |
105 | |
106 Session session = SessionHolder.HOLDER.get(); | |
107 | |
108 Query query = session.createQuery( | |
109 "from Wst where river=:river and kind=:kind"); | |
110 query.setParameter("river", river); | |
111 query.setInteger("kind", kind); | |
112 | |
113 List<Wst> wsts = query.list(); | |
114 | |
115 if (wsts.isEmpty()) { | |
116 return null; | |
117 } | |
118 | |
119 Wst wst = wsts.get(0); | |
120 | |
121 // TODO: Do this sorting at database level | |
122 List<WstColumn> wstColumns = new ArrayList(wst.getColumns()); | |
123 Collections.sort(wstColumns, new Comparator<WstColumn>() { | |
124 public int compare(WstColumn a, WstColumn b) { | |
125 int pa = a.getPosition(); | |
126 int pb = b.getPosition(); | |
127 if (pa < pb) return -1; | |
128 if (pa > pb) return +1; | |
129 return 0; | |
130 } | |
131 }); | |
132 | |
133 Column [] columns = new Column[wstColumns.size()]; | |
134 for (int i = 0; i < columns.length; ++i) { | |
135 columns[i] = new Column(wstColumns.get(i).getName()); | |
136 } | |
137 | |
138 // using native SQL here to avoid myriad of small objects. | |
139 SQLQuery sqlQuery = session.createSQLQuery(SQL_POS_WQ) | |
140 .addScalar("position", StandardBasicTypes.DOUBLE) | |
141 .addScalar("w", StandardBasicTypes.DOUBLE) | |
142 .addScalar("q", StandardBasicTypes.DOUBLE) | |
143 .addScalar("column_pos", StandardBasicTypes.INTEGER); | |
144 | |
145 sqlQuery.setInteger("wst_id", wst.getId()); | |
146 | |
147 WstValueTable valueTable = new WstValueTable(columns); | |
148 | |
149 int lastColumnNo = -1; | |
150 Row row = null; | |
151 | |
152 for (Iterator<Object []> iter = sqlQuery.iterate(); iter.hasNext();) { | |
153 Object [] result = iter.next(); | |
154 double km = (Double) result[0]; | |
155 Double w = (Double) result[1]; | |
156 Double q = (Double) result[2]; | |
157 int columnNo = (Integer)result[3]; | |
158 | |
159 if (columnNo > lastColumnNo) { // new row | |
160 if (row != null) { | |
161 valueTable.rows.add(row); | |
162 } | |
163 row = new Row(km, new double[(columnNo+1) << 1]); | |
164 } | |
165 int idx = columnNo << 1; | |
166 | |
167 row.wq[idx ] = w != null ? w : Double.NaN; | |
168 row.wq[idx+1] = q != null ? q : Double.NaN; | |
169 | |
170 lastColumnNo = columnNo; | |
171 } | |
172 | |
173 if (row != null) { | |
174 valueTable.rows.add(row); | |
175 } | |
176 | |
177 return valueTable; | |
178 } | |
179 } | |
180 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |