From 431b7591df2cbd9f2ab6b31f74f95857cdf68b24 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 9 Jun 2021 09:59:37 +0200 Subject: [PATCH] [jOOQ/jOOQ#11979] Add Configuration.deriveSettings(Function) --- .../main/java/org/jooq/meta/AbstractDatabase.java | 10 ++++------ .../org/jooq/meta/postgres/PostgresDatabase.java | 2 +- .../java/org/jooq/meta/sqlite/SQLiteDatabase.java | 2 +- jOOQ/src/main/java/org/jooq/Configuration.java | 13 +++++++++++++ .../main/java/org/jooq/impl/AbstractQueryPart.java | 2 +- .../java/org/jooq/impl/DefaultConfiguration.java | 8 ++++++++ .../java/org/jooq/impl/DiagnosticsConnection.java | 3 +-- jOOQ/src/main/java/org/jooq/impl/MetaImpl.java | 2 +- jOOQ/src/main/java/org/jooq/impl/ParserImpl.java | 6 +++--- .../org/jooq/impl/ParsingConnectionFactory.java | 3 +-- jOOQ/src/main/java/org/jooq/impl/R2DBC.java | 6 ++---- .../java/org/jooq/tools/jdbc/MockConfiguration.java | 8 ++++++++ 12 files changed, 44 insertions(+), 21 deletions(-) diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java index 1bf3a05c24..760ac3f48e 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java @@ -357,7 +357,6 @@ public abstract class AbstractDatabase implements Database { return DSL.using(configuration); } else { - final Settings newSettings = SettingsTools.clone(configuration.settings()).withRenderFormatted(true); final ExecuteListener newListener = new DefaultExecuteListener() { class SQLPerformanceWarning extends Exception {} @@ -457,10 +456,11 @@ public abstract class AbstractDatabase implements Database { } private String formatted(Query query) { - return DSL.using(configuration.derive(newSettings)).renderInlined(query); + return configuration.deriveSettings(s -> s.withRenderFormatted(true)).dsl().renderInlined(query); } }; - return DSL.using(configuration.deriveAppending(newListener)); + + return configuration.deriveAppending(newListener).dsl(); } } @@ -3042,15 +3042,13 @@ public abstract class AbstractDatabase implements Database { continue viewLoop; onError(ERROR, "Error while parsing view", () -> { - final Settings settings = SettingsTools.clone(create().settings()) - .withParseWithMetaLookups(ParseWithMetaLookups.THROW_ON_FAILURE); // TODO: Add a Meta implementation that is based on jOOQ-meta final Meta meta = create().meta(); final List> params = new ArrayList<>(); final Configuration configuration = create() .configuration() - .derive(settings) + .deriveSettings(s -> s.withParseWithMetaLookups(ParseWithMetaLookups.THROW_ON_FAILURE)) .derive((MetaProvider) () -> meta); // [#8722] [#11054] Before a public API is available, use this internal, undocumented diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java index fa7b007d6d..b0cf347a31 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java @@ -293,7 +293,7 @@ public class PostgresDatabase extends AbstractDatabase implements ResultQueryDat try { return create() .configuration() - .derive(SettingsTools.clone(create().settings()).withParseUnknownFunctions(ParseUnknownFunctions.IGNORE)) + .deriveSettings(s -> s.withParseUnknownFunctions(ParseUnknownFunctions.IGNORE)) .dsl() .parser().parseField(string).getName(); } diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/sqlite/SQLiteDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/sqlite/SQLiteDatabase.java index 0beff2ede1..e46399fbe9 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/sqlite/SQLiteDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/sqlite/SQLiteDatabase.java @@ -299,7 +299,7 @@ public class SQLiteDatabase extends AbstractDatabase { protected void loadCheckConstraints(DefaultRelations r) throws SQLException { DSLContext ctx = create() .configuration() - .derive(SettingsTools.clone(create().settings()).withInterpreterDelayForeignKeyDeclarations(true)) + .deriveSettings(s -> s.withInterpreterDelayForeignKeyDeclarations(true)) .dsl(); SchemaDefinition schema = getSchemata().get(0); diff --git a/jOOQ/src/main/java/org/jooq/Configuration.java b/jOOQ/src/main/java/org/jooq/Configuration.java index e1018e16ee..3ded614eea 100644 --- a/jOOQ/src/main/java/org/jooq/Configuration.java +++ b/jOOQ/src/main/java/org/jooq/Configuration.java @@ -46,6 +46,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.concurrent.ForkJoinPool; +import java.util.function.Function; import java.util.function.Supplier; import javax.sql.DataSource; @@ -1871,6 +1872,18 @@ public interface Configuration extends Serializable { @NotNull Configuration derive(Settings newSettings); + /** + * Create a derived configuration from this one, with new settings + * constructed from a clone of the current settings. + * + * @param newSettings A function producing the new settings to be contained + * in the derived configuration based on a clone of the current + * settings. + * @return The derived configuration. + */ + @NotNull + Configuration deriveSettings(Function newSettings); + /** * Whether this is a commercial edition of jOOQ. */ diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractQueryPart.java b/jOOQ/src/main/java/org/jooq/impl/AbstractQueryPart.java index 06d26d5e77..3a09d4827f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractQueryPart.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractQueryPart.java @@ -193,7 +193,7 @@ abstract class AbstractQueryPart implements QueryPartInternal { // [#8355] Subtypes may have null configuration Configuration configuration = Tools.configuration(configuration()); - return create(configuration.derive(SettingsTools.clone(configuration.settings()).withRenderFormatted(true))).renderInlined(this); + return create(configuration.deriveSettings(s -> s.withRenderFormatted(true))).renderInlined(this); } catch (SQLDialectNotSupportedException e) { return "[ ... " + e.getMessage() + " ... ]"; diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultConfiguration.java b/jOOQ/src/main/java/org/jooq/impl/DefaultConfiguration.java index 3bcdcedce2..2183563d2e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultConfiguration.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultConfiguration.java @@ -50,6 +50,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; +import java.util.function.Function; import javax.sql.DataSource; @@ -93,6 +94,8 @@ import org.jooq.exception.ConfigurationException; import org.jooq.impl.ThreadLocalTransactionProvider.ThreadLocalConnectionProvider; import org.jooq.migrations.xml.jaxb.MigrationsType; +import org.jetbrains.annotations.NotNull; + import io.r2dbc.spi.ConnectionFactory; /** @@ -1087,6 +1090,11 @@ public class DefaultConfiguration extends AbstractConfiguration { ); } + @Override + public final Configuration deriveSettings(Function newSettings) { + return derive(newSettings.apply(SettingsTools.clone(settings))); + } + // ------------------------------------------------------------------------- // XXX: Changing configurations // ------------------------------------------------------------------------- diff --git a/jOOQ/src/main/java/org/jooq/impl/DiagnosticsConnection.java b/jOOQ/src/main/java/org/jooq/impl/DiagnosticsConnection.java index 32921bd049..26c5abbbcd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DiagnosticsConnection.java +++ b/jOOQ/src/main/java/org/jooq/impl/DiagnosticsConnection.java @@ -80,8 +80,7 @@ final class DiagnosticsConnection extends DefaultConnection { super(configuration.connectionProvider().acquire()); this.configuration = configuration; - this.normalisingRenderer = configuration.derive( - SettingsTools.clone(configuration.settings()) + this.normalisingRenderer = configuration.deriveSettings(s -> s // Forcing all inline parameters to be indexed helps find opportunities to use bind variables .withParamType(FORCE_INDEXED) diff --git a/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java b/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java index 61836691e5..de292e0353 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java @@ -1048,7 +1048,7 @@ final class MetaImpl extends AbstractMeta { try { type = type.defaultValue(dsl() .configuration() - .derive(SettingsTools.clone(dsl().settings()).withParseUnknownFunctions(ParseUnknownFunctions.IGNORE)) + .deriveSettings(s -> s.withParseUnknownFunctions(ParseUnknownFunctions.IGNORE)) .dsl() .parser() .parseField(defaultValue) diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 293bcd1a98..cd19fc6f0b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -511,8 +511,8 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { // statements. if (TRUE.equals(configuration().data("org.jooq.ddl.parse-for-ddldatabase"))) { if (query instanceof Select) { - String s = - configuration().derive(SettingsTools.clone(configuration().settings()) + String sql = + configuration().deriveSettings(s -> s .withRenderFormatted(false) .withRenderKeywordCase(RenderKeywordCase.LOWER) .withRenderNameCase(RenderNameCase.LOWER) @@ -523,7 +523,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { // [#8910] special treatment for PostgreSQL pg_dump's curious // usage of the SET SCHEMA command - Matcher matcher = P_SEARCH_PATH.matcher(s); + Matcher matcher = P_SEARCH_PATH.matcher(sql); String schema; if (matcher.find()) if (!StringUtils.isBlank(schema = matcher.group(2))) diff --git a/jOOQ/src/main/java/org/jooq/impl/ParsingConnectionFactory.java b/jOOQ/src/main/java/org/jooq/impl/ParsingConnectionFactory.java index 51a9e4eced..7ab355e030 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParsingConnectionFactory.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParsingConnectionFactory.java @@ -76,8 +76,7 @@ final class ParsingConnectionFactory implements ConnectionFactory { if (configuration.connectionFactory() instanceof NoConnectionFactory) throw new DetachedException("ConnectionProvider did not provide an R2DBC ConnectionFactory"); - this.configuration = configuration.derive(); - this.configuration.set(setParamType(configuration.dialect(), configuration.settings())); + this.configuration = configuration.deriveSettings(s -> setParamType(configuration.dialect(), s)); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/R2DBC.java b/jOOQ/src/main/java/org/jooq/impl/R2DBC.java index 6324777554..58c659b7b6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/R2DBC.java +++ b/jOOQ/src/main/java/org/jooq/impl/R2DBC.java @@ -615,8 +615,8 @@ final class R2DBC { // ------------------------------------------------------------------------- static final Rendered rendered(Configuration configuration, Query query) { - DefaultRenderContext render = new DefaultRenderContext(configuration.derive( - setParamType(configuration.dialect(), configuration.settings()) + DefaultRenderContext render = new DefaultRenderContext(configuration.deriveSettings(s -> + setParamType(configuration.dialect(), s) )); return new Rendered(render.paramType(NAMED).visit(query).render(), render.bindValues(), render.skipUpdateCounts()); @@ -1244,8 +1244,6 @@ final class R2DBC { } static final Settings setParamType(SQLDialect dialect, Settings settings) { - settings = SettingsTools.clone(settings); - switch (dialect.family()) { case MYSQL: return settings diff --git a/jOOQ/src/main/java/org/jooq/tools/jdbc/MockConfiguration.java b/jOOQ/src/main/java/org/jooq/tools/jdbc/MockConfiguration.java index a39e970852..1d65e54d66 100644 --- a/jOOQ/src/main/java/org/jooq/tools/jdbc/MockConfiguration.java +++ b/jOOQ/src/main/java/org/jooq/tools/jdbc/MockConfiguration.java @@ -41,6 +41,7 @@ import java.sql.Connection; import java.time.Clock; import java.util.Map; import java.util.concurrent.Executor; +import java.util.function.Function; import javax.sql.DataSource; @@ -72,6 +73,8 @@ import org.jooq.VisitListenerProvider; import org.jooq.conf.Settings; import org.jooq.impl.AbstractConfiguration; +import org.jetbrains.annotations.NotNull; + import io.r2dbc.spi.ConnectionFactory; /** @@ -542,4 +545,9 @@ public class MockConfiguration extends AbstractConfiguration { public Configuration derive(Settings newSettings) { return delegate.derive(newSettings); } + + @Override + public Configuration deriveSettings(Function newSettings) { + return delegate.deriveSettings(newSettings); + } }