Mercurial > dive4elements > river
changeset 9625:07f02019065e
Nachtrag Pos. 20: infrastructure query added, calculation updated for extended access class
author | mschaefer |
---|---|
date | Mon, 14 Oct 2019 08:14:58 +0200 |
parents | 02ca823ec9c6 |
children | ad852be69900 |
files | artifacts/doc/conf/meta-data.xml artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculation.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java backend/src/main/java/org/dive4elements/river/model/sinfo/Infrastructure.java backend/src/main/java/org/dive4elements/river/model/sinfo/InfrastructureValue.java |
diffstat | 5 files changed, 114 insertions(+), 38 deletions(-) [+] |
line wrap: on
line diff
--- a/artifacts/doc/conf/meta-data.xml Fri Oct 11 18:30:36 2019 +0200 +++ b/artifacts/doc/conf/meta-data.xml Mon Oct 14 08:14:58 2019 +0200 @@ -1418,23 +1418,84 @@ <dc:macro name="predefined_infrastructures"> <infrastructures TODO="i10n"> <dc:context connection="system"> - <dc:statement> - SELECT * - FROM infrastructure - WHERE river_id = ${river_id} - </dc:statement> - <dc:group expr="$group_id"> - <infrastructure_group description="{dc:group-key()}"> - <dc:for-each> - <!-- name="{$annotation_type_id}" --> - <!-- not necessary: target_out="{$out}" --> - <infrastructure_type description="{$FILENAME}" factory="FAKE_FACTORY" group_label="{$group_id}" group_id="{$group_id}" type_id="{$annotation_type_id}" type_label="{$annotation_type_id}" /> - </dc:for-each> - </infrastructure_group> - </dc:group> + <!--dc:choose> + <dc:when test="dc:contains($riverside, 'left')"> + <dc:call-macro name="infrastructures_leftside_statement" /> + <dc:call-macro name="infrastructures_groups_fill" /> + </dc:when> + <dc:when test="dc:contains($riverside, 'right')"> + <dc:call-macro name="infrastructures_rightside_statement" /> + <dc:call-macro name="infrastructures_groups_fill" /> + </dc:when> + <dc:otherwise> + <dc:call-macro name="infrastructures_bothsides_statement" /> + <dc:call-macro name="infrastructures_groups_fill" /> + </dc:otherwise> + </dc:choose--> + <dc:call-macro name="infrastructures_bothsides_statement" /> + <dc:call-macro name="infrastructures_groups_fill" /> </dc:context> </infrastructures> </dc:macro> + + <dc:macro name="infrastructures_groups_fill"> + <dc:group expr="$group_label"> + <infrastructure_group name="{dc:group-key()}" description="{dc:group-key()}"> + <dc:for-each> + <!-- name="{$annotation_type_id}" --> + <!-- not necessary: target_out="{$out}" --> + <infrastructure_type name="{$type_label}" description="{$filename}" factory="FAKE_FACTORY" group_label="{$group_label}" group_id="{$group_id}" type_id="{$type_id}" type_label="{$type_label}" /> + </dc:for-each> + </infrastructure_group> + </dc:group> + </dc:macro> + + <dc:macro name="infrastructures_leftside_statement"> + <dc:statement> + SELECT s.id, MIN(s.filename) AS filename, MIN(s.group_id) AS group_id, MIN(g.name) AS group_label, + MIN(s.annotation_type_id) AS type_id, MIN(t.name) AS type_label + FROM (((infrastructure AS s INNER JOIN infrastructure_values AS v ON v.infrastructure_id = s.id) + INNER JOIN annotation_types AS g ON s.group_id = g.id) + INNER JOIN annotation_types AS t ON s.annotation_type_id = t.id) + INNER JOIN attributes AS rs ON v.attribute_id = rs.id + WHERE (s.river_id = ${river_id}) + AND (v.station BETWEEN ${fromkm}-0.0001 AND ${tokm}+0.0001) + AND (lower(rs.value) = 'links') + GROUP BY s.id + ORDER BY MIN(g.name), MIN(t.name) + </dc:statement> + </dc:macro> + + <dc:macro name="infrastructures_rightside_statement"> + <dc:statement> + SELECT s.id, MIN(s.filename) AS filename, MIN(s.group_id) AS group_id, MIN(g.name) AS group_label, + MIN(s.annotation_type_id) AS type_id, MIN(t.name) AS type_label + FROM (((infrastructure AS s INNER JOIN infrastructure_values AS v ON v.infrastructure_id = s.id) + INNER JOIN annotation_types AS g ON s.group_id = g.id) + INNER JOIN annotation_types AS t ON s.annotation_type_id = t.id) + INNER JOIN attributes AS rs ON v.attribute_id = rs.id + WHERE (s.river_id = ${river_id}) + AND (v.station BETWEEN ${fromkm}-0.0001 AND ${tokm}+0.0001) + AND (lower(rs.value) = 'rechts') + GROUP BY s.id + ORDER BY MIN(g.name), MIN(t.name) + </dc:statement> + </dc:macro> + + <dc:macro name="infrastructures_bothsides_statement"> + <dc:statement> + SELECT s.id, MIN(s.filename) AS filename, MIN(s.group_id) AS group_id, MIN(g.name) AS group_label, + MIN(s.annotation_type_id) AS type_id, MIN(t.name) AS type_label + FROM (((infrastructure AS s INNER JOIN infrastructure_values AS v ON v.infrastructure_id = s.id) + INNER JOIN annotation_types AS g ON s.group_id = g.id) + INNER JOIN annotation_types AS t ON s.annotation_type_id = t.id) + INNER JOIN attributes AS rs ON v.attribute_id = rs.id + WHERE (s.river_id = ${river_id}) + AND (v.station BETWEEN ${fromkm}-0.0001 AND ${tokm}+0.0001) + GROUP BY s.id + ORDER BY MIN(g.name), MIN(t.name) + </dc:statement> + </dc:macro> <!-- wst-data -->
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculation.java Fri Oct 11 18:30:36 2019 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculation.java Mon Oct 14 08:14:58 2019 +0200 @@ -10,7 +10,6 @@ package org.dive4elements.river.artifacts.sinfo.flood_duration; import java.util.List; -import java.util.Set; import org.apache.commons.lang.math.DoubleRange; import org.dive4elements.artifacts.CallContext; @@ -26,7 +25,6 @@ import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; import org.dive4elements.river.model.River; -import org.dive4elements.river.model.sinfo.Infrastructure; /** * Calculation of the flood durations of the infrastructures of the km range of a river @@ -78,14 +76,13 @@ final FloodDurationCalculator calculator = new FloodDurationCalculator(this.context, riverInfoProvider); - // FIXME: fetch from access (fetchInfrastructureTypes only for test purposes) - final List<Element> infrastructureChoicesnew = access.getInfrastructureChoices(); - // int groupID =; - // int annottionTypeId =; + final List<Element> infrastructureChoices = access.getInfrastructureChoices(); - // Deprecated denke ich. - final Set<String> infrastructureChoices = Infrastructure.fetchInfrastructureTypes(riverInfoProvider.getRiver(), calcRange.getMinimumDouble(), - calcRange.getMaximumDouble(), access.getRiverside().getAttributeKey()); + /* + * zum testen: + * final Set<String> infrastructureChoicesTest = Infrastructure.fetchInfrastructureTypes(riverInfoProvider.getRiver(), + * calcRange.getMinimumDouble(), calcRange.getMaximumDouble(), access.getRiverside().getAttributeKey()); + */ calculator.execute(problems, label, calcRange, access.getRiverside().getAttributeKey(), infrastructureChoices, access.getIsWspl(), winfo, results); }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java Fri Oct 11 18:30:36 2019 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java Mon Oct 14 08:14:58 2019 +0200 @@ -33,6 +33,7 @@ import org.dive4elements.river.artifacts.model.river.RiverInfoProvider; import org.dive4elements.river.artifacts.sinfo.common.GaugeDurationValuesFinder; import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; +import org.dive4elements.river.artifacts.sinfo.flood_duration.InfrastructureServerClientXChange.Element; import org.dive4elements.river.exports.WaterlevelDescriptionBuilder; import org.dive4elements.river.model.Attribute.AttributeKey; import org.dive4elements.river.model.Gauge; @@ -67,7 +68,7 @@ * Calculate the infrastructures flood duration result rows */ public void execute(final Calculation problems, final String label, final DoubleRange calcRange, final AttributeKey riverside, - final Set<String> infrastructureChoices, final boolean withWspl, final WINFOArtifact winfo, final FloodDurationCalculationResults results) { + final List<Element> infrastructureChoices, final boolean withWspl, final WINFOArtifact winfo, final FloodDurationCalculationResults results) { // Find all gauges of the calc range, and create the duration finders final Map<Gauge, GaugeDurationValuesFinder> durFinders = new HashMap<>(); @@ -76,8 +77,11 @@ } // Find all infrastructures within the calc range + final Set<String> choices = new HashSet<>(); + for (final Element ifch : infrastructureChoices) + choices.add(ifch.getGroupLabel() + "\t" + ifch.getTypeLabel()); final List<InfrastructureValue> infras = InfrastructureValue.getValues(this.riverInfoProvider.getRiver(), calcRange.getMinimumDouble(), - calcRange.getMaximumDouble(), riverside, infrastructureChoices); + calcRange.getMaximumDouble(), riverside, choices); // Merge all stations (range/step, borders of gauge ranges, infrastructures) // final Map<Double, InfrastructureValue> allStations = new HashMap<>();
--- a/backend/src/main/java/org/dive4elements/river/model/sinfo/Infrastructure.java Fri Oct 11 18:30:36 2019 +0200 +++ b/backend/src/main/java/org/dive4elements/river/model/sinfo/Infrastructure.java Mon Oct 14 08:14:58 2019 +0200 @@ -71,11 +71,13 @@ private List<InfrastructureValue> values; + /***** CONSTRUCTORS *****/ public Infrastructure() { } + public Infrastructure(final River river, final String filename, final String kmrange_info, final String notes, final AnnotationType type, final AnnotationType group, final Integer year, final String dataprovider, final String evaluation_by) { this.river = river; @@ -90,6 +92,7 @@ this.values = new ArrayList<>(); } + /***** METHODS *****/ @Id @@ -230,8 +233,8 @@ * Fetches from the database the infrastructure groups and types of a river's km range and river side(s) * as tab-separated strings ordered by the infrastructure group, then the type */ - @Deprecated - public static Set<String> fetchInfrastructureTypes(final River river, final double kmLo, final double kmHi, final AttributeKey riverside) { + public static Set<String> fetchInfrastructureTypes(final River river, final double kmLo, final double kmHi, + final AttributeKey riverside) { final Set<String> groupTypes = new HashSet<>(); for (final Infrastructure ifs : fetchInfrastructureTypeList(river, kmLo, kmHi, riverside)) groupTypes.add(ifs.getGroup().getName() + "\t" + ifs.getType().getName()); @@ -242,13 +245,18 @@ * Fetches from the database the list of infrastructure types of a river's km range and river side(s) * ordered by type group */ - private static List<Infrastructure> fetchInfrastructureTypeList(final River river, final double kmLo, final double kmHi, final AttributeKey riverside) { + private static List<Infrastructure> fetchInfrastructureTypeList(final River river, final double kmLo, final double kmHi, + final AttributeKey riverside) { final Session session = SessionHolder.HOLDER.get(); - final Query query = session.createQuery("FROM Infrastructure" + " WHERE (river=:river)" - + " AND (id IN (SELECT v.infrastructure.id FROM InfrastructureValue v" + " WHERE (v.station BETWEEN (:kmLo - 0.0001) AND (:kmHi + 0.0001))" - + InfrastructureValue.getRiversideClause(riverside, "v.", "attr_id") + "))" + " ORDER BY group, type"); + final Query query = session.createQuery("FROM Infrastructure" + + " WHERE (river=:river)" + + " AND (id IN (SELECT v.infrastructure.id FROM InfrastructureValue v" + + " WHERE (v.station BETWEEN (:kmLo - 0.0001) AND (:kmHi + 0.0001))" + + InfrastructureValue.getRiversideClause(riverside, "v.", "attr_id") + + "))" + + " ORDER BY group, type"); query.setParameter("river", river); query.setParameter("kmLo", new Double(kmLo)); query.setParameter("kmHi", new Double(kmHi));
--- a/backend/src/main/java/org/dive4elements/river/model/sinfo/InfrastructureValue.java Fri Oct 11 18:30:36 2019 +0200 +++ b/backend/src/main/java/org/dive4elements/river/model/sinfo/InfrastructureValue.java Mon Oct 14 08:14:58 2019 +0200 @@ -32,6 +32,7 @@ import org.hibernate.Query; import org.hibernate.Session; + /** * Hibernate binding for the DB table infrastructure_values * @@ -56,6 +57,7 @@ private Double height; + /***** CONSTRUCTORS *****/ public InfrastructureValue() { @@ -75,6 +77,7 @@ this(infrastructure, Double.valueOf(km), attribute, Double.valueOf(height)); } + /***** METHODS *****/ @Id @@ -137,8 +140,8 @@ */ public static List<InfrastructureValue> getValues(final Infrastructure parent, final double kmLo, final double kmHi) { final Session session = SessionHolder.HOLDER.get(); - final Query query = session - .createQuery("FROM InfrastructureValue WHERE (infrastructure=:parent)" + " AND (station >= :kmLo - 0.0001) AND (station <= :kmHi + 0.0001)"); + final Query query = session.createQuery("FROM InfrastructureValue WHERE (infrastructure=:parent)" + + " AND (station >= :kmLo - 0.0001) AND (station <= :kmHi + 0.0001)"); query.setParameter("parent", parent); query.setParameter("kmLo", new Double(kmLo)); query.setParameter("kmHi", new Double(kmHi)); @@ -151,9 +154,12 @@ public static List<InfrastructureValue> getValues(final River river, final double kmLo, final double kmHi, final AttributeKey riverside, final Set<String> groupTypes) { final Session session = SessionHolder.HOLDER.get(); - final Query query = session - .createQuery("FROM InfrastructureValue" + " WHERE (infrastructure.river=:river)" + " AND (station BETWEEN :kmLo - 0.0001 AND :kmHi + 0.0001)" - + getRiversideClause(riverside, "", "attr_id") + getGroupTypeClause(groupTypes, "") + " ORDER BY station, attribute.id"); + final Query query = session.createQuery("FROM InfrastructureValue" + + " WHERE (infrastructure.river=:river)" + + " AND (station BETWEEN :kmLo - 0.0001 AND :kmHi + 0.0001)" + + getRiversideClause(riverside, "", "attr_id") + + getGroupTypeClause(groupTypes, "") + + " ORDER BY station, attribute.id"); query.setParameter("river", river); query.setParameter("kmLo", new Double(kmLo)); query.setParameter("kmHi", new Double(kmHi)); @@ -171,8 +177,8 @@ String clause = " AND ("; String sep = ""; for (final String groupType : groupTypes) { - clause += sep + "(" + tableprefix + "infrastructure.group.name='" + groupType.split("\t")[0] + "'" + " AND " + tableprefix - + "infrastructure.type.name='" + groupType.split("\t")[1] + "')"; + clause += sep + "(" + tableprefix + "infrastructure.group.name='" + groupType.split("\t")[0] + "'" + + " AND " + tableprefix + "infrastructure.type.name='" + groupType.split("\t")[1] + "')"; sep = " OR "; } if (sep.length() >= 1)