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)

http://dive4elements.wald.intevation.org