view flys-backend/src/main/java/de/intevation/flys/model/Wst.java @ 769:321b9e480f72

Added a method to river to find the gauge with the max overlap with a given interval. flys-backend/trunk@2235 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sun, 26 Jun 2011 16:13:08 +0000
parents 9aa0eddc5221
children f834b411ca57
line wrap: on
line source
package de.intevation.flys.model;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.GeneratedValue;
import javax.persistence.Column;
import javax.persistence.SequenceGenerator;
import javax.persistence.GenerationType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.OneToMany;

import org.apache.log4j.Logger;

import org.hibernate.Session;
import org.hibernate.Query;

import de.intevation.flys.backend.SessionHolder;


@Entity
@Table(name = "wsts")
public class Wst
implements   Serializable
{
    private static Logger logger = Logger.getLogger(Wst.class);

    private Integer id;
    private River   river;
    private String  description;
    private Integer kind;

    private List<WstColumn> columns;

    public Wst() {
    }

    public Wst(River river, String description) {
        this(river, description, 0);
    }

    public Wst(River river, String description, Integer kind) {
        this.river       = river;
        this.description = description;
        this.kind        = kind;
    }

    @Id
    @SequenceGenerator(
        name           = "SEQUENCE_WSTS_ID_SEQ",
        sequenceName   = "WSTS_ID_SEQ",
        allocationSize = 1)
    @GeneratedValue(
        strategy  = GenerationType.SEQUENCE,
        generator = "SEQUENCE_WSTS_ID_SEQ")
    @Column(name = "id")
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @OneToOne
    @JoinColumn(name = "river_id" )
    public River getRiver() {
        return river;
    }

    public void setRiver(River river) {
        this.river = river;
    }

    @Column(name = "description")
    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Column(name = "kind")
    public Integer getKind() {
        return kind;
    }

    public void setKind(Integer kind) {
        this.kind = kind;
    }

    @OneToMany
    @JoinColumn(name="wst_id")
    public List<WstColumn> getColumns() {
        return columns;
    }

    public void setColumns(List<WstColumn> columns) {
        this.columns = columns;
    }

    /**
     * Determines the min and max Q values of this WST. The min value is placed
     * in the first field of the resulting array - the max value is placed in
     * the second field.
     *
     * @return the min and max Q values of this WST.
     */
    public double[] determineMinMaxQ() {
        double[] ab = river.determineMinMaxDistance();
        return determineMinMaxQ(new Range(ab[0], ab[1], river));
    }


    /**
     * Determines the min and max Q values of this WST in the given range. The
     * min value is placed in the first field of the resulting array - the max
     * value is placed in the second field.
     *
     * @param range The range used for querying the Q values.
     *
     * @return the min and max Q values of this WST.
     */
    public double[] determineMinMaxQ(Range range) {
        Session session = SessionHolder.HOLDER.get();

        Query query = session.createQuery(
          "select min(q), max(q) from WstQRange where " +
          " id in " +
          "  (select wstQRange.id from WstColumnQRange where " +
          "    wstColumn.id in (select id from WstColumn where wst.id = :wst)) " +
          " and range.id in " +
          "  (select id from Range where not (a > :end or b < :start))");

        query.setParameter("wst",   getId());
        query.setParameter("start", range.getA());
        query.setParameter("end",   range.getB());

        List<Object []> results = query.list();

        if (results.isEmpty()) {
            return null;
        }

        Object [] result = results.get(0);

        return new double [] {
            ((BigDecimal)result[0]).doubleValue(),
            ((BigDecimal)result[1]).doubleValue() };
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org