From 494924a1ab6ae48898fb3cdced8fde3eb3079523 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Thu, 4 Dec 2014 18:46:59 +0100 Subject: [PATCH] [#3842] Add DSL.field(Name), DSL.table(Name), DSL.schema(Name), DSL.sequence(Name) methods --- jOOQ/src/main/java/org/jooq/impl/DSL.java | 216 +++++++++++++++++- .../src/main/java/org/jooq/impl/NameImpl.java | 17 +- .../java/org/jooq/impl/QualifiedField.java | 25 +- .../java/org/jooq/impl/QualifiedTable.java | 17 +- .../main/java/org/jooq/impl/SchemaImpl.java | 5 + 5 files changed, 243 insertions(+), 37 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 4970035387..7bad603f4b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -5060,6 +5060,28 @@ public class DSL { return new SchemaImpl(name); } + /** + * Create a qualified schema, given its schema name. + *

+ * This constructs a schema reference given the schema's qualified name. + * jOOQ will render the schema name according to your + * {@link Settings#getRenderNameStyle()} settings. Choose + * {@link RenderNameStyle#QUOTED} to prevent syntax errors and/or SQL + * injection. + *

+ * Example:

+     * // This schema...
+     * schema(name("MY_SCHEMA"));
+     *
+     * // ... will render this SQL on SQL Server with RenderNameStyle.QUOTED set
+     * [MY_SCHEMA]
+     * 
+ */ + @Support + public static Schema schema(Name name) { + return new SchemaImpl(name); + } + /** * Create a qualified sequence, given its sequence name. *

@@ -5149,6 +5171,81 @@ public class DSL { return new SequenceImpl(name, schema, type); } + /** + * Create a qualified sequence, given its sequence name. + *

+ * This constructs a sequence reference given the sequence's qualified name. + * jOOQ will render the sequence name according to your + * {@link Settings#getRenderNameStyle()} settings. Choose + * {@link RenderNameStyle#QUOTED} to prevent syntax errors and/or SQL + * injection. + *

+ * Example:

+     * // This sequence...
+     * sequence(name("MY_SCHEMA", "MY_SEQUENCE"));
+     *
+     * // ... will render this SQL on SQL Server with RenderNameStyle.QUOTED set
+     * [MY_SCHEMA].[MY_SEQUENCE]
+     * 
+ */ + @Support + public static Sequence sequence(Name name) { + return sequence(name, BigInteger.class); + } + + /** + * Create a qualified sequence, given its sequence name. + *

+ * This constructs a sequence reference given the sequence's qualified name. + * jOOQ will render the sequence name according to your + * {@link Settings#getRenderNameStyle()} settings. Choose + * {@link RenderNameStyle#QUOTED} to prevent syntax errors and/or SQL + * injection. + *

+ * Example:

+     * // This sequence...
+     * sequence(name("MY_SCHEMA", "MY_SEQUENCE"));
+     *
+     * // ... will render this SQL on SQL Server with RenderNameStyle.QUOTED set
+     * [MY_SCHEMA].[MY_SEQUENCE]
+     * 
+ */ + @Support + public static Sequence sequence(Name name, Class type) { + return sequence(name, getDataType(type)); + } + + /** + * Create a qualified sequence, given its sequence name. + *

+ * This constructs a sequence reference given the sequence's qualified name. + * jOOQ will render the sequence name according to your + * {@link Settings#getRenderNameStyle()} settings. Choose + * {@link RenderNameStyle#QUOTED} to prevent syntax errors and/or SQL + * injection. + *

+ * Example:

+     * // This sequence...
+     * sequence(name("MY_SCHEMA", "MY_SEQUENCE"));
+     *
+     * // ... will render this SQL on SQL Server with RenderNameStyle.QUOTED set
+     * [MY_SCHEMA].[MY_SEQUENCE]
+     * 
+ */ + @Support + public static Sequence sequence(Name name, DataType type) { + if (name == null) + throw new NullPointerException(); + + if (name.getName().length < 1 || name.getName().length > 2) + throw new IllegalArgumentException("Must provide a qualified name of length 1 or 2 : " + name); + + String n = name.getName()[name.getName().length - 1]; + Schema s = name.getName().length == 2 ? schema(name(name.getName()[0])) : null; + + return new SequenceImpl(n, s, type); + } + /** * Create a qualified table, given its table name. *

@@ -5172,7 +5269,29 @@ public class DSL { */ @Support public static Table tableByName(String... qualifiedName) { - return new QualifiedTable(qualifiedName); + return table(name(qualifiedName)); + } + + /** + * Create a qualified table, given its table name. + *

+ * This constructs a table reference given the table's qualified name. jOOQ + * will render the table name according to your + * {@link Settings#getRenderNameStyle()} settings. Choose + * {@link RenderNameStyle#QUOTED} to prevent syntax errors and/or SQL + * injection. + *

+ * Example:

+     * // This table...
+     * tableByName("MY_SCHEMA", "MY_TABLE");
+     *
+     * // ... will render this SQL on SQL Server with RenderNameStyle.QUOTED set
+     * [MY_SCHEMA].[MY_TABLE]
+     * 
+ */ + @Support + public static Table table(Name name) { + return new QualifiedTable(name); } /** @@ -5279,7 +5398,100 @@ public class DSL { */ @Support public static Field fieldByName(DataType type, String... qualifiedName) { - return new QualifiedField(type, qualifiedName); + return field(name(qualifiedName), type); + } + + /** + * Create a qualified field, given its (qualified) field name. + *

+ * This constructs a field reference given the field's qualified name. jOOQ + * will render the field name according to your + * {@link Settings#getRenderNameStyle()} settings. Choose + * {@link RenderNameStyle#QUOTED} to prevent syntax errors and/or SQL + * injection. + *

+ * Example:

+     * // This field...
+     * field(name("MY_SCHEMA", "MY_TABLE", "MY_FIELD"));
+     *
+     * // ... will render this SQL on SQL Server with RenderNameStyle.QUOTED set
+     * [MY_SCHEMA].[MY_TABLE].[MY_FIELD]
+     * 
+ *

+ * Another example:

+     * create.select(field("length({1})", Integer.class, field(name("TITLE"))))
+     *       .from(table(name("T_BOOK")))
+     *       .fetch();
+     *
+     * // ... will execute this SQL on SQL Server:
+     * select length([TITLE]) from [T_BOOK]
+     * 
+ */ + @Support + public static Field field(Name name) { + return field(name, Object.class); + } + + /** + * Create a qualified field, given its (qualified) field name. + *

+ * This constructs a field reference given the field's qualified name. jOOQ + * will render the field name according to your + * {@link Settings#getRenderNameStyle()} settings. Choose + * {@link RenderNameStyle#QUOTED} to prevent syntax errors and/or SQL + * injection. + *

+ * Example:

+     * // This field...
+     * field(name("MY_SCHEMA", "MY_TABLE", "MY_FIELD"));
+     *
+     * // ... will render this SQL on SQL Server with RenderNameStyle.QUOTED set
+     * [MY_SCHEMA].[MY_TABLE].[MY_FIELD]
+     * 
+ *

+ * Another example:

+     * create.select(field("length({1})", Integer.class, field(name("TITLE"))))
+     *       .from(table(name("T_BOOK")))
+     *       .fetch();
+     *
+     * // ... will execute this SQL on SQL Server:
+     * select length([TITLE]) from [T_BOOK]
+     * 
+ */ + @Support + public static Field field(Name name, Class type) { + return field(name, getDataType(type)); + } + + /** + * Create a qualified field, given its (qualified) field name. + *

+ * This constructs a field reference given the field's qualified name. jOOQ + * will render the field name according to your + * {@link Settings#getRenderNameStyle()} settings. Choose + * {@link RenderNameStyle#QUOTED} to prevent syntax errors and/or SQL + * injection. + *

+ * Example:

+     * // This field...
+     * field(name("MY_SCHEMA", "MY_TABLE", "MY_FIELD"));
+     *
+     * // ... will render this SQL on SQL Server with RenderNameStyle.QUOTED set
+     * [MY_SCHEMA].[MY_TABLE].[MY_FIELD]
+     * 
+ *

+ * Another example:

+     * create.select(field("length({1})", Integer.class, field(name("TITLE"))))
+     *       .from(table(name("T_BOOK")))
+     *       .fetch();
+     *
+     * // ... will execute this SQL on SQL Server:
+     * select length([TITLE]) from [T_BOOK]
+     * 
+ */ + @Support + public static Field field(Name name, DataType type) { + return new QualifiedField(type, name); } // ------------------------------------------------------------------------- diff --git a/jOOQ/src/main/java/org/jooq/impl/NameImpl.java b/jOOQ/src/main/java/org/jooq/impl/NameImpl.java index 373d21cf99..f34447d915 100644 --- a/jOOQ/src/main/java/org/jooq/impl/NameImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/NameImpl.java @@ -73,14 +73,21 @@ class NameImpl extends AbstractQueryPart implements Name { @Override public final void accept(Context ctx) { - String separator = ""; - for (String name : qualifiedName) { - if (!StringUtils.isEmpty(name)) { - ctx.sql(separator).literal(name); - separator = "."; + // [#3437] Fully qualify this field only if allowed in the current context + if (ctx.qualify()) { + String separator = ""; + + for (String name : qualifiedName) { + if (!StringUtils.isEmpty(name)) { + ctx.sql(separator).literal(name); + separator = "."; + } } } + else { + ctx.literal(qualifiedName[qualifiedName.length - 1]); + } } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/QualifiedField.java b/jOOQ/src/main/java/org/jooq/impl/QualifiedField.java index b60dd22a01..b2980fffa6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QualifiedField.java +++ b/jOOQ/src/main/java/org/jooq/impl/QualifiedField.java @@ -43,6 +43,7 @@ package org.jooq.impl; import org.jooq.Context; import org.jooq.DataType; import org.jooq.Field; +import org.jooq.Name; import org.jooq.RenderContext; /** @@ -58,12 +59,12 @@ class QualifiedField extends AbstractField { */ private static final long serialVersionUID = 6937002867156868761L; - private final String[] sql; + private final Name name; - QualifiedField(DataType type, String... sql) { - super(sql[sql.length - 1], type); + QualifiedField(DataType type, Name name) { + super(name.getName()[name.getName().length - 1], type); - this.sql = sql; + this.name = name; } // ------------------------------------------------------------------------ @@ -72,20 +73,6 @@ class QualifiedField extends AbstractField { @Override public final void accept(Context ctx) { - - // [#3437] Fully qualify this field only if allowed in the current context - if (ctx.qualify()) { - String separator = ""; - - for (String string : sql) { - ctx.sql(separator); - ctx.literal(string); - - separator = "."; - } - } - else { - ctx.literal(sql[sql.length - 1]); - } + ctx.visit(name); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/QualifiedTable.java b/jOOQ/src/main/java/org/jooq/impl/QualifiedTable.java index 0c86296de8..b7913b63e6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QualifiedTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/QualifiedTable.java @@ -45,6 +45,7 @@ import static org.jooq.Clause.TABLE_REFERENCE; import org.jooq.Clause; import org.jooq.Context; +import org.jooq.Name; import org.jooq.Record; import org.jooq.RenderContext; import org.jooq.Table; @@ -63,12 +64,12 @@ class QualifiedTable extends AbstractTable { private static final long serialVersionUID = 6937002867156868761L; private static final Clause[] CLAUSES = { TABLE, TABLE_REFERENCE }; - private final String[] sql; + private final Name name; - QualifiedTable(String... sql) { - super(sql[sql.length - 1]); + QualifiedTable(Name name) { + super(name.getName()[name.getName().length - 1]); - this.sql = sql; + this.name = name; } // ------------------------------------------------------------------------ @@ -77,13 +78,7 @@ class QualifiedTable extends AbstractTable { @Override public final void accept(Context ctx) { - String separator = ""; - for (String string : sql) { - ctx.sql(separator); - ctx.literal(string); - - separator = "."; - } + ctx.visit(name); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/SchemaImpl.java b/jOOQ/src/main/java/org/jooq/impl/SchemaImpl.java index b8ff24c035..5fa0f40fb7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SchemaImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SchemaImpl.java @@ -49,6 +49,7 @@ import java.util.List; import org.jooq.Clause; import org.jooq.Context; +import org.jooq.Name; import org.jooq.Schema; import org.jooq.Sequence; import org.jooq.Table; @@ -69,6 +70,10 @@ public class SchemaImpl extends AbstractQueryPart implements Schema { private final String schemaName; + SchemaImpl(Name name) { + this(name.getName()[0]); + } + public SchemaImpl(String name) { super();