[jOOQ/jOOQ#11979] Add Configuration.deriveSettings(Function<Settings, Settings>)

This commit is contained in:
Lukas Eder 2021-06-09 09:59:37 +02:00
parent ebe2a63a84
commit 431b7591df
12 changed files with 44 additions and 21 deletions

View File

@ -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<Param<?>> 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

View File

@ -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();
}

View File

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

View File

@ -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<? super Settings, ? extends Settings> newSettings);
/**
* Whether this is a commercial edition of jOOQ.
*/

View File

@ -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() + " ... ]";

View File

@ -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<? super Settings, ? extends Settings> newSettings) {
return derive(newSettings.apply(SettingsTools.clone(settings)));
}
// -------------------------------------------------------------------------
// XXX: Changing configurations
// -------------------------------------------------------------------------

View File

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

View File

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

View File

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

View File

@ -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

View File

@ -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

View File

@ -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<? super Settings, ? extends Settings> newSettings) {
return delegate.deriveSettings(newSettings);
}
}