From e023c7177e17cba5bdc61d64f89556823f8cd053 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 22 Jul 2014 15:34:56 +0200 Subject: [PATCH] [#3340] Improved CREATE VIEW API --- jOOQ/src/main/java/org/jooq/DSLContext.java | 10 ++- .../java/org/jooq/impl/CreateViewImpl.java | 23 ++++--- jOOQ/src/main/java/org/jooq/impl/DSL.java | 14 +++- .../java/org/jooq/impl/DefaultDSLContext.java | 7 +- .../java/org/jooq/test/VisitContextTest.java | 64 +++++++++++++++++++ 5 files changed, 104 insertions(+), 14 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/DSLContext.java b/jOOQ/src/main/java/org/jooq/DSLContext.java index e7843e3327..fa99808768 100644 --- a/jOOQ/src/main/java/org/jooq/DSLContext.java +++ b/jOOQ/src/main/java/org/jooq/DSLContext.java @@ -4811,7 +4811,15 @@ public interface DSLContext { * @see DSL#createView(String, String...) */ @Support - CreateViewAsStep createView(String viewName, String... columnNames); + CreateViewAsStep createView(String viewName, String... fieldNames); + + /** + * Create a new DSL CREATE VIEW statement. + * + * @see DSL#createView(Table, Field...) + */ + @Support + CreateViewAsStep createView(Table view, Field... fields); /** * Create a new DSL CREATE INDEX statement. diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateViewImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateViewImpl.java index faefb091b0..68bde73a38 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateViewImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateViewImpl.java @@ -43,8 +43,6 @@ package org.jooq.impl; import static org.jooq.Clause.CREATE_VIEW; import static org.jooq.Clause.CREATE_VIEW_AS; import static org.jooq.Clause.CREATE_VIEW_NAME; -import static org.jooq.impl.DSL.name; -import static org.jooq.impl.Utils.fieldsByName; import org.jooq.Clause; import org.jooq.Configuration; @@ -54,6 +52,7 @@ import org.jooq.CreateViewFinalStep; import org.jooq.Field; import org.jooq.Record; import org.jooq.Select; +import org.jooq.Table; /** * @author Lukas Eder @@ -71,15 +70,15 @@ class CreateViewImpl extends AbstractQuery implements private static final long serialVersionUID = 8904572826501186329L; private static final Clause[] CLAUSES = { CREATE_VIEW }; - private final String viewName; - private final String[] columnNames; + private final Table view; + private final Field[] fields; private Select select; - CreateViewImpl(Configuration configuration, String viewName, String[] columnNames) { + CreateViewImpl(Configuration configuration, Table view, Field[] fields) { super(configuration); - this.viewName = viewName; - this.columnNames = columnNames; + this.view = view; + this.fields = fields; } // ------------------------------------------------------------------------ @@ -101,11 +100,15 @@ class CreateViewImpl extends AbstractQuery implements ctx.start(CREATE_VIEW_NAME) .keyword("create view") .sql(" ") - .visit(name(viewName)); + .visit(view); + + if (fields != null && fields.length > 0) { + boolean qualify = ctx.qualify(); - if (columnNames != null && columnNames.length > 0) { ctx.sql("(") - .visit(new QueryPartList>(fieldsByName(columnNames))) + .qualify(false) + .visit(new QueryPartList>(fields)) + .qualify(qualify) .sql(")"); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 8491e6bf32..47a7b15a8f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -4234,8 +4234,18 @@ public class DSL { * @see DSLContext#createView(String, String...) */ @Support - public static CreateViewAsStep createView(String viewName, String... columnNames) { - return using(new DefaultConfiguration()).createView(viewName, columnNames); + public static CreateViewAsStep createView(String viewName, String... fieldNames) { + return createView(tableByName(viewName), Utils.fieldsByName(viewName, fieldNames)); + } + + /** + * Create a new DSL CREATE VIEW statement. + * + * @see DSLContext#createView(Table, Field...) + */ + @Support + public static CreateViewAsStep createView(Table view, Field... fields) { + return using(new DefaultConfiguration()).createView(view, fields); } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java index c5088965f4..90ba5c1103 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java @@ -1615,7 +1615,12 @@ public class DefaultDSLContext implements DSLContext, Serializable { @Override public CreateViewAsStep createView(String viewName, String... fieldNames) { - return new CreateViewImpl(configuration, viewName, fieldNames); + return createView(tableByName(viewName), Utils.fieldsByName(viewName, fieldNames)); + } + + @Override + public CreateViewAsStep createView(Table view, Field... fields) { + return new CreateViewImpl(configuration, view, fields); } @Override diff --git a/jOOQ/src/test/java/org/jooq/test/VisitContextTest.java b/jOOQ/src/test/java/org/jooq/test/VisitContextTest.java index fafa5728c8..2f823be49f 100644 --- a/jOOQ/src/test/java/org/jooq/test/VisitContextTest.java +++ b/jOOQ/src/test/java/org/jooq/test/VisitContextTest.java @@ -68,6 +68,12 @@ import static org.jooq.Clause.CONDITION_OR; import static org.jooq.Clause.CREATE_INDEX; import static org.jooq.Clause.CREATE_SEQUENCE; import static org.jooq.Clause.CREATE_SEQUENCE_SEQUENCE; +import static org.jooq.Clause.CREATE_TABLE; +import static org.jooq.Clause.CREATE_TABLE_AS; +import static org.jooq.Clause.CREATE_TABLE_NAME; +import static org.jooq.Clause.CREATE_VIEW; +import static org.jooq.Clause.CREATE_VIEW_AS; +import static org.jooq.Clause.CREATE_VIEW_NAME; import static org.jooq.Clause.DELETE; import static org.jooq.Clause.DELETE_DELETE; import static org.jooq.Clause.DELETE_WHERE; @@ -761,6 +767,64 @@ public class VisitContextTest extends AbstractTest { ctx.createIndex("i").on(TABLE1, FIELD_ID1, FIELD_NAME1)); } + @Test + public void test_CREATE_VIEW_AS() { + + // Omit "dual" with Postgres + ctx.configuration().set(POSTGRES); + assertEvents(asList( + asList(CREATE_VIEW), + asList(CREATE_VIEW, CREATE_VIEW_NAME), + asList(CREATE_VIEW, CREATE_VIEW_NAME, TABLE), + asList(CREATE_VIEW, CREATE_VIEW_NAME, TABLE, TABLE_REFERENCE), + asList(CREATE_VIEW, CREATE_VIEW_NAME, FIELD), + asList(CREATE_VIEW, CREATE_VIEW_NAME, FIELD), + asList(CREATE_VIEW, CREATE_VIEW_AS), + asList(CREATE_VIEW, CREATE_VIEW_AS, SELECT), + asList(CREATE_VIEW, CREATE_VIEW_AS, SELECT, SELECT_SELECT), + asList(CREATE_VIEW, CREATE_VIEW_AS, SELECT, SELECT_SELECT, FIELD), + asList(CREATE_VIEW, CREATE_VIEW_AS, SELECT, SELECT_SELECT, FIELD, FIELD_VALUE), + asList(CREATE_VIEW, CREATE_VIEW_AS, SELECT, SELECT_INTO), + asList(CREATE_VIEW, CREATE_VIEW_AS, SELECT, SELECT_FROM), + asList(CREATE_VIEW, CREATE_VIEW_AS, SELECT, SELECT_WHERE), + asList(CREATE_VIEW, CREATE_VIEW_AS, SELECT, SELECT_START_WITH), + asList(CREATE_VIEW, CREATE_VIEW_AS, SELECT, SELECT_CONNECT_BY), + asList(CREATE_VIEW, CREATE_VIEW_AS, SELECT, SELECT_GROUP_BY), + asList(CREATE_VIEW, CREATE_VIEW_AS, SELECT, SELECT_HAVING), + asList(CREATE_VIEW, CREATE_VIEW_AS, SELECT, SELECT_WINDOW), + asList(CREATE_VIEW, CREATE_VIEW_AS, SELECT, SELECT_ORDER_BY) + ), + ctx.createView("v", "a", "b").as(select(one()))); + } + + @Test + public void test_CREATE_TABLE_AS() { + + // Omit "dual" with Postgres + ctx.configuration().set(POSTGRES); + assertEvents(asList( + asList(CREATE_TABLE), + asList(CREATE_TABLE, CREATE_TABLE_NAME), + asList(CREATE_TABLE, CREATE_TABLE_NAME, TABLE), + asList(CREATE_TABLE, CREATE_TABLE_NAME, TABLE, TABLE_REFERENCE), + asList(CREATE_TABLE, CREATE_TABLE_AS), + asList(CREATE_TABLE, CREATE_TABLE_AS, SELECT), + asList(CREATE_TABLE, CREATE_TABLE_AS, SELECT, SELECT_SELECT), + asList(CREATE_TABLE, CREATE_TABLE_AS, SELECT, SELECT_SELECT, FIELD), + asList(CREATE_TABLE, CREATE_TABLE_AS, SELECT, SELECT_SELECT, FIELD, FIELD_VALUE), + asList(CREATE_TABLE, CREATE_TABLE_AS, SELECT, SELECT_INTO), + asList(CREATE_TABLE, CREATE_TABLE_AS, SELECT, SELECT_FROM), + asList(CREATE_TABLE, CREATE_TABLE_AS, SELECT, SELECT_WHERE), + asList(CREATE_TABLE, CREATE_TABLE_AS, SELECT, SELECT_START_WITH), + asList(CREATE_TABLE, CREATE_TABLE_AS, SELECT, SELECT_CONNECT_BY), + asList(CREATE_TABLE, CREATE_TABLE_AS, SELECT, SELECT_GROUP_BY), + asList(CREATE_TABLE, CREATE_TABLE_AS, SELECT, SELECT_HAVING), + asList(CREATE_TABLE, CREATE_TABLE_AS, SELECT, SELECT_WINDOW), + asList(CREATE_TABLE, CREATE_TABLE_AS, SELECT, SELECT_ORDER_BY) + ), + ctx.createTable("v").as(select(one()))); + } + @Test public void test_DROP_INDEX() { assertEvents(asList(