view 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 source
/* Copyright (C) 2014 by Bundesanstalt für Gewässerkunde
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU AGPL (>=v3)
 * and comes with ABSOLUTELY NO WARRANTY! Check out the
 * documentation coming with Dive4Elements River for details.
 */

package org.dive4elements.river.importer;

import java.util.ArrayList;
import java.util.List;

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;
import org.hibernate.Query;
import org.hibernate.Session;

public class ImportSedimentLoad
{
    private static Logger log = Logger.getLogger(ImportSedimentLoad.class);

    private SedimentLoad peer;

    private ImportGrainFraction grainFraction;
    private ImportTimeInterval  timeInterval;
    private ImportTimeInterval  sqTimeInterval;
    private String              description;
    private Integer             kind;

    private final List<ImportSedimentLoadValue> values;

    protected StoreMode storeMode;

    public ImportSedimentLoad() {
        this.values = new ArrayList<>();
    }

    public ImportSedimentLoad(
            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<>();
        this.storeMode = StoreMode.NONE;
    }

    public void addValue(final ImportSedimentLoadValue value) {
        this.values.add(value);
    }

    public void storeDependencies() {
        log.info("store dependencies for '" + this.description + "'");
        this.grainFraction.getPeer();
        this.timeInterval.getPeer();

        if (this.sqTimeInterval != null) {
            this.sqTimeInterval.getPeer();
        }

        getPeer();

        for (final ImportSedimentLoadValue value : this.values) {
            value.storeDependencies(this.peer, this.storeMode);
        }
        log.info("Values processed: " + this.values.size());
    }

    public SedimentLoad getPeer() {

        if (this.peer == null) {
            final Session session = ImporterSession.getInstance()
                    .getDatabaseSession();

            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);

            final GrainFraction gf = this.grainFraction.getPeer();
            final TimeInterval  ti = this.timeInterval.getPeer();

            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 this.peer;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org