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

com.kenshoo.jooq.TempTableEngine Maven / Gradle / Ivy

Go to download

A Java persistence layer based on JOOQ for high performance and business flow support.

There is a newer version: 0.1.121-jooq-3.16.3
Show newest version
package com.kenshoo.jooq;

import com.google.common.base.Preconditions;
import com.google.common.base.Throwables;
import org.jooq.*;
import org.jooq.impl.DSL;

import java.sql.SQLException;
import java.util.Objects;
import java.util.stream.Stream;


class TempTableEngine {

    static public > TempTableResource tempInMemoryTable(final DSLContext dslContext, T table, TablePopulator tablePopulator) {
        return tempTable(dslContext, table, table.fields(), tablePopulator);
    }

    static public > TempTableResource tempTable(final DSLContext dslContext, T table, Field[] fields, TablePopulator tablePopulator) {
        Preconditions.checkArgument(fields.length > 0, "At least one field is required");
        // Try creating the temp table either in memory or on disk and take the first one that succeeds
        return Stream.of(TempTable.Type.IN_MEMORY, TempTable.Type.REGULAR)
                .map(type -> tempTable(dslContext, table, fields, tablePopulator, type))
                .filter(Objects::nonNull)
                .findFirst().orElseThrow(() -> new RuntimeException("Failed to create temp table"));
    }

    static private > TempTableResource tempTable(final DSLContext dslContext, T table, Field[] fields, TablePopulator tablePopulator, TempTable.Type tableType) {
        final TransactionProvider txProvider = dslContext.configuration().transactionProvider();
        final Configuration newJooq = dslContext.configuration().derive();
        final TransactionContext tx = new TransactionContextImpl(newJooq, dslContext);
        txProvider.begin(tx);
        TempTable tempTable = new TempTable<>(DSL.using(newJooq), table, fields, tablePopulator, tableType);
        try {
            tempTable.create();
            return new TempTableResource() {
                @Override
                public T getTable() {
                    return table;
                }

                @Override
                public void close() {
                    try {
                        tempTable.dropTable();
                    } finally {
                        txProvider.commit(tx);
                    }
                }
            };
        } catch (Throwable e) {
            txProvider.rollback(tx);
            if (tableType == TempTable.Type.IN_MEMORY && isFullTableError(e)) {
                return null;
            } else {
                throw Throwables.propagate(e);
            }
        }
    }

    private static boolean isFullTableError(Throwable e) {
        Throwable cause = e.getCause();
        if (cause == null) {
            return false;
        }
        if (!(cause instanceof SQLException)) {
            return false;
        }
        SQLException sqle = (SQLException) cause;
        return sqle.getErrorCode() == 1114 && "HY000".equals(sqle.getSQLState());
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy