All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.javers.repository.sql.session.Session Maven / Gradle / Ivy

There is a newer version: 7.6.2
Show newest version
package org.javers.repository.sql.session;

import org.javers.common.collections.Lists;
import org.javers.common.validation.Validate;
import org.javers.repository.sql.ConnectionProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;
import java.util.*;

/**
 * @author bartosz.walacik
 */
public class Session implements AutoCloseable {
    public static final String SQL_LOGGER_NAME = "org.javers.SQL";
    private static final Logger logger = LoggerFactory.getLogger(SQL_LOGGER_NAME);

    private final Dialect dialect;
    private final Map statementExecutors = new HashMap<>();
    private final ConnectionProvider connectionProvider;
    private final String sessionName;
    private final KeyGenerator keyGenerator;

    Session(Dialect dialect, KeyGenerator keyGenerator, ConnectionProvider connectionProvider, String sessionName) {
        this.dialect = dialect;
        this.connectionProvider = connectionProvider;
        this.sessionName = sessionName;
        this.keyGenerator = keyGenerator;
    }

    public SelectBuilder select(String selectClauseSQL) {
        return new SelectBuilder(this, selectClauseSQL);
    }

    public InsertBuilder insert(String queryName) {
        return new InsertBuilder(this, queryName);
    }

    long executeInsertAndGetSequence(String queryName, List parameters, String tableName, String primaryKeyFieldName, String sequenceName) {
        Validate.argumentsAreNotNull(queryName, parameters, tableName, primaryKeyFieldName, sequenceName);

        if (dialect.supportsSequences()) {
            long newId = keyGenerator.generateKey(sequenceName, this);

            Insert insertQuery = new Insert(
                    queryName,
                    Lists.add(parameters, new Parameter.LongParameter(primaryKeyFieldName, newId)),
                    tableName);

            execute(insertQuery);
            return newId;
        }
        else {
            Insert insertQuery = new Insert(queryName, parameters, tableName);

            execute(insertQuery);

            return keyGenerator.getKeyFromLastInsert(this);
        }
    }

    void executeInsert(String queryName, List parameters, String tableName, String primaryKeyFieldName, String sequenceName) {
        Validate.argumentsAreNotNull(queryName, parameters, tableName);

        if (dialect.supportsSequences() && sequenceName != null) {
            long newId = keyGenerator.generateKey(sequenceName, this);

            Insert insertQuery = new Insert(
                    queryName,
                    Lists.add(parameters, new Parameter.LongParameter(primaryKeyFieldName, newId)),
                    tableName);

            execute(insertQuery);
        }
        else {
            Insert insertQuery = new Insert(queryName, parameters, tableName);
            execute(insertQuery);
        }
    }

    long executeQueryForLong(Select select) {
        PreparedStatementExecutor executor = getOrCreatePreparedStatement(select);
        return executor.executeQueryForLong(select);
    }

    Optional executeQueryForOptionalBigDecimal(Select select) {
        PreparedStatementExecutor executor = getOrCreatePreparedStatement(select);
        return executor.executeQueryForOptionalBigDecimal(select);
    }

    Optional executeQueryForOptionalLong(Select select) {
        PreparedStatementExecutor executor = getOrCreatePreparedStatement(select);
        return executor.executeQueryForOptionalLong(select);
    }

     List executeQuery(Select select, ObjectMapper objectMapper) {
        PreparedStatementExecutor executor = getOrCreatePreparedStatement(select);
        return executor.executeQuery(select, objectMapper);
    }

    private void execute(Insert insertQuery) {
        PreparedStatementExecutor executor = getOrCreatePreparedStatement(insertQuery);
        executor.execute(insertQuery);
    }

    @Override
    public void close() {
        statementExecutors.values().stream().forEach(p -> p.close());
        logStats();
    }

    private PreparedStatementExecutor getOrCreatePreparedStatement(Query query) {
        if (statementExecutors.containsKey(query.name())) {
            return statementExecutors.get(query.name());
        }

        PreparedStatementExecutor executor = new PreparedStatementExecutor(connectionProvider, query);

        statementExecutors.put(query.name(), executor);

        return executor;
    }

    public void logStats() {
        logger.trace("SQL session '" + sessionName + "' finished. {} statement(s) executed in {} millis.",
                statementExecutors.values().stream().mapToInt(i -> i.getExecutionCount()).sum(),
                statementExecutors.values().stream().mapToLong(i -> i.getExecutionTotalMillis()).sum());

        List executors = new ArrayList<>(statementExecutors.values());
        Collections.sort(executors, (e1, e2) -> e2.getExecutionTotalMillis() > e1.getExecutionTotalMillis() ? 1 : -1);

        if (logger.isTraceEnabled()) {
            executors.forEach(e -> logger.trace("* " + e.printStats()));
        }
    }

    Dialect getDialect() {
        return dialect;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy