From 8aacd73c7698ce65dec4bb1f39946ad93c7cad3d Mon Sep 17 00:00:00 2001 From: lukaseder Date: Tue, 11 Dec 2018 12:00:45 +0100 Subject: [PATCH] [#8107] Add Name.Quoted Name.quoted() --- jOOQ/src/main/java/org/jooq/Name.java | 42 +++++++++++++++++++ jOOQ/src/main/java/org/jooq/impl/DSL.java | 11 ++--- .../java/org/jooq/impl/QualifiedName.java | 22 ++++++++-- .../java/org/jooq/impl/UnqualifiedName.java | 23 ++++++---- 4 files changed, 83 insertions(+), 15 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/Name.java b/jOOQ/src/main/java/org/jooq/Name.java index fe3b051b52..228ee54341 100644 --- a/jOOQ/src/main/java/org/jooq/Name.java +++ b/jOOQ/src/main/java/org/jooq/Name.java @@ -59,6 +59,7 @@ import static org.jooq.SQLDialect.POSTGRES; import java.util.function.BiFunction; import java.util.function.Function; +import org.jooq.conf.RenderQuotedNames; import org.jooq.conf.Settings; /** @@ -73,6 +74,42 @@ import org.jooq.conf.Settings; */ public interface Name extends QueryPart { + /** + * A flag indicating whether the name is quoted or not. + *

+ * Quoting of names can be overridden by + * {@link Settings#getRenderQuotedNames()}. + * + * @author Lukas Eder + */ + enum Quoted { + + /** + * The name is explicitly quoted. + */ + QUOTED, + + /** + * The name is explicitly not quoted. + */ + UNQUOTED, + + /** + * The name is not quoted explicitly. + *

+ * The behaviour of this name's quoting is governed by + * {@link RenderQuotedNames#EXPLICIT_DEFAULT_QUOTED} and + * {@link RenderQuotedNames#EXPLICIT_DEFAULT_UNQUOTED}. + */ + DEFAULT, + + /** + * The {@link Name#qualified()} name has mixed values for individual + * {@link Name#quoted()} flags. + */ + MIXED + } + /** * Get the first segment of the qualified name (usually a {@link Catalog} or {@link Schema} name). */ @@ -100,6 +137,11 @@ public interface Name extends QueryPart { */ Name unqualifiedName(); + /** + * Whether this is a quoted name. + */ + Quoted quoted(); + /** * This name, quoted. */ diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index e1c1598004..1e1591326f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -245,6 +245,7 @@ import org.jooq.MergeKeyStep9; import org.jooq.MergeKeyStepN; import org.jooq.MergeUsingStep; import org.jooq.Name; +import org.jooq.Name.Quoted; import org.jooq.Operator; import org.jooq.OrderField; import org.jooq.OrderedAggregateFunction; @@ -9032,7 +9033,7 @@ public class DSL { * @return A {@link QueryPart} that will render the SQL identifier */ public static Name quotedName(String unqualifiedName) { - return new UnqualifiedName(unqualifiedName, true); + return new UnqualifiedName(unqualifiedName, Quoted.QUOTED); } /** @@ -9046,7 +9047,7 @@ public class DSL { * @return A {@link QueryPart} that will render the SQL identifier */ public static Name quotedName(String... qualifiedName) { - return new QualifiedName(qualifiedName, true); + return new QualifiedName(qualifiedName, Quoted.QUOTED); } /** @@ -9074,7 +9075,7 @@ public class DSL { * @return A {@link QueryPart} that will render the SQL identifier */ public static Name unquotedName(String unqualifiedName) { - return new UnqualifiedName(unqualifiedName, false); + return new UnqualifiedName(unqualifiedName, Quoted.UNQUOTED); } /** @@ -9089,9 +9090,9 @@ public class DSL { */ public static Name unquotedName(String... qualifiedName) { if (qualifiedName == null || qualifiedName.length != 1) - return new QualifiedName(qualifiedName, false); + return new QualifiedName(qualifiedName, Quoted.UNQUOTED); else - return new UnqualifiedName(qualifiedName[0], false); + return new UnqualifiedName(qualifiedName[0], Quoted.UNQUOTED); } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/QualifiedName.java b/jOOQ/src/main/java/org/jooq/impl/QualifiedName.java index d51b050821..a6896157f4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QualifiedName.java +++ b/jOOQ/src/main/java/org/jooq/impl/QualifiedName.java @@ -37,6 +37,9 @@ */ package org.jooq.impl; +import static org.jooq.Name.Quoted.DEFAULT; +import static org.jooq.Name.Quoted.MIXED; + import org.jooq.Context; import org.jooq.Name; import org.jooq.tools.StringUtils; @@ -56,10 +59,10 @@ final class QualifiedName extends AbstractName { private final UnqualifiedName[] qualifiedName; QualifiedName(String[] qualifiedName) { - this(qualifiedName, null); + this(qualifiedName, DEFAULT); } - QualifiedName(String[] qualifiedName, Boolean quoted) { + QualifiedName(String[] qualifiedName, Quoted quoted) { this(names(qualifiedName, quoted)); } @@ -71,7 +74,7 @@ final class QualifiedName extends AbstractName { this.qualifiedName = qualifiedName; } - private static final UnqualifiedName[] names(String[] qualifiedName, Boolean quoted) { + private static final UnqualifiedName[] names(String[] qualifiedName, Quoted quoted) { String[] nonEmpty = nonEmpty(qualifiedName); UnqualifiedName[] result = new UnqualifiedName[nonEmpty.length]; @@ -200,6 +203,19 @@ final class QualifiedName extends AbstractName { return qualifiedName[qualifiedName.length - 1]; } + @Override + public final Quoted quoted() { + Quoted result = null; + + for (UnqualifiedName name : qualifiedName) + if (result == null) + result = name.quoted(); + else if (result != name.quoted()) + return MIXED; + + return result == null ? DEFAULT : result; + } + @Override public final Name quotedName() { Name[] result = new Name[qualifiedName.length]; diff --git a/jOOQ/src/main/java/org/jooq/impl/UnqualifiedName.java b/jOOQ/src/main/java/org/jooq/impl/UnqualifiedName.java index 3ccf87ae86..41e0172394 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UnqualifiedName.java +++ b/jOOQ/src/main/java/org/jooq/impl/UnqualifiedName.java @@ -37,6 +37,10 @@ */ package org.jooq.impl; +import static org.jooq.Name.Quoted.DEFAULT; +import static org.jooq.Name.Quoted.QUOTED; +import static org.jooq.Name.Quoted.UNQUOTED; + import org.jooq.Context; import org.jooq.Name; import org.jooq.conf.RenderQuotedNames; @@ -55,13 +59,13 @@ final class UnqualifiedName extends AbstractName { private static final long serialVersionUID = 8562325639223483938L; private final String name; - private final Boolean quoted; + private final Quoted quoted; UnqualifiedName(String name) { - this(name, null); + this(name, DEFAULT); } - UnqualifiedName(String name, Boolean quoted) { + UnqualifiedName(String name, Quoted quoted) { this.name = name; this.quoted = quoted; } @@ -73,8 +77,8 @@ final class UnqualifiedName extends AbstractName { boolean previous = ctx.quote(); boolean current = q == RenderQuotedNames.ALWAYS - || q == RenderQuotedNames.EXPLICIT_DEFAULT_QUOTED && (quoted == null || quoted) - || q == RenderQuotedNames.EXPLICIT_DEFAULT_UNQUOTED && quoted != null && quoted; + || q == RenderQuotedNames.EXPLICIT_DEFAULT_QUOTED && (quoted == DEFAULT || quoted == QUOTED) + || q == RenderQuotedNames.EXPLICIT_DEFAULT_UNQUOTED && quoted == QUOTED; ctx.quote(current); ctx.literal(name); @@ -106,14 +110,19 @@ final class UnqualifiedName extends AbstractName { return this; } + @Override + public final Quoted quoted() { + return quoted; + } + @Override public final Name quotedName() { - return new UnqualifiedName(name, true); + return new UnqualifiedName(name, QUOTED); } @Override public final Name unquotedName() { - return new UnqualifiedName(name, false); + return new UnqualifiedName(name, UNQUOTED); } @Override