changeset 8547:04367906f158

(issue1754) Add distantce handling to WINFO differences state
author Andre Heinecke <andre.heinecke@intevation.de>
date Mon, 16 Feb 2015 12:55:38 +0100
parents 522f72f43ae6
children 0011508d2f9d
files artifacts/doc/conf/artifacts/winfo.xml artifacts/src/main/java/org/dive4elements/river/artifacts/StaticWKmsArtifact.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/StaticWQKmsCacheKey.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/WKmsFactory.java artifacts/src/main/java/org/dive4elements/river/artifacts/states/WDifferencesState.java
diffstat 5 files changed, 67 insertions(+), 82 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/doc/conf/artifacts/winfo.xml	Mon Feb 16 11:30:27 2015 +0100
+++ b/artifacts/doc/conf/artifacts/winfo.xml	Mon Feb 16 12:55:38 2015 +0100
@@ -47,7 +47,7 @@
 
         <transition transition="org.dive4elements.river.artifacts.transitions.ValueCompareTransition">
             <from state="state.winfo.calculation_mode"/>
-            <to state="state.winfo.waterlevel_pair_select"/>
+            <to state="state.winfo.distance_only"/>
             <condition data="calculation_mode" value="calc.w.differences" operator="equal"/>
         </transition>
 
@@ -63,6 +63,12 @@
             <condition data="calculation_mode" value="calc.extreme.curve" operator="equal"/>
         </transition>
 
+        <transition transition="org.dive4elements.river.artifacts.transitions.ValueCompareTransition">
+            <from state="state.winfo.distance_only"/>
+            <to state="state.winfo.waterlevel_pair_select"/>
+            <condition data="calculation_mode" value="calc.w.differences" operator="equal"/>
+        </transition>
+
         <transition transition="org.dive4elements.river.artifacts.transitions.DefaultTransition">
             <from state="state.winfo.waterlevel_pair_select"/>
             <to state="state.winfo.w_differences"/>
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/StaticWKmsArtifact.java	Mon Feb 16 11:30:27 2015 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/StaticWKmsArtifact.java	Mon Feb 16 12:55:38 2015 +0100
@@ -280,6 +280,14 @@
             Integer.parseInt(getDataAsString("wst_id")));
     }
 
+    public WKms getWKms(int idx, double from, double to) {
+        log.debug("StaticWKmsArtifact.getWKms");
+
+        return WKmsFactory.getWKms(
+            Integer.parseInt(getDataAsString("col_pos")),
+            Integer.parseInt(getDataAsString("wst_id")),
+            from, to);
+    }
 
     /**
      * Returns W at Km of WKms, linearly interpolated.
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/StaticWQKmsCacheKey.java	Mon Feb 16 11:30:27 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
- * Software engineering by Intevation GmbH
- *
- * This file is Free Software under the GNU AGPL (>=v3)
- * and comes with ABSOLUTELY NO WARRANTY! Check out the
- * documentation coming with Dive4Elements River for details.
- */
-
-package org.dive4elements.river.artifacts.model;
-
-import java.io.Serializable;
-
-/**
- * Caching-Key object for 'static' wst- data.
- */
-public final class StaticWQKmsCacheKey
-implements         Serializable
-{
-    public static final String CACHE_NAME = "wst-wq-value-table-static";
-
-    private int column;
-    private int wst_id;
-
-    public StaticWQKmsCacheKey(int column, int wst_id) {
-        this.wst_id  = wst_id;
-        this.column  = column;
-    }
-
-    public int hashCode() {
-        return (wst_id << 8) | column;
-    }
-
-    public boolean equals(Object other) {
-        if (!(other instanceof StaticWQKmsCacheKey)) {
-            return false;
-        }
-        StaticWQKmsCacheKey o = (StaticWQKmsCacheKey) other;
-        return this.wst_id == o.wst_id && this.column == o.column;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/WKmsFactory.java	Mon Feb 16 11:30:27 2015 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/WKmsFactory.java	Mon Feb 16 12:55:38 2015 +0100
@@ -39,6 +39,11 @@
         "SELECT km, w FROM wst_w_values " +
         "WHERE wst_id = :wst_id AND column_pos = :column_pos";
 
+    public static final String SQL_SELECT_WS_FOR_RANGE =
+        "SELECT km, w FROM wst_w_values " +
+        "WHERE wst_id = :wst_id AND column_pos = :column_pos " +
+        "AND km BETWEEN :kmfrom AND :kmto";
+
     /** Query to get name for wst_id and column_pos. */
     public static final String SQL_SELECT_NAME =
         "SELECT name " +
@@ -82,31 +87,26 @@
     private WKmsFactory() {
     }
 
+    public static WKms getWKms(int column, int wst_id, double from, double to) {
+        log.debug("WKmsFactory.getWKms");
+        Cache cache = CacheFactory.getCache("waterlevels-static");
 
-    /**
-     * Get WKms for given column and wst_id, caring about the cache.
-     */
-    public static WKms getWKms(int column, int wst_id) {
-        log.debug("WKmsFactory.getWKms");
-        Cache cache = CacheFactory.getCache(StaticWKmsCacheKey.CACHE_NAME);
-
-        StaticWKmsCacheKey cacheKey;
+        String cacheKey = Integer.toString(column) + ":" + Integer.toString(wst_id);
 
         if (cache != null) {
-            cacheKey = new StaticWKmsCacheKey(wst_id, column);
+            if (!Double.isNaN(from) && ! Double.isNaN(to)) {
+                cacheKey += ":" + Double.toString(from) + ":" + Double.toString(to);
+            }
             Element element = cache.get(cacheKey);
             if (element != null) {
                 log.debug("Got static wst values from cache");
                 return (WKms)element.getValue();
             }
         }
-        else {
-            cacheKey = null;
-        }
 
-        WKms values = getWKmsUncached(column, wst_id);
+        WKms values = getWKmsUncached(column, wst_id, from, to);
 
-        if (values != null && cacheKey != null) {
+        if (values != null && cache != null) {
             log.debug("Store static wst values in cache.");
             Element element = new Element(cacheKey, values);
             cache.put(element);
@@ -114,6 +114,13 @@
         return values;
     }
 
+    /**
+     * Get WKms for given column and wst_id, caring about the cache.
+     */
+    public static WKms getWKms(int column, int wst_id) {
+        return getWKms(column, wst_id, Double.NaN, Double.NaN);
+    }
+
     /** Get name for a WKms wrapped in W, if suitable. */
     public static String getWKmsNameWWrapped(int wst_id) {
         return getWKmsNameWWrapped(-1, wst_id);
@@ -210,7 +217,7 @@
      * @param wst_id database id of the wst
      * @return according WKms.
      */
-    public static WKms getWKmsUncached(int column, int wst_id) {
+    public static WKms getWKmsUncached(int column, int wst_id, double from, double to) {
 
         if (log.isDebugEnabled()) {
             log.debug("WKmsFactory.getWKmsUncached c/" + column + ", wst_id/" + wst_id);
@@ -219,9 +226,17 @@
         WKmsImpl wkms = new WKmsImpl(getWKmsName(column, wst_id));
 
         Session session = SessionHolder.HOLDER.get();
-        SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT_WS)
-            .addScalar("km", StandardBasicTypes.DOUBLE)
-            .addScalar("w",  StandardBasicTypes.DOUBLE);
+        SQLQuery sqlQuery;
+        if (Double.isNaN(from) || Double.isNaN(to)) {
+            sqlQuery = session.createSQLQuery(SQL_SELECT_WS);
+        } else {
+            sqlQuery = session.createSQLQuery(SQL_SELECT_WS_FOR_RANGE);
+            sqlQuery.setDouble("kmfrom", from);
+            sqlQuery.setDouble("kmto", to);
+        }
+
+        sqlQuery.addScalar("km", StandardBasicTypes.DOUBLE)
+                .addScalar("w",  StandardBasicTypes.DOUBLE);
         sqlQuery.setInteger("wst_id",     wst_id);
         sqlQuery.setInteger("column_pos", column);
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/states/WDifferencesState.java	Mon Feb 16 11:30:27 2015 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/states/WDifferencesState.java	Mon Feb 16 12:55:38 2015 +0100
@@ -19,6 +19,7 @@
 
 import org.dive4elements.artifacts.CallContext;
 import org.dive4elements.artifacts.Artifact;
+import org.dive4elements.river.artifacts.access.RangeAccess;
 import org.dive4elements.river.artifacts.ChartArtifact;
 import org.dive4elements.river.artifacts.D4EArtifact;
 import org.dive4elements.river.artifacts.FixationArtifact;
@@ -108,25 +109,12 @@
     /**
      * Access the data (wkms) of an artifact, coded in mingle.
      */
-    public WKms getWKms(String mingle, CallContext context) {
+    public WKms getWKms(String mingle, CallContext context, double from, double to) {
         log.debug("WDifferencesState.getWKms " + mingle);
         String[] def  = mingle.split(";");
         String   uuid = def[0];
         String   name = def[1];
         int      idx  = Integer.parseInt(def[2]);
-
-        if (name.startsWith("staticwkms")) {
-            StaticWKmsArtifact staticWKms =
-                (StaticWKmsArtifact) RiverUtils.getArtifact(
-                    uuid,
-                    context);
-            log.debug("WDifferencesState obtain data from StaticWKms");
-            WKms wkms = staticWKms.getWKms(idx);
-            if (wkms == null)
-                log.error("No WKms from artifact.");
-            return wkms;
-        }
-
         D4EArtifact d4eArtifact = RiverUtils.getArtifact(
             uuid,
             context);
@@ -136,7 +124,16 @@
             return null;
         }
 
-        if (d4eArtifact instanceof WINFOArtifact) {
+        if (d4eArtifact instanceof StaticWKmsArtifact) {
+            StaticWKmsArtifact staticWKms = (StaticWKmsArtifact) d4eArtifact;
+            log.debug("WDifferencesState obtain data from StaticWKms");
+            WKms wkms = staticWKms.getWKms(idx, from, to);
+            if (wkms == null) {
+                log.error("No WKms from Static artifact for this range.");
+                return new WQKms();
+            }
+            return wkms;
+        } else if (d4eArtifact instanceof WINFOArtifact) {
             log.debug("Get WKms from WINFOArtifact");
             WINFOArtifact flys = (WINFOArtifact) d4eArtifact;
 
@@ -150,13 +147,11 @@
                 return new WQKms();
             }
             return wkms[idx];
-        }
-        else if (d4eArtifact instanceof MINFOArtifact) {
+        } else if (d4eArtifact instanceof MINFOArtifact) {
             log.warn("Get WKms from MINFOArtifact not implemented!");
 //            CalculationResult r = (CalculationResult)
 //                d4eArtifact.compute(context, ComputeType.ADVANCE, false);
-        }
-        else if (d4eArtifact instanceof FixationArtifact) {
+        } else if (d4eArtifact instanceof FixationArtifact) {
             log.debug ("Get WKms from FixationArtifact.");
             CalculationResult r = (CalculationResult)
                 d4eArtifact.compute(context, ComputeType.ADVANCE, false);
@@ -188,7 +183,9 @@
         }
         WINFOArtifact winfo = (WINFOArtifact) artifact;
         String id = getID();
-
+        RangeAccess rangeAccess = new RangeAccess(artifact);
+        double from = rangeAccess.getFrom();
+        double to = rangeAccess.getTo();
         // Load the Artifacts/facets that we want to subtract and display.
         // Expected format is:
         // [42537f1e-3522-42ef-8968-635b03d8e9c6;longitudinal_section.w;0]#[1231f2-....]
@@ -213,9 +210,9 @@
             // e.g.:
             // 42537f1e-3522-42ef-8968-635b03d8e9c6;longitudinal_section.w;1
             WKms minuendWKms = getWKms(StringUtil.unbracket(datas[i+0]),
-                context);
+                context, from, to);
             WKms subtrahendWKms = getWKms(StringUtil.unbracket(datas[i+1]),
-                context);
+                context, from, to);
 
             String facetName = "diff ()";
             String minName = "min";

http://dive4elements.wald.intevation.org