Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WstValueTableFactory.java @ 5423:f4fd64a4d502
Fix Wstcalculation for non monotonous values.
Patch written and provided by Sascha Teichmann
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Tue, 26 Mar 2013 11:39:03 +0100 |
parents | b2ea89a665bc |
children |
comparison
equal
deleted
inserted
replaced
5422:eb7a3f58bdd6 | 5423:f4fd64a4d502 |
---|---|
96 Session session = SessionHolder.HOLDER.get(); | 96 Session session = SessionHolder.HOLDER.get(); |
97 | 97 |
98 // Fetch data for one column only. | 98 // Fetch data for one column only. |
99 | 99 |
100 WstValueTable.Column [] columns = loadColumns(session, wst_id); | 100 WstValueTable.Column [] columns = loadColumns(session, wst_id); |
101 loadQRanges(session, columns, wst_id); | 101 int [] map = loadQRangesMap(session, columns, wst_id); |
102 List<WstValueTable.Row> rows = loadRows(session, wst_id, columns.length); | 102 List<WstValueTable.Row> rows = loadRows(session, wst_id, columns.length, map); |
103 | 103 |
104 WstValueTable valueTable = new WstValueTable(columns, rows); | 104 WstValueTable valueTable = new WstValueTable(columns, rows); |
105 | 105 |
106 if (valueTable != null && cacheKey != null) { | 106 if (valueTable != null && cacheKey != null) { |
107 log.debug("Store wst value table in cache"); | 107 log.debug("Store wst value table in cache"); |
202 return null; | 202 return null; |
203 } | 203 } |
204 | 204 |
205 WstValueTable.Column [] columns = loadColumns(session, wst); | 205 WstValueTable.Column [] columns = loadColumns(session, wst); |
206 | 206 |
207 loadQRanges(session, columns, wst); | 207 int map [] = loadQRangesMap(session, columns, wst); |
208 | 208 |
209 List<WstValueTable.Row> rows = loadRows(session, wst, columns.length); | 209 List<WstValueTable.Row> rows = |
210 loadRows(session, wst.getId(), columns.length, map); | |
210 | 211 |
211 return new WstValueTable(columns, rows); | 212 return new WstValueTable(columns, rows); |
212 } | 213 } |
213 | 214 |
214 /** | 215 /** |
272 protected static List<WstValueTable.Row> loadRows( | 273 protected static List<WstValueTable.Row> loadRows( |
273 Session session, | 274 Session session, |
274 int wst_id, | 275 int wst_id, |
275 int numColumns | 276 int numColumns |
276 ) { | 277 ) { |
278 return loadRows(session, wst_id, numColumns, null); | |
279 } | |
280 | |
281 protected static List<WstValueTable.Row> loadRows( | |
282 Session session, | |
283 int wst_id, | |
284 int numColumns, | |
285 int [] map | |
286 ) { | |
277 SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT_WS) | 287 SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT_WS) |
278 .addScalar("km", StandardBasicTypes.DOUBLE) | 288 .addScalar("km", StandardBasicTypes.DOUBLE) |
279 .addScalar("w", StandardBasicTypes.DOUBLE) | 289 .addScalar("w", StandardBasicTypes.DOUBLE) |
280 .addScalar("column_pos", StandardBasicTypes.INTEGER); | 290 .addScalar("column_pos", StandardBasicTypes.INTEGER); |
281 | 291 |
296 WstValueTable.Row row = | 306 WstValueTable.Row row = |
297 new WstValueTable.Row((Double)result[0], ws); | 307 new WstValueTable.Row((Double)result[0], ws); |
298 rows.add(row); | 308 rows.add(row); |
299 } | 309 } |
300 Double w = (Double)result[1]; | 310 Double w = (Double)result[1]; |
301 ws[column] = w != null ? w : Double.NaN; | 311 int index = map != null ? map[column] : column; |
312 ws[index] = w != null ? w : Double.NaN; | |
302 lastColumn = column; | 313 lastColumn = column; |
303 } | 314 } |
304 | 315 |
305 rows.trimToSize(); | 316 rows.trimToSize(); |
306 return rows; | 317 return rows; |
385 QRangeTree qRangeTree = new QRangeTree( | 396 QRangeTree qRangeTree = new QRangeTree( |
386 qRanges, QRangeTree.WITHOUT_COLUMN, 0, qSize); | 397 qRanges, QRangeTree.WITHOUT_COLUMN, 0, qSize); |
387 columns[0].setQRangeTree(qRangeTree); | 398 columns[0].setQRangeTree(qRangeTree); |
388 } | 399 } |
389 | 400 |
390 protected static void loadQRanges( | 401 protected static int [] loadQRangesMap( |
391 Session session, | 402 Session session, |
392 WstValueTable.Column [] columns, | 403 WstValueTable.Column [] columns, |
393 int wst_id | 404 int wst_id |
394 ) { | 405 ) { |
395 SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT_QS) | 406 SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT_QS) |
424 if (start != -1) { | 435 if (start != -1) { |
425 QRangeTree qRangeTree = new QRangeTree(qRanges, start, Q); | 436 QRangeTree qRangeTree = new QRangeTree(qRanges, start, Q); |
426 columns[lastColumn].setQRangeTree(qRangeTree); | 437 columns[lastColumn].setQRangeTree(qRangeTree); |
427 } | 438 } |
428 | 439 |
440 return sortColumnsByAverageQ(columns); | |
441 | |
429 /* This is debug code to visualize the q ranges trees | 442 /* This is debug code to visualize the q ranges trees |
430 | 443 |
431 java.io.PrintWriter out = null; | 444 java.io.PrintWriter out = null; |
432 try { | 445 try { |
433 out = new java.io.PrintWriter( | 446 out = new java.io.PrintWriter( |
452 if (out != null) { | 465 if (out != null) { |
453 out.close(); | 466 out.close(); |
454 } | 467 } |
455 } | 468 } |
456 */ | 469 */ |
457 | 470 } |
458 } | 471 |
459 | 472 private static final class QIndex implements Comparable<QIndex> { |
460 protected static void loadQRanges( | 473 double q; |
474 int index; | |
475 | |
476 QIndex(double q, int index) { | |
477 this.q = q; | |
478 this.index = index; | |
479 } | |
480 | |
481 @Override | |
482 public int compareTo(QIndex other) { | |
483 double diff = q - other.q; | |
484 if (diff < 0d) return -1; | |
485 if (diff > 0d) return +1; | |
486 return 0; | |
487 } | |
488 } // class QIndex | |
489 | |
490 /** Ensure that the q colums are sorted in ascending order. */ | |
491 protected static int [] sortColumnsByAverageQ(WstValueTable.Column [] columns) { | |
492 QIndex [] order = new QIndex[columns.length]; | |
493 for (int i = 0; i < order.length; ++i) { | |
494 QRangeTree tree = columns[i].getQRangeTree(); | |
495 double avg = tree.averageQ(); | |
496 double max = tree.maxQ(); | |
497 double q = (avg+max)*0.5d; | |
498 order[i] = new QIndex(q, i); | |
499 } | |
500 Arrays.sort(order); | |
501 WstValueTable.Column [] copy = new WstValueTable.Column[order.length]; | |
502 int [] map = new int[order.length]; | |
503 for (int i = 0; i < copy.length; ++i) { | |
504 copy[i] = columns[order[i].index]; | |
505 map[order[i].index] = i; | |
506 } | |
507 System.arraycopy(copy, 0, columns, 0, order.length); | |
508 return map; | |
509 } | |
510 | |
511 protected static int [] loadQRangesMap( | |
461 Session session, | 512 Session session, |
462 WstValueTable.Column [] columns, | 513 WstValueTable.Column [] columns, |
463 Wst wst | 514 Wst wst |
464 ) { | 515 ) { |
465 loadQRanges(session, columns, wst.getId()); | 516 return loadQRangesMap(session, columns, wst.getId()); |
466 } | 517 } |
467 | 518 |
468 } | 519 } |
469 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : | 520 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |