diff --git a/jOOQ/src/main/java/org/jooq/DiagnosticsContext.java b/jOOQ/src/main/java/org/jooq/DiagnosticsContext.java index fd56bce13b..773597571f 100644 --- a/jOOQ/src/main/java/org/jooq/DiagnosticsContext.java +++ b/jOOQ/src/main/java/org/jooq/DiagnosticsContext.java @@ -59,6 +59,17 @@ public interface DiagnosticsContext extends Scope { @Nullable QueryPart part(); + /** + * The transformed object from {@link #part()} if available, or + * null, if there was no specific transformation to attach the + * diagnostic to. + *

+ * This helps diagnosing pattern transformations as indicated by + * {@link DiagnosticsListener#transformPattern(DiagnosticsContext)}. + */ + @Nullable + QueryPart transformedPart(); + /** * A message describing the diagnostics and the object in question. */ diff --git a/jOOQ/src/main/java/org/jooq/DiagnosticsListener.java b/jOOQ/src/main/java/org/jooq/DiagnosticsListener.java index 78572297f2..293c41957e 100644 --- a/jOOQ/src/main/java/org/jooq/DiagnosticsListener.java +++ b/jOOQ/src/main/java/org/jooq/DiagnosticsListener.java @@ -41,6 +41,7 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; +import org.jooq.conf.Settings; import org.jooq.impl.DSL; import org.jooq.impl.ParserException; @@ -273,6 +274,16 @@ public interface DiagnosticsListener { + + + + + + + + + + diff --git a/jOOQ/src/main/java/org/jooq/conf/Settings.java b/jOOQ/src/main/java/org/jooq/conf/Settings.java index e40e9cf2c6..62a2fee6ac 100644 --- a/jOOQ/src/main/java/org/jooq/conf/Settings.java +++ b/jOOQ/src/main/java/org/jooq/conf/Settings.java @@ -133,6 +133,8 @@ public class Settings @XmlElement(defaultValue = "true") protected Boolean diagnosticsUnnecessaryWasNullCall = true; @XmlElement(defaultValue = "true") + protected Boolean diagnosticsPatterns = true; + @XmlElement(defaultValue = "true") protected Boolean diagnosticsTrivialCondition = true; @XmlElement(defaultValue = "true") protected Boolean diagnosticsNullCondition = true; @@ -1476,6 +1478,39 @@ public class Settings this.diagnosticsUnnecessaryWasNullCall = value; } + /** + * Whether to run the various pattern transformation diagnostics. + *

+ * {@link #transformPatterns} allows for applying numerous pattern transformations, which can be turned on separately when running + * diagnostics. This flag overrides the {@link #transformPatterns} flag in the diagnostics context. Individual pattern flags + * still allow to enable / disable the pattern for diagnostics. + *

+ * Diagnostics are turned off if no {@link org.jooq.Configuration#diagnosticsListenerProviders()} are configured. + * Once configured, this diagnostic is turned on by default. + *

+ * This feature is available in the commercial distribution only. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isDiagnosticsPatterns() { + return diagnosticsPatterns; + } + + /** + * Sets the value of the diagnosticsPatterns property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setDiagnosticsPatterns(Boolean value) { + this.diagnosticsPatterns = value; + } + /** * Whether to run the {@link org.jooq.DiagnosticsListener#trivialCondition(org.jooq.DiagnosticsContext) diagnostic. *

@@ -4953,6 +4988,11 @@ public class Settings return this; } + public Settings withDiagnosticsPatterns(Boolean value) { + setDiagnosticsPatterns(value); + return this; + } + public Settings withDiagnosticsTrivialCondition(Boolean value) { setDiagnosticsTrivialCondition(value); return this; @@ -6005,6 +6045,7 @@ public class Settings builder.append("diagnosticsTooManyColumnsFetched", diagnosticsTooManyColumnsFetched); builder.append("diagnosticsTooManyRowsFetched", diagnosticsTooManyRowsFetched); builder.append("diagnosticsUnnecessaryWasNullCall", diagnosticsUnnecessaryWasNullCall); + builder.append("diagnosticsPatterns", diagnosticsPatterns); builder.append("diagnosticsTrivialCondition", diagnosticsTrivialCondition); builder.append("diagnosticsNullCondition", diagnosticsNullCondition); builder.append("transformPatterns", transformPatterns); @@ -6530,6 +6571,15 @@ public class Settings return false; } } + if (diagnosticsPatterns == null) { + if (other.diagnosticsPatterns!= null) { + return false; + } + } else { + if (!diagnosticsPatterns.equals(other.diagnosticsPatterns)) { + return false; + } + } if (diagnosticsTrivialCondition == null) { if (other.diagnosticsTrivialCondition!= null) { return false; @@ -7793,6 +7843,7 @@ public class Settings result = ((prime*result)+((diagnosticsTooManyColumnsFetched == null)? 0 :diagnosticsTooManyColumnsFetched.hashCode())); result = ((prime*result)+((diagnosticsTooManyRowsFetched == null)? 0 :diagnosticsTooManyRowsFetched.hashCode())); result = ((prime*result)+((diagnosticsUnnecessaryWasNullCall == null)? 0 :diagnosticsUnnecessaryWasNullCall.hashCode())); + result = ((prime*result)+((diagnosticsPatterns == null)? 0 :diagnosticsPatterns.hashCode())); result = ((prime*result)+((diagnosticsTrivialCondition == null)? 0 :diagnosticsTrivialCondition.hashCode())); result = ((prime*result)+((diagnosticsNullCondition == null)? 0 :diagnosticsNullCondition.hashCode())); result = ((prime*result)+((transformPatterns == null)? 0 :transformPatterns.hashCode())); diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDiagnosticsContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDiagnosticsContext.java index eb4423f0f9..32750552ad 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultDiagnosticsContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDiagnosticsContext.java @@ -63,6 +63,7 @@ final class DefaultDiagnosticsContext extends AbstractScope implements Diagnosti private static final JooqLogger log = JooqLogger.getLogger(DefaultDiagnosticsContext.class); final QueryPart part; + final QueryPart transformedPart; final String message; ResultSet resultSet; DiagnosticsResultSet resultSetWrapper; @@ -93,6 +94,7 @@ final class DefaultDiagnosticsContext extends AbstractScope implements Diagnosti singleton(actualStatement), singletonList(actualStatement), null, + null, exception ); } @@ -105,6 +107,7 @@ final class DefaultDiagnosticsContext extends AbstractScope implements Diagnosti Set duplicateStatements, List repeatedStatements, QueryPart part, + QueryPart transformedPart, Throwable exception ) { super(configuration); @@ -115,6 +118,7 @@ final class DefaultDiagnosticsContext extends AbstractScope implements Diagnosti this.duplicateStatements = duplicateStatements == null ? emptySet() : duplicateStatements; this.repeatedStatements = repeatedStatements == null ? emptyList() : repeatedStatements; this.part = part; + this.transformedPart = transformedPart; this.exception = exception; } @@ -123,6 +127,11 @@ final class DefaultDiagnosticsContext extends AbstractScope implements Diagnosti return part; } + @Override + public final QueryPart transformedPart() { + return transformedPart; + } + @Override public final String message() { return message; diff --git a/jOOQ/src/main/java/org/jooq/impl/DiagnosticsConnection.java b/jOOQ/src/main/java/org/jooq/impl/DiagnosticsConnection.java index 6eb8d7f037..7f44ceb9f3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DiagnosticsConnection.java +++ b/jOOQ/src/main/java/org/jooq/impl/DiagnosticsConnection.java @@ -37,11 +37,11 @@ */ package org.jooq.impl; -import static java.lang.Boolean.FALSE; import static java.util.Arrays.asList; import static java.util.Collections.synchronizedMap; // ... // ... +// ... import static org.jooq.conf.ParamType.FORCE_INDEXED; import static org.jooq.impl.DSL.count; import static org.jooq.impl.DSL.noCondition; @@ -51,7 +51,6 @@ import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; @@ -70,6 +69,7 @@ import org.jooq.Query; import org.jooq.QueryPart; import org.jooq.RenderContext; // ... +// ... import org.jooq.Select; import org.jooq.conf.Settings; import org.jooq.impl.QOM.Eq; @@ -95,7 +95,8 @@ final class DiagnosticsConnection extends DefaultConnection { DiagnosticsConnection(Configuration configuration) { super(configuration.connectionProvider().acquire()); - this.configuration = configuration; + // [#7527] The Settings.diagnosticsPattern flag overrides the Settings.transformPatterns flag. + this.configuration = configuration.deriveSettings(s -> s.withTransformPatterns(true)); this.normalisingRenderer = configuration.deriveSettings(s -> s // Forcing all inline parameters to be indexed helps find opportunities to use bind variables @@ -175,8 +176,12 @@ final class DiagnosticsConnection extends DefaultConnection { configuration.connectionProvider().release(getDelegate()); } + final boolean checkPattern(Predicate test) { + return DiagnosticsListeners.checkPattern(configuration.settings(), test); + } + final boolean check(Predicate test) { - return !FALSE.equals(test.test(configuration.settings())); + return DiagnosticsListeners.check(configuration.settings(), test); } @SuppressWarnings("unchecked") @@ -218,7 +223,7 @@ final class DiagnosticsConnection extends DefaultConnection { listeners.duplicateStatements(new DefaultDiagnosticsContext( configuration, "Duplicate statements encountered.", - sql, normalised, duplicates, null, queries, null + sql, normalised, duplicates, null, queries, transformed, null )); } @@ -228,7 +233,7 @@ final class DiagnosticsConnection extends DefaultConnection { listeners.repeatedStatements(new DefaultDiagnosticsContext( configuration, "Repeated statements encountered.", - sql, normalised, null, repetitions, queries, null + sql, normalised, null, repetitions, queries, transformed, null )); } @@ -259,6 +264,19 @@ final class DiagnosticsConnection extends DefaultConnection { + + + + + + + + + + + + + @@ -282,7 +300,7 @@ final class DiagnosticsConnection extends DefaultConnection { listeners.exception(new DefaultDiagnosticsContext( configuration, "An unexpected exception has occurred. See exception for details.", - sql, normalised, null, null, queries, exception + sql, normalised, null, null, queries, transformed, exception )); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DiagnosticsListeners.java b/jOOQ/src/main/java/org/jooq/impl/DiagnosticsListeners.java index f9ff5dc682..c6c8d3b176 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DiagnosticsListeners.java +++ b/jOOQ/src/main/java/org/jooq/impl/DiagnosticsListeners.java @@ -63,8 +63,20 @@ final class DiagnosticsListeners implements DiagnosticsListener { return new DiagnosticsListeners(configuration.diagnosticsListenerProviders()); } - private final boolean check(DiagnosticsContext ctx, Predicate test) { - return !FALSE.equals(test.test(ctx.settings())); + private static final boolean check(DiagnosticsContext ctx, Predicate test) { + return check(ctx.settings(), test); + } + + static final boolean check(Settings settings, Predicate test) { + return !FALSE.equals(test.test(settings)); + } + + private static final boolean checkPattern(DiagnosticsContext ctx, Predicate test) { + return checkPattern(ctx.settings(), test); + } + + static final boolean checkPattern(Settings settings, Predicate test) { + return !FALSE.equals(settings.isDiagnosticsPatterns()) && check(settings, test); } @Override @@ -126,6 +138,13 @@ final class DiagnosticsListeners implements DiagnosticsListener { + + + + + + + diff --git a/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.18.0.xsd b/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.18.0.xsd index f4a6890e97..f1bb807d4a 100644 --- a/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.18.0.xsd +++ b/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.18.0.xsd @@ -343,6 +343,19 @@ Diagnostics are turned off if no {@link org.jooq.Configuration#diagnosticsListen Once configured, this diagnostic is turned on by default.]]> + + +{@link #transformPatterns} allows for applying numerous pattern transformations, which can be turned on separately when running +diagnostics. This flag overrides the {@link #transformPatterns} flag in the diagnostics context. Individual pattern flags +still allow to enable / disable the pattern for diagnostics. +

+Diagnostics are turned off if no {@link org.jooq.Configuration#diagnosticsListenerProviders()} are configured. +Once configured, this diagnostic is turned on by default. +

+This feature is available in the commercial distribution only.]]> + +