Mercurial > dive4elements > river
changeset 8544:76113b975829
(Issue1754) Make BedDifference calculation range dependent.
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Fri, 13 Feb 2015 16:17:46 +0100 |
parents | 9a5b3079aad4 |
children | c6723e5b6857 |
files | artifacts/doc/conf/artifacts/minfo.xml artifacts/doc/conf/meta-data.xml artifacts/src/main/java/org/dive4elements/river/artifacts/access/BedDifferencesAccess.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffCalculation.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedHeightFactory.java |
diffstat | 5 files changed, 60 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/artifacts/doc/conf/artifacts/minfo.xml Fri Feb 13 14:59:16 2015 +0100 +++ b/artifacts/doc/conf/artifacts/minfo.xml Fri Feb 13 16:17:46 2015 +0100 @@ -35,7 +35,7 @@ <transition transition="org.dive4elements.river.artifacts.transitions.ValueCompareTransition"> <from state="state.minfo.calculation_mode"/> - <to state="state.minfo.bed.difference_select"/> + <to state="state.minfo.distance_only"/> <condition data="calculation_mode" value="calc.bed.diff" operator="equal"/> </transition> @@ -45,7 +45,6 @@ <condition data="calculation_mode" value="calc.bed.quality" operator="equal"/> </transition> - <state id="state.minfo.distance_only" description="state.minfo.distance_only" state="org.dive4elements.river.artifacts.states.DistanceOnlySelect" helpText="help.state.minfo.distance_only"> <data name="ld_from" type="Double" /> <data name="ld_to" type="Double" /> @@ -72,6 +71,12 @@ <condition data="calculation_mode" value="calc.bed.middle" operator="equal"/> </transition> + <transition transition="org.dive4elements.river.artifacts.transitions.ValueCompareTransition"> + <from state="state.minfo.distance_only"/> + <to state="state.minfo.bed.difference_select"/> + <condition data="calculation_mode" value="calc.bed.diff" operator="equal"/> + </transition> + <transition transition="org.dive4elements.river.artifacts.transitions.DefaultTransition"> <from state="state.minfo.sq.location"/> <to state="state.minfo.sq.period"/>
--- a/artifacts/doc/conf/meta-data.xml Fri Feb 13 14:59:16 2015 +0100 +++ b/artifacts/doc/conf/meta-data.xml Fri Feb 13 16:17:46 2015 +0100 @@ -1873,8 +1873,9 @@ bhs.year FROM bed_height_single bhs JOIN bed_height_single_values bhsv - ON bhsv.bed_height_single_id = bhs.id - WHERE bhs.river_id = ${river_id}), + ON bhsv.bed_height_single_id = bhs.id + WHERE bhs.river_id = ${river_id} + AND bhsv.station BETWEEN ${fromkm} AND ${tokm}), csta AS (SELECT b1.id AS b1id, b1.description AS b1desc,
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/access/BedDifferencesAccess.java Fri Feb 13 14:59:16 2015 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/access/BedDifferencesAccess.java Fri Feb 13 16:17:46 2015 +0100 @@ -19,7 +19,7 @@ public class BedDifferencesAccess -extends RiverAccess +extends RangeAccess { private static Logger log = Logger.getLogger(BedDifferencesAccess.class);
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffCalculation.java Fri Feb 13 14:59:16 2015 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffCalculation.java Fri Feb 13 16:17:46 2015 +0100 @@ -37,10 +37,12 @@ this.river = access.getRiverName(); this.heightIds = access.extractHeightIds(context); + double fromKm = access.getFrom(); + double toKm = access.getTo(); BedDiffYearResult [] results = new BedDiffYearResult[heightIds.length]; for (int i = 0; i < heightIds.length; i++) { - BedHeightSingleData [] pair = getHeightPair(heightIds[i]); + BedHeightSingleData [] pair = getHeightPair(heightIds[i], fromKm, toKm); if (pair[0].getYear() == null || pair[1].getYear() == null) { addProblem("beddiff.missing.year"); } @@ -51,10 +53,10 @@ } /** Get two BedHeights from factory. */ - private static BedHeightSingleData [] getHeightPair(int [] ids) { + private static BedHeightSingleData [] getHeightPair(int [] ids, double from, double to) { return new BedHeightSingleData [] { - (BedHeightSingleData)BedHeightFactory.getHeight("single", ids[0]), - (BedHeightSingleData)BedHeightFactory.getHeight("single", ids[1]) + (BedHeightSingleData)BedHeightFactory.getHeight("single", ids[0], from, to), + (BedHeightSingleData)BedHeightFactory.getHeight("single", ids[1], from, to) }; }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedHeightFactory.java Fri Feb 13 14:59:16 2015 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedHeightFactory.java Fri Feb 13 16:17:46 2015 +0100 @@ -33,10 +33,16 @@ "SELECT bhsv.height, bhsv.station, bhsv.data_gap, bhsv.sounding_width," + " bhs.year, bhsv.width" + " FROM bed_height_single bhs" + - " JOIN bed_height_single_values bhsv on bhsv.bed_height_single_id = bhs.id" + + " JOIN bed_height_single_values bhsv on bhsv.bed_height_single_id = bhs.id"; + + public static final String ID_CLAUSE = " WHERE bhs.id = :height_id" + " ORDER BY bhsv.station"; + public static final String ID_STATION_CLAUSE = + " WHERE bhs.id = :height_id AND" + + " bhsv.station BETWEEN :fromkm AND :tokm" + + " ORDER BY bhsv.station"; /** Query to get name (description) for wst_id. */ public static final String SQL_SELECT_DESCR_SINGLE = @@ -46,17 +52,23 @@ private BedHeightFactory() { } - /** * Get BedHeightData for given type and height_id, caring about the cache. + * If from or to are NaN all values are returned. Otherwise only get + * values with stations between from and to. */ - public static BedHeightData getHeight(String type, int height_id) { + public static BedHeightData getHeight(String type, int height_id, double from, double to) { log.debug("BedHeightFactory.getHeight"); Cache cache = CacheFactory.getCache("bedheight-value-table-static"); - String cacheKey = Integer.toString(height_id); + String cacheKey = Integer.toString(height_id) + ":" + + Double.toString(from) + ":" + Double.toString(to); if (cache != null) { + /* We could be more intelligent here and reuse cached values for + * a complete river and filter the other stations out afterwards. + * It might even be better to cache all values first and filter + * later. */ Element element = cache.get(cacheKey); if (element != null) { log.debug("Got static bedheight values from cache"); @@ -67,7 +79,7 @@ cacheKey = null; } - BedHeightData values = getBedHeightUncached(type, height_id); + BedHeightData values = getBedHeightUncached(type, height_id, from, to); if (values != null && cacheKey != null) { log.debug("Store static bed height values in cache."); @@ -77,6 +89,13 @@ return values; } + /** + * Get BedHeightData for given type and height_id, caring about the cache. + */ + public static BedHeightData getHeight(String type, int height_id) { + return getHeight(type, height_id, Double.NaN, Double.NaN); + } + /** Get name for a BedHeight. */ public static String getHeightName(String type, int height_id) { log.debug("BedHeightFactory.getHeightName height_id/" + height_id); @@ -104,12 +123,19 @@ /** * Get BedHeightData from db. + * + * If from or to are negative all stations are returned. Otherwise + * only the values with a station betweend from and to. * @param height_id database id of the bed_height + * @param from minimum station value or NaN + * @param to maximum station value or NaN * @return according BedHeight. */ public static BedHeightData getBedHeightUncached( String type, - int height_id) + int height_id, + double from, + double to) { if (log.isDebugEnabled()) { log.debug("BedHeightFactory.getBedHeightUncached"); @@ -120,7 +146,13 @@ if (type.equals("single")) { BedHeightSingleData height = new BedHeightSingleData(getHeightName(type, height_id)); - sqlQuery = session.createSQLQuery(SQL_SELECT_SINGLE) + String queryString = SQL_SELECT_SINGLE; + if (Double.isNaN(from) || Double.isNaN(to)) { + queryString += ID_CLAUSE; + } else { + queryString += ID_STATION_CLAUSE; + } + sqlQuery = session.createSQLQuery(queryString) .addScalar("height", StandardBasicTypes.DOUBLE) .addScalar("station", StandardBasicTypes.DOUBLE) .addScalar("data_gap", StandardBasicTypes.DOUBLE) @@ -128,6 +160,10 @@ .addScalar("width", StandardBasicTypes.DOUBLE) .addScalar("year", StandardBasicTypes.INTEGER); sqlQuery.setInteger("height_id", height_id); + if (!Double.isNaN(from) && !Double.isNaN(to)) { + sqlQuery.setDouble("fromkm", from); + sqlQuery.setDouble("tokm", to); + } List<Object []> results = sqlQuery.list(); for (Object [] row: results) {