changeset 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 93a31cfb18c0
children 94cddb00f934
files artifacts/src/main/java/org/dive4elements/river/artifacts/model/QRangeTree.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/WstValueTableFactory.java
diffstat 2 files changed, 8 insertions(+), 70 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/QRangeTree.java	Thu Apr 23 19:13:33 2015 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/QRangeTree.java	Thu Apr 23 19:20:40 2015 +0200
@@ -278,16 +278,6 @@
         return parent;
     }
 
-    public double averageQ() {
-        double sum = 0d;
-        int n = 0;
-        for (Node node = head(); node != null; node = node.next) {
-            sum += node.q;
-            ++n;
-        }
-        return sum/n;
-    }
-
     public double maxQ() {
         double max = -Double.MAX_VALUE;
         for (Node node = head(); node != null; node = node.next) {
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/WstValueTableFactory.java	Thu Apr 23 19:13:33 2015 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/WstValueTableFactory.java	Thu Apr 23 19:20:40 2015 +0200
@@ -106,8 +106,8 @@
         // Fetch data for one column only.
 
         WstValueTable.Column [] columns = loadColumns(session, wst_id);
-        int [] map = loadQRangesMap(session, columns, wst_id);
-        List<WstValueTable.Row> rows = loadRows(session, wst_id, columns.length, map);
+        loadQRanges(session, columns, wst_id);
+        List<WstValueTable.Row> rows = loadRows(session, wst_id, columns.length);
 
         WstValueTable valueTable = new WstValueTable(columns, rows);
 
@@ -212,10 +212,9 @@
 
         WstValueTable.Column [] columns = loadColumns(session, wst);
 
-        int map [] = loadQRangesMap(session, columns, wst);
+        loadQRanges(session, columns, wst);
 
-        List<WstValueTable.Row> rows =
-            loadRows(session, wst.getId(), columns.length, map);
+        List<WstValueTable.Row> rows = loadRows(session, wst, columns.length);
 
         return new WstValueTable(columns, rows);
     }
@@ -283,15 +282,6 @@
         int     wst_id,
         int     numColumns
     ) {
-        return loadRows(session, wst_id, numColumns, null);
-    }
-
-    protected static List<WstValueTable.Row> loadRows(
-        Session session,
-        int     wst_id,
-        int     numColumns,
-        int []  map
-    ) {
         SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT_WS)
             .addScalar("km",         StandardBasicTypes.DOUBLE)
             .addScalar("w",          StandardBasicTypes.DOUBLE)
@@ -316,8 +306,7 @@
                 rows.add(row);
             }
             Double w = (Double)result[1];
-            int index = map != null ? map[column] : column;
-            ws[index] = w != null ? w : Double.NaN;
+            ws[column] = w != null ? w : Double.NaN;
             lastColumn = column;
         }
 
@@ -406,7 +395,7 @@
         columns[0].setQRangeTree(qRangeTree);
     }
 
-    protected static int [] loadQRangesMap(
+    protected static void loadQRanges(
         Session                 session,
         WstValueTable.Column [] columns,
         int                     wst_id
@@ -445,8 +434,6 @@
             columns[lastColumn].setQRangeTree(qRangeTree);
         }
 
-        return sortColumnsByAverageQ(columns);
-
         /* This is debug code to visualize the q ranges trees
 
         java.io.PrintWriter out = null;
@@ -477,51 +464,12 @@
         */
     }
 
-    private static final class QIndex implements Comparable<QIndex> {
-        double q;
-        int    index;
-
-        QIndex(double q, int index) {
-            this.q     = q;
-            this.index = index;
-        }
-
-        @Override
-        public int compareTo(QIndex other) {
-            double diff = q - other.q;
-            if (diff < 0d) return -1;
-            if (diff > 0d) return +1;
-            return 0;
-        }
-    } // class QIndex
-
-    /** Ensure that the q colums are sorted in ascending order. */
-    protected static int [] sortColumnsByAverageQ(WstValueTable.Column [] columns) {
-        QIndex [] order = new QIndex[columns.length];
-        for (int i = 0; i < order.length; ++i) {
-            QRangeTree tree = columns[i].getQRangeTree();
-            double avg = tree.averageQ();
-            double max = tree.maxQ();
-            double q   = (avg+max)*0.5d;
-            order[i] = new QIndex(q, i);
-        }
-        Arrays.sort(order);
-        WstValueTable.Column [] copy = new WstValueTable.Column[order.length];
-        int [] map = new int[order.length];
-        for (int i = 0; i < copy.length; ++i) {
-            copy[i] = columns[order[i].index];
-            map[order[i].index] = i;
-        }
-        System.arraycopy(copy, 0, columns, 0, order.length);
-        return map;
-    }
-
-    protected static int [] loadQRangesMap(
+    protected static void loadQRanges(
         Session                 session,
         WstValueTable.Column [] columns,
         Wst                     wst
     ) {
-        return loadQRangesMap(session, columns, wst.getId());
+        loadQRanges(session, columns, wst.getId());
     }
 
 }

http://dive4elements.wald.intevation.org