teichmann@5844: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5844: * Software engineering by Intevation GmbH teichmann@5844: * teichmann@5992: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5844: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5992: * documentation coming with Dive4Elements River for details. teichmann@5844: */ teichmann@5844: teichmann@5829: package org.dive4elements.river.importer; sascha@196: mschaefer@8986: import java.math.BigDecimal; mschaefer@8986: import java.util.ArrayList; mschaefer@8986: import java.util.List; mschaefer@8986: import java.util.Random; mschaefer@8986: mschaefer@8986: import org.apache.log4j.Logger; mschaefer@8986: import org.dive4elements.river.importer.common.StoreMode; teichmann@5829: import org.dive4elements.river.model.River; teichmann@5829: import org.dive4elements.river.model.TimeInterval; mschaefer@8986: import org.dive4elements.river.model.Wst; mschaefer@8986: import org.dive4elements.river.model.WstColumn; sascha@201: import org.hibernate.Query; mschaefer@8986: import org.hibernate.Session; sascha@499: felix@5000: felix@5000: /** Unmapped column of a WST. */ sascha@196: public class ImportWstColumn sascha@196: { sascha@499: private static Logger log = Logger.getLogger(ImportWstColumn.class); sascha@499: sascha@201: protected ImportWst wst; sascha@201: protected String name; sascha@201: protected String description; sascha@471: protected Integer position; teichmann@6504: protected String source; sascha@201: sascha@2357: protected ImportTimeInterval timeInterval; sascha@2357: sascha@201: protected List columnQRanges; sascha@202: protected List columnValues; sascha@201: mschaefer@8986: protected StoreMode storeMode; mschaefer@8986: sascha@196: protected WstColumn peer; sascha@196: sascha@196: public ImportWstColumn() { mschaefer@8986: this.columnQRanges = new ArrayList<>(); mschaefer@8986: this.columnValues = new ArrayList<>(); mschaefer@8986: this.storeMode = StoreMode.NONE; sascha@196: } sascha@196: sascha@201: public ImportWstColumn( mschaefer@8986: final ImportWst wst, mschaefer@8986: final String name, mschaefer@8986: final String description, mschaefer@8986: final Integer position, mschaefer@8986: final String source mschaefer@8986: ) { sascha@201: this(); sascha@201: this.wst = wst; sascha@201: this.name = name; sascha@201: this.description = description; sascha@471: this.position = position; sascha@201: } sascha@201: teichmann@6504: public ImportWstColumn( mschaefer@8986: final ImportWst wst, mschaefer@8986: final String name, mschaefer@8986: final String description, mschaefer@8986: final Integer position mschaefer@8986: ) { teichmann@6504: this(wst, name, description, position, null); teichmann@6504: } teichmann@6504: sascha@201: public ImportWst getWst() { mschaefer@8986: return this.wst; sascha@201: } sascha@201: mschaefer@8986: public void setWst(final ImportWst wst) { sascha@201: this.wst = wst; sascha@201: } sascha@201: sascha@201: public String getName() { mschaefer@8986: return this.name; sascha@201: } sascha@201: mschaefer@8986: public void setName(final String name) { sascha@201: this.name = name; sascha@201: } sascha@201: sascha@201: public String getDescription() { mschaefer@8986: return this.description; sascha@201: } sascha@201: mschaefer@8986: public void setDescription(final String description) { sascha@201: this.description = description; sascha@201: } sascha@201: sascha@471: public Integer getPosition() { mschaefer@8986: return this.position; sascha@471: } sascha@471: mschaefer@8986: public void setPosition(final Integer position) { sascha@471: this.position = position; sascha@471: } sascha@471: teichmann@6504: public String getSource() { mschaefer@8986: return this.source; teichmann@6504: } teichmann@6504: mschaefer@8986: public void setSource(final String source) { teichmann@6504: this.source = source; teichmann@6504: } teichmann@6504: mschaefer@8986: public void addColumnValue(final BigDecimal position, final BigDecimal w) { mschaefer@8986: this.columnValues.add( mschaefer@8986: new ImportWstColumnValue(this, position, w)); sascha@202: } sascha@202: mschaefer@8986: public void addColumnQRange(final ImportWstQRange columnQRange) { mschaefer@8986: this.columnQRanges.add( mschaefer@8986: new ImportWstColumnQRange(this, columnQRange)); sascha@201: } sascha@201: felix@5237: felix@5237: /** Get the Column Values stored in this column. */ felix@5237: public List getColumnValues() { mschaefer@8986: return this.columnValues; felix@5237: } felix@5237: felix@5237: mschaefer@8986: public void storeDependencies(final River river) { mschaefer@8986: log.info("store column '" + this.name + "'"); teichmann@7183: getPeer(river); sascha@501: mschaefer@8986: for (final ImportWstColumnQRange columnQRange: this.columnQRanges) { sascha@201: columnQRange.getPeer(river); sascha@201: } sascha@499: mschaefer@8986: for (final ImportWstColumnValue columnValue: this.columnValues) { sascha@202: columnValue.getPeer(river); sascha@202: } sascha@201: } sascha@201: sascha@2357: public ImportTimeInterval getTimeInterval() { mschaefer@8986: return this.timeInterval; sascha@2357: } sascha@2357: mschaefer@8986: public void setTimeInterval(final ImportTimeInterval timeInterval) { sascha@2357: this.timeInterval = timeInterval; sascha@2357: } sascha@2357: teichmann@7183: public boolean guessWaterLevelIncreasing() { teichmann@7183: mschaefer@8986: final int N = this.columnValues.size(); teichmann@7183: teichmann@7183: if (N < 2) { teichmann@7183: return true; teichmann@7183: } teichmann@7183: mschaefer@8986: final Random r = new Random(); teichmann@7183: int up = 0; teichmann@7183: mschaefer@8986: final int S = N < 50 ? N : (int)(0.1f * N)+1; teichmann@7183: for (int s = 0; s < S; ++s) { teichmann@7183: int i1, i2; teichmann@7183: do { teichmann@7183: i1 = r.nextInt(N-1); teichmann@7183: i2 = r.nextInt(N-1); teichmann@7183: } while (i1 == i2); mschaefer@8986: ImportWstColumnValue b = this.columnValues.get(i1); mschaefer@8986: ImportWstColumnValue a = this.columnValues.get(i2); teichmann@7183: if (b.getPosition().compareTo(a.getPosition()) < 0) { mschaefer@8986: final ImportWstColumnValue t = a; a = b; b = t; teichmann@7183: } teichmann@7183: teichmann@7183: if (a.getW().compareTo(b.getW()) < 0) ++up; teichmann@7183: } teichmann@7183: teichmann@7183: return up > S - up; teichmann@7183: } teichmann@7183: felix@5000: /** Get corresponding mapped wst-column (from database). */ mschaefer@8986: public WstColumn getPeer(final River river) { mschaefer@8986: if (this.peer == null) { mschaefer@8986: final Wst w = this.wst.getPeer(river); mschaefer@8986: List columns; mschaefer@8986: final Session session = ImporterSession.getInstance() mschaefer@8986: .getDatabaseSession(); mschaefer@8986: if (this.wst.storeMode == StoreMode.INSERT) mschaefer@8986: columns = null; mschaefer@8986: else { mschaefer@8986: final Query query = session.createQuery( mschaefer@8986: "from WstColumn where" + mschaefer@8986: " wst=:wst and name=:name" + mschaefer@8986: " and source=:source" + mschaefer@8986: " and position=:position"); mschaefer@8986: query.setParameter("wst", w); mschaefer@8986: query.setParameter("name", this.name); mschaefer@8986: query.setParameter("position", this.position); mschaefer@8986: query.setParameter("source", this.source); mschaefer@8986: columns = query.list(); mschaefer@8986: } sascha@2357: mschaefer@8986: final TimeInterval ti = (this.timeInterval != null) ? this.timeInterval.getPeer() : null; sascha@2357: mschaefer@8986: if ((columns == null) || columns.isEmpty()) { mschaefer@8986: log.debug("source: " + this.source); mschaefer@8986: this.peer = new WstColumn( mschaefer@8986: w, this.name, this.description, this.source, this.position, ti); mschaefer@8986: session.save(this.peer); mschaefer@8986: this.storeMode = StoreMode.INSERT; sascha@201: } sascha@201: else { mschaefer@8986: this.peer = columns.get(0); mschaefer@8986: this.storeMode = StoreMode.UPDATE; sascha@201: } sascha@196: } mschaefer@8986: return this.peer; sascha@196: } teichmann@5542: sascha@196: } sascha@196: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :