teichmann@5829: package org.dive4elements.river.importer; ingo@3328: rrenkert@5429: import java.math.BigDecimal; ingo@3328: import java.sql.SQLException; ingo@3329: import java.util.List; ingo@3328: ingo@3328: import org.apache.log4j.Logger; ingo@3328: ingo@3329: import org.hibernate.Query; ingo@3329: import org.hibernate.Session; ingo@3328: import org.hibernate.exception.ConstraintViolationException; ingo@3328: teichmann@5829: import org.dive4elements.river.model.MeasurementStation; teichmann@5829: import org.dive4elements.river.model.SQRelation; teichmann@5829: import org.dive4elements.river.model.SQRelationValue; ingo@3328: ingo@3328: ingo@3328: public class ImportSQRelationValue { ingo@3328: ingo@3328: private static Logger log = Logger.getLogger(ImportSQRelationValue.class); ingo@3328: ingo@3328: ingo@3328: private SQRelationValue peer; ingo@3328: ingo@3328: private String parameter; ingo@3328: rrenkert@5429: private Double km; rrenkert@5429: private Double a; rrenkert@5429: private Double b; rrenkert@5429: private Double qMax; rrenkert@5429: private Double rSQ; rrenkert@5429: private Integer nTot; rrenkert@5429: private Integer nOutlier; rrenkert@5429: private Double cFerguson; rrenkert@5429: private Double cDuan; ingo@3328: ingo@3328: ingo@3328: public ImportSQRelationValue( ingo@3328: String parameter, rrenkert@5429: Double km, rrenkert@5429: Double a, rrenkert@5429: Double b, rrenkert@5429: Double qMax, rrenkert@5429: Double rSQ, rrenkert@5429: Integer nTot, rrenkert@5429: Integer nOutlier, rrenkert@5429: Double cFerguson, rrenkert@5429: Double cDuan ingo@3328: ) { ingo@3328: this.parameter = parameter; ingo@3328: this.km = km; ingo@3328: this.a = a; ingo@3328: this.b = b; rrenkert@5429: this.qMax = qMax; rrenkert@5429: this.rSQ = rSQ; rrenkert@5429: this.nTot = nTot; rrenkert@5429: this.nOutlier = nOutlier; rrenkert@5429: this.cFerguson = cFerguson; rrenkert@5429: this.cDuan = cDuan; ingo@3328: } ingo@3328: ingo@3328: ingo@3328: public void storeDependencies(SQRelation owner) ingo@3328: throws SQLException, ConstraintViolationException ingo@3328: { ingo@3329: getPeer(owner); ingo@3328: } ingo@3328: ingo@3328: ingo@3329: public SQRelationValue getPeer(SQRelation owner) { ingo@3329: if (peer == null) { ingo@3329: Session session = ImporterSession.getInstance().getDatabaseSession(); ingo@3328: ingo@3329: Query query = session.createQuery( rrenkert@5429: "from MeasurementStation " + rrenkert@5429: " where station between :kml and :kmh"); rrenkert@5429: query.setDouble("kml", km - 1e-4); rrenkert@5429: query.setDouble("kmh", km + 1e-4); rrenkert@5429: rrenkert@5429: List result = query.list(); rrenkert@5429: rrenkert@5429: if (result.isEmpty()) { tom@5521: log.error("No measurement stations found at km " + km); rrenkert@5429: return null; rrenkert@5429: } rrenkert@5429: rrenkert@5429: Query query2 = session.createQuery( ingo@3329: "from SQRelationValue " + ingo@3329: " where sqRelation=:owner " + ingo@3329: " and parameter=:parameter" + rrenkert@5429: " and measurementStation=:measurementStation" + rrenkert@5429: " and a=:a" + rrenkert@5429: " and b=:b" + rrenkert@5429: " and qMax=:qMax" + rrenkert@5429: " and rSQ=:rSQ" + rrenkert@5429: " and cFerguson=:cFerguson" + rrenkert@5429: " and cDuan=:cDuan"); ingo@3329: rrenkert@5429: query2.setParameter("owner", owner); rrenkert@5429: query2.setString("parameter", parameter); rrenkert@5429: query2.setParameter("measurementStation", result.get(0)); rrenkert@5429: query2.setBigDecimal("a", toBigDecimal(a)); rrenkert@5429: query2.setBigDecimal("b", toBigDecimal(b)); rrenkert@5429: query2.setBigDecimal("qMax", toBigDecimal(qMax)); rrenkert@5429: query2.setBigDecimal("rSQ", toBigDecimal(rSQ)); rrenkert@5429: query2.setBigDecimal("cFerguson", toBigDecimal(cFerguson)); rrenkert@5429: query2.setBigDecimal("cDuan", toBigDecimal(cDuan)); ingo@3329: rrenkert@5429: List values = query2.list(); ingo@3329: ingo@3329: if (values.isEmpty()) { ingo@3329: peer = new SQRelationValue( ingo@3329: owner, ingo@3329: parameter, rrenkert@5429: result.get(0), ingo@3329: a, rrenkert@5429: b, rrenkert@5429: qMax, rrenkert@5429: rSQ, rrenkert@5429: nTot, rrenkert@5429: nOutlier, rrenkert@5429: cFerguson, rrenkert@5429: cDuan ingo@3329: ); ingo@3329: ingo@3329: session.save(peer); ingo@3329: } ingo@3329: else { ingo@3329: peer = values.get(0); ingo@3329: } ingo@3328: } rrenkert@5429: return peer; rrenkert@5429: } ingo@3328: rrenkert@5429: private static final BigDecimal toBigDecimal(Double x) { rrenkert@5429: if (x == null) return null; rrenkert@5429: return new BigDecimal(x); ingo@3328: } ingo@3328: } ingo@3328: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :