Mercurial > dive4elements > river
view backend/src/main/java/org/dive4elements/river/model/sinfo/Infrastructure.java @ 9620:26e113e8224f
Nachtrag Pos. 20: flood duration calculation for multiple infrastructure groups/types,
local class FloodDurationCalculationResult.Infrastructure renamed and extracted into own class
author | mschaefer |
---|---|
date | Thu, 10 Oct 2019 17:11:54 +0200 |
parents | d889ffe2fb05 |
children | 02ca823ec9c6 |
line wrap: on
line source
/* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde * Software engineering by * Björnsen Beratende Ingenieure GmbH * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt * * 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.model.sinfo; import java.io.Serializable; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import org.dive4elements.river.backend.SessionHolder; import org.dive4elements.river.model.AnnotationType; import org.dive4elements.river.model.Attribute.AttributeKey; import org.dive4elements.river.model.River; import org.hibernate.Query; import org.hibernate.Session; /** * Hibernate binding for the DB table infrastructure * * @author Matthias Schäfer * */ @Entity @Table(name = "infrastructure") public class Infrastructure implements Serializable { /***** FIELDS *****/ private static final long serialVersionUID = -5505080011501611034L; private Integer id; private River river; private String filename; private String kmrange_info; private String notes; private AnnotationType type; private AnnotationType group; private Integer year; private String dataprovider; private String evaluation_by; 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; this.filename = filename; this.kmrange_info = kmrange_info; this.notes = notes; this.type = type; this.group = group; this.year = year; this.dataprovider = dataprovider; this.evaluation_by = evaluation_by; this.values = new ArrayList<>(); } /***** METHODS *****/ @Id @SequenceGenerator(name = "SEQUENCE_INFRASTRUCTURE_ID_SEQ", sequenceName = "INFRASTRUCTURE_ID_SEQ", allocationSize = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQUENCE_INFRASTRUCTURE_ID_SEQ") @Column(name = "id") public Integer getId() { return this.id; } public void setId(final Integer id) { this.id = id; } @OneToOne @JoinColumn(name = "river_id") public River getRiver() { return this.river; } public void setRiver(final River river) { this.river = river; } @Column(name = "filename") public String getFilename() { return this.filename; } public void setFilename(final String filename) { this.filename = filename; } @Column(name = "kmrange_info") public String getKmrange_info() { return this.kmrange_info; } public void setKmrange_info(final String kmrange_info) { this.kmrange_info = kmrange_info; } @Column(name = "notes") public String getNotes() { return this.notes; } public void setNotes(final String notes) { this.notes = notes; } @OneToOne @JoinColumn(name = "annotation_type_id") public AnnotationType getType() { return this.type; } public void setType(final AnnotationType type) { this.type = type; } @OneToOne @JoinColumn(name = "group_id") public AnnotationType getGroup() { return this.group; } public void setGroup(final AnnotationType group) { this.group = group; } @Column(name = "year") public Integer getYear() { return this.year; } public void setYear(final Integer year) { this.year = year; } @Column(name = "dataprovider") public String getDataprovider() { return this.dataprovider; } public void setDataprovider(final String dataprovider) { this.dataprovider = dataprovider; } @Column(name = "evaluation_by") public String getEvaluation_by() { return this.evaluation_by; } public void setEvaluation_by(final String evaluation_by) { this.evaluation_by = evaluation_by; } @OneToMany @JoinColumn(name = "infrastructure_id") public List<InfrastructureValue> getValues() { return this.values; } public void setValues(final List<InfrastructureValue> values) { this.values = values; } public void addValue(final InfrastructureValue value) { this.values.add(value); } /** * Get data series by id */ public static Infrastructure getSeries(final int id) { final Session session = SessionHolder.HOLDER.get(); final Query query = session.createQuery("FROM Infrastructure WHERE (id=:id)"); query.setParameter("id", id); return (Infrastructure) query.list().get(0); } /** * Get first data series of a river */ public static Infrastructure getSeries(final River river) { final Session session = SessionHolder.HOLDER.get(); final Query query = session.createQuery("FROM Infrastructure WHERE (river=:river)"); query.setParameter("river", river); final List rows = query.list(); if (!rows.isEmpty()) return (Infrastructure) rows.get(0); else return null; } /** * 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 */ 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()); return groupTypes; } /** * 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) { 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"); query.setParameter("river", river); query.setParameter("kmLo", new Double(kmLo)); query.setParameter("kmHi", new Double(kmHi)); if (!InfrastructureValue.getRiversideClause(riverside, "v", "attr_id").isEmpty()) query.setParameter("attr_id", riverside.getId()); return query.list(); } }