sascha@326: package de.intevation.flys.artifacts.model; sascha@326: sascha@326: import java.io.Serializable; sascha@326: sascha@326: import de.intevation.flys.model.River; sascha@326: import de.intevation.flys.model.Wst; sascha@326: import de.intevation.flys.model.WstColumn; sascha@326: sascha@326: import de.intevation.flys.backend.SessionHolder; sascha@326: sascha@326: import java.util.ArrayList; sascha@326: import java.util.Comparator; sascha@326: import java.util.List; sascha@326: import java.util.Collections; sascha@326: import java.util.Iterator; sascha@326: sascha@326: import org.hibernate.Session; sascha@326: import org.hibernate.Query; sascha@326: import org.hibernate.SQLQuery; sascha@326: sascha@326: import org.hibernate.type.StandardBasicTypes; sascha@326: sascha@326: public class WstValueTable sascha@326: implements Serializable sascha@326: { sascha@326: sascha@326: // TODO: put this into a property file sascha@326: public static final String SQL_POS_WQ = sascha@327: "SELECT position, w, q, column_pos" + sascha@327: " FROM wst_value_table" + sascha@327: " WHERE wst_id = :wst_id"; sascha@326: sascha@326: public static class Column sascha@326: implements Serializable sascha@326: { sascha@326: protected String name; sascha@326: sascha@326: public Column() { sascha@326: } sascha@326: sascha@326: public Column(String name) { sascha@326: this.name = name; sascha@326: } sascha@326: sascha@326: public String getName() { sascha@326: return name; sascha@326: } sascha@326: sascha@326: public void setName(String name) { sascha@326: this.name = name; sascha@326: } sascha@326: } sascha@326: // class Column sascha@326: sascha@326: public static class Row sascha@326: implements Serializable sascha@326: { sascha@326: double km; sascha@326: double [] wq; sascha@326: sascha@326: public Row() { sascha@326: } sascha@326: sascha@326: public Row(double km, double [] wq) { sascha@326: this.km = km; sascha@326: this.wq = wq; sascha@326: } sascha@326: } sascha@326: // class Row sascha@326: sascha@326: protected List rows; sascha@326: sascha@326: protected Column [] columns; sascha@326: sascha@326: public WstValueTable() { sascha@326: rows = new ArrayList(); sascha@326: } sascha@326: sascha@326: public WstValueTable(Column [] columns) { sascha@326: this(); sascha@326: this.columns = columns; sascha@326: } sascha@326: sascha@326: public static WstValueTable getTable(River river) { sascha@326: return getTable(river, 0); sascha@326: } sascha@326: sascha@326: public static WstValueTable getTable(River river, int kind) { sascha@326: sascha@326: Session session = SessionHolder.HOLDER.get(); sascha@326: sascha@326: Query query = session.createQuery( sascha@326: "from Wst where river=:river and kind=:kind"); sascha@326: query.setParameter("river", river); sascha@326: query.setInteger("kind", kind); sascha@326: sascha@326: List wsts = query.list(); sascha@326: sascha@326: if (wsts.isEmpty()) { sascha@326: return null; sascha@326: } sascha@326: sascha@326: Wst wst = wsts.get(0); sascha@326: sascha@326: // TODO: Do this sorting at database level sascha@326: List wstColumns = new ArrayList(wst.getColumns()); sascha@326: Collections.sort(wstColumns, new Comparator() { sascha@326: public int compare(WstColumn a, WstColumn b) { sascha@326: int pa = a.getPosition(); sascha@326: int pb = b.getPosition(); sascha@326: if (pa < pb) return -1; sascha@326: if (pa > pb) return +1; sascha@326: return 0; sascha@326: } sascha@326: }); sascha@326: sascha@326: Column [] columns = new Column[wstColumns.size()]; sascha@326: for (int i = 0; i < columns.length; ++i) { sascha@326: columns[i] = new Column(wstColumns.get(i).getName()); sascha@326: } sascha@326: sascha@326: // using native SQL here to avoid myriad of small objects. sascha@326: SQLQuery sqlQuery = session.createSQLQuery(SQL_POS_WQ) sascha@326: .addScalar("position", StandardBasicTypes.DOUBLE) sascha@326: .addScalar("w", StandardBasicTypes.DOUBLE) sascha@326: .addScalar("q", StandardBasicTypes.DOUBLE) sascha@326: .addScalar("column_pos", StandardBasicTypes.INTEGER); sascha@326: sascha@326: sqlQuery.setInteger("wst_id", wst.getId()); sascha@326: sascha@326: WstValueTable valueTable = new WstValueTable(columns); sascha@326: sascha@326: int lastColumnNo = -1; sascha@326: Row row = null; sascha@326: sascha@326: for (Iterator iter = sqlQuery.iterate(); iter.hasNext();) { sascha@326: Object [] result = iter.next(); sascha@326: double km = (Double) result[0]; sascha@326: Double w = (Double) result[1]; sascha@326: Double q = (Double) result[2]; sascha@326: int columnNo = (Integer)result[3]; sascha@326: sascha@326: if (columnNo > lastColumnNo) { // new row sascha@326: if (row != null) { sascha@326: valueTable.rows.add(row); sascha@326: } sascha@326: row = new Row(km, new double[(columnNo+1) << 1]); sascha@326: } sascha@326: int idx = columnNo << 1; sascha@326: sascha@326: row.wq[idx ] = w != null ? w : Double.NaN; sascha@326: row.wq[idx+1] = q != null ? q : Double.NaN; sascha@326: sascha@326: lastColumnNo = columnNo; sascha@326: } sascha@326: sascha@326: if (row != null) { sascha@326: valueTable.rows.add(row); sascha@326: } sascha@326: sascha@326: return valueTable; sascha@326: } sascha@326: } sascha@326: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :