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 :

http://dive4elements.wald.intevation.org