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 :

http://dive4elements.wald.intevation.org