Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/artifacts/model/WstValueTableFactory.java @ 8705:682a26e4158b
(issue1787) Globally sorting WST-columns over avg(Q)+max(Q) might give unexpected results at some kms. We thus sort locally since Rev 93a31cfb18c0.
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Thu, 23 Apr 2015 19:20:40 +0200 |
parents | af13ceeba52a |
children | 5e38e2924c07 |
comparison
equal
deleted
inserted
replaced
8704:93a31cfb18c0 | 8705:682a26e4158b |
---|---|
104 Session session = SessionHolder.HOLDER.get(); | 104 Session session = SessionHolder.HOLDER.get(); |
105 | 105 |
106 // Fetch data for one column only. | 106 // Fetch data for one column only. |
107 | 107 |
108 WstValueTable.Column [] columns = loadColumns(session, wst_id); | 108 WstValueTable.Column [] columns = loadColumns(session, wst_id); |
109 int [] map = loadQRangesMap(session, columns, wst_id); | 109 loadQRanges(session, columns, wst_id); |
110 List<WstValueTable.Row> rows = loadRows(session, wst_id, columns.length, map); | 110 List<WstValueTable.Row> rows = loadRows(session, wst_id, columns.length); |
111 | 111 |
112 WstValueTable valueTable = new WstValueTable(columns, rows); | 112 WstValueTable valueTable = new WstValueTable(columns, rows); |
113 | 113 |
114 if (valueTable != null && cacheKey != null) { | 114 if (valueTable != null && cacheKey != null) { |
115 log.debug("Store wst value table in cache"); | 115 log.debug("Store wst value table in cache"); |
210 return null; | 210 return null; |
211 } | 211 } |
212 | 212 |
213 WstValueTable.Column [] columns = loadColumns(session, wst); | 213 WstValueTable.Column [] columns = loadColumns(session, wst); |
214 | 214 |
215 int map [] = loadQRangesMap(session, columns, wst); | 215 loadQRanges(session, columns, wst); |
216 | 216 |
217 List<WstValueTable.Row> rows = | 217 List<WstValueTable.Row> rows = loadRows(session, wst, columns.length); |
218 loadRows(session, wst.getId(), columns.length, map); | |
219 | 218 |
220 return new WstValueTable(columns, rows); | 219 return new WstValueTable(columns, rows); |
221 } | 220 } |
222 | 221 |
223 /** | 222 /** |
281 protected static List<WstValueTable.Row> loadRows( | 280 protected static List<WstValueTable.Row> loadRows( |
282 Session session, | 281 Session session, |
283 int wst_id, | 282 int wst_id, |
284 int numColumns | 283 int numColumns |
285 ) { | 284 ) { |
286 return loadRows(session, wst_id, numColumns, null); | |
287 } | |
288 | |
289 protected static List<WstValueTable.Row> loadRows( | |
290 Session session, | |
291 int wst_id, | |
292 int numColumns, | |
293 int [] map | |
294 ) { | |
295 SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT_WS) | 285 SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT_WS) |
296 .addScalar("km", StandardBasicTypes.DOUBLE) | 286 .addScalar("km", StandardBasicTypes.DOUBLE) |
297 .addScalar("w", StandardBasicTypes.DOUBLE) | 287 .addScalar("w", StandardBasicTypes.DOUBLE) |
298 .addScalar("column_pos", StandardBasicTypes.INTEGER); | 288 .addScalar("column_pos", StandardBasicTypes.INTEGER); |
299 | 289 |
314 WstValueTable.Row row = | 304 WstValueTable.Row row = |
315 new WstValueTable.Row((Double)result[0], ws); | 305 new WstValueTable.Row((Double)result[0], ws); |
316 rows.add(row); | 306 rows.add(row); |
317 } | 307 } |
318 Double w = (Double)result[1]; | 308 Double w = (Double)result[1]; |
319 int index = map != null ? map[column] : column; | 309 ws[column] = w != null ? w : Double.NaN; |
320 ws[index] = w != null ? w : Double.NaN; | |
321 lastColumn = column; | 310 lastColumn = column; |
322 } | 311 } |
323 | 312 |
324 rows.trimToSize(); | 313 rows.trimToSize(); |
325 return rows; | 314 return rows; |
404 QRangeTree qRangeTree = new QRangeTree( | 393 QRangeTree qRangeTree = new QRangeTree( |
405 qRanges, QRangeTree.WITHOUT_COLUMN, 0, qSize); | 394 qRanges, QRangeTree.WITHOUT_COLUMN, 0, qSize); |
406 columns[0].setQRangeTree(qRangeTree); | 395 columns[0].setQRangeTree(qRangeTree); |
407 } | 396 } |
408 | 397 |
409 protected static int [] loadQRangesMap( | 398 protected static void loadQRanges( |
410 Session session, | 399 Session session, |
411 WstValueTable.Column [] columns, | 400 WstValueTable.Column [] columns, |
412 int wst_id | 401 int wst_id |
413 ) { | 402 ) { |
414 SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT_QS) | 403 SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT_QS) |
443 if (start != -1) { | 432 if (start != -1) { |
444 QRangeTree qRangeTree = new QRangeTree(qRanges, start, Q); | 433 QRangeTree qRangeTree = new QRangeTree(qRanges, start, Q); |
445 columns[lastColumn].setQRangeTree(qRangeTree); | 434 columns[lastColumn].setQRangeTree(qRangeTree); |
446 } | 435 } |
447 | 436 |
448 return sortColumnsByAverageQ(columns); | |
449 | |
450 /* This is debug code to visualize the q ranges trees | 437 /* This is debug code to visualize the q ranges trees |
451 | 438 |
452 java.io.PrintWriter out = null; | 439 java.io.PrintWriter out = null; |
453 try { | 440 try { |
454 out = new java.io.PrintWriter( | 441 out = new java.io.PrintWriter( |
475 } | 462 } |
476 } | 463 } |
477 */ | 464 */ |
478 } | 465 } |
479 | 466 |
480 private static final class QIndex implements Comparable<QIndex> { | 467 protected static void loadQRanges( |
481 double q; | |
482 int index; | |
483 | |
484 QIndex(double q, int index) { | |
485 this.q = q; | |
486 this.index = index; | |
487 } | |
488 | |
489 @Override | |
490 public int compareTo(QIndex other) { | |
491 double diff = q - other.q; | |
492 if (diff < 0d) return -1; | |
493 if (diff > 0d) return +1; | |
494 return 0; | |
495 } | |
496 } // class QIndex | |
497 | |
498 /** Ensure that the q colums are sorted in ascending order. */ | |
499 protected static int [] sortColumnsByAverageQ(WstValueTable.Column [] columns) { | |
500 QIndex [] order = new QIndex[columns.length]; | |
501 for (int i = 0; i < order.length; ++i) { | |
502 QRangeTree tree = columns[i].getQRangeTree(); | |
503 double avg = tree.averageQ(); | |
504 double max = tree.maxQ(); | |
505 double q = (avg+max)*0.5d; | |
506 order[i] = new QIndex(q, i); | |
507 } | |
508 Arrays.sort(order); | |
509 WstValueTable.Column [] copy = new WstValueTable.Column[order.length]; | |
510 int [] map = new int[order.length]; | |
511 for (int i = 0; i < copy.length; ++i) { | |
512 copy[i] = columns[order[i].index]; | |
513 map[order[i].index] = i; | |
514 } | |
515 System.arraycopy(copy, 0, columns, 0, order.length); | |
516 return map; | |
517 } | |
518 | |
519 protected static int [] loadQRangesMap( | |
520 Session session, | 468 Session session, |
521 WstValueTable.Column [] columns, | 469 WstValueTable.Column [] columns, |
522 Wst wst | 470 Wst wst |
523 ) { | 471 ) { |
524 return loadQRangesMap(session, columns, wst.getId()); | 472 loadQRanges(session, columns, wst.getId()); |
525 } | 473 } |
526 | 474 |
527 } | 475 } |
528 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : | 476 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |