# HG changeset patch # User Andre Heinecke # Date 1424087738 -3600 # Node ID 04367906f1584d184593f8c112d6a65baec330c0 # Parent 522f72f43ae695aae78e844dd468be7b957ba399 (issue1754) Add distantce handling to WINFO differences state diff -r 522f72f43ae6 -r 04367906f158 artifacts/doc/conf/artifacts/winfo.xml --- 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 @@ - + @@ -63,6 +63,12 @@ + + + + + + diff -r 522f72f43ae6 -r 04367906f158 artifacts/src/main/java/org/dive4elements/river/artifacts/StaticWKmsArtifact.java --- 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. diff -r 522f72f43ae6 -r 04367906f158 artifacts/src/main/java/org/dive4elements/river/artifacts/model/StaticWQKmsCacheKey.java --- 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 : diff -r 522f72f43ae6 -r 04367906f158 artifacts/src/main/java/org/dive4elements/river/artifacts/model/WKmsFactory.java --- 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); diff -r 522f72f43ae6 -r 04367906f158 artifacts/src/main/java/org/dive4elements/river/artifacts/states/WDifferencesState.java --- 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";