Mercurial > dive4elements > river
diff backend/src/main/java/org/dive4elements/river/importer/ImportSedimentLoad.java @ 8986:392bbcd8a88b
Database inserts accelerated by suppressing unnecessary database queries for new data series
author | mschaefer |
---|---|
date | Sun, 08 Apr 2018 18:07:06 +0200 |
parents | 5e38e2924c07 |
children |
line wrap: on
line diff
--- a/backend/src/main/java/org/dive4elements/river/importer/ImportSedimentLoad.java Fri Apr 06 14:13:14 2018 +0200 +++ b/backend/src/main/java/org/dive4elements/river/importer/ImportSedimentLoad.java Sun Apr 08 18:07:06 2018 +0200 @@ -8,9 +8,11 @@ package org.dive4elements.river.importer; +import java.util.ArrayList; import java.util.List; -import java.util.ArrayList; +import org.apache.log4j.Logger; +import org.dive4elements.river.importer.common.StoreMode; import org.dive4elements.river.model.GrainFraction; import org.dive4elements.river.model.SedimentLoad; import org.dive4elements.river.model.TimeInterval; @@ -19,6 +21,8 @@ public class ImportSedimentLoad { + private static Logger log = Logger.getLogger(ImportSedimentLoad.class); + private SedimentLoad peer; private ImportGrainFraction grainFraction; @@ -27,92 +31,98 @@ private String description; private Integer kind; - private List<ImportSedimentLoadValue> values; + private final List<ImportSedimentLoadValue> values; + + protected StoreMode storeMode; public ImportSedimentLoad() { - this.values = new ArrayList<ImportSedimentLoadValue>(); + this.values = new ArrayList<>(); } public ImportSedimentLoad( - ImportGrainFraction grainFraction, - ImportTimeInterval timeInterval, - ImportTimeInterval sqTimeInterval, - String description, - Integer kind - ) { + final ImportGrainFraction grainFraction, + final ImportTimeInterval timeInterval, + final ImportTimeInterval sqTimeInterval, + final String description, + final Integer kind + ) { this.grainFraction = grainFraction; this.timeInterval = timeInterval; this.sqTimeInterval = sqTimeInterval; this.description = description; this.kind = kind; - this.values = new ArrayList<ImportSedimentLoadValue>(); + this.values = new ArrayList<>(); + this.storeMode = StoreMode.NONE; } - public void addValue(ImportSedimentLoadValue value) { - values.add(value); + public void addValue(final ImportSedimentLoadValue value) { + this.values.add(value); } public void storeDependencies() { - grainFraction.getPeer(); - timeInterval.getPeer(); + log.info("store dependencies for '" + this.description + "'"); + this.grainFraction.getPeer(); + this.timeInterval.getPeer(); - if (sqTimeInterval != null) { - sqTimeInterval.getPeer(); + if (this.sqTimeInterval != null) { + this.sqTimeInterval.getPeer(); } getPeer(); - for (ImportSedimentLoadValue value : values) { - value.storeDependencies(peer); + for (final ImportSedimentLoadValue value : this.values) { + value.storeDependencies(this.peer, this.storeMode); } - + log.info("Values processed: " + this.values.size()); } public SedimentLoad getPeer() { - if (peer == null) { - Session session = ImporterSession.getInstance() - .getDatabaseSession(); - - String sqtquery = sqTimeInterval == null - ? "sq_time_interval_id is null" - : "sqTimeInterval = :sqTimeInterval"; - Query query = session.createQuery( - "from SedimentLoad where " + - " grainFraction = :grainFraction and " + - " timeInterval = :timeInterval and " + - " description = :description and " + - " kind = :kind and " + - sqtquery); - - GrainFraction gf = grainFraction.getPeer(); - TimeInterval ti = timeInterval.getPeer(); + if (this.peer == null) { + final Session session = ImporterSession.getInstance() + .getDatabaseSession(); - TimeInterval sqti = sqTimeInterval != null - ? sqTimeInterval.getPeer() - : null; - - query.setParameter("grainFraction", gf); - query.setParameter("timeInterval", ti); + final String sqtquery = this.sqTimeInterval == null + ? "sq_time_interval_id is null" + : "sqTimeInterval = :sqTimeInterval"; + final Query query = session.createQuery( + "from SedimentLoad where " + + " grainFraction = :grainFraction and " + + " timeInterval = :timeInterval and " + + " description = :description and " + + " kind = :kind and " + + sqtquery); - if (sqti != null) { - query.setParameter("sqTimeInterval", sqti); - } - query.setParameter("description", description); - query.setParameter("kind", kind); + final GrainFraction gf = this.grainFraction.getPeer(); + final TimeInterval ti = this.timeInterval.getPeer(); - List<SedimentLoad> loads = query.list(); - if (loads.isEmpty()) { - peer = new SedimentLoad(gf, ti, sqti, description, kind); - session.save(peer); - } - else { - peer = loads.get(0); - } + final TimeInterval sqti = this.sqTimeInterval != null + ? this.sqTimeInterval.getPeer() + : null; + + query.setParameter("grainFraction", gf); + query.setParameter("timeInterval", ti); + + if (sqti != null) { + query.setParameter("sqTimeInterval", sqti); + } + query.setParameter("description", this.description); + query.setParameter("kind", this.kind); + + final List<SedimentLoad> loads = query.list(); + if (loads.isEmpty()) { + this.peer = new SedimentLoad(gf, ti, sqti, this.description, this.kind); + session.save(this.peer); + this.storeMode = StoreMode.INSERT; + } + else { + this.peer = loads.get(0); + this.storeMode = StoreMode.UPDATE; + } } - return peer; + return this.peer; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :