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 :

http://dive4elements.wald.intevation.org