[#3340] Improved CREATE VIEW API

This commit is contained in:
Lukas Eder 2014-07-22 15:34:56 +02:00
parent 5b20df44ad
commit e023c7177e
5 changed files with 104 additions and 14 deletions

View File

@ -4811,7 +4811,15 @@ public interface DSLContext {
* @see DSL#createView(String, String...)
*/
@Support
CreateViewAsStep<Record> createView(String viewName, String... columnNames);
CreateViewAsStep<Record> createView(String viewName, String... fieldNames);
/**
* Create a new DSL <code>CREATE VIEW</code> statement.
*
* @see DSL#createView(Table, Field...)
*/
@Support
CreateViewAsStep<Record> createView(Table<?> view, Field<?>... fields);
/**
* Create a new DSL <code>CREATE INDEX</code> statement.

View File

@ -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<R extends Record> 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<R extends Record> 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<Field<?>>(fieldsByName(columnNames)))
.qualify(false)
.visit(new QueryPartList<Field<?>>(fields))
.qualify(qualify)
.sql(")");
}

View File

@ -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 <code>CREATE VIEW</code> statement.
*
* @see DSLContext#createView(Table, Field...)
*/
@Support
public static CreateViewAsStep createView(Table<?> view, Field<?>... fields) {
return using(new DefaultConfiguration()).createView(view, fields);
}
/**

View File

@ -1615,7 +1615,12 @@ public class DefaultDSLContext implements DSLContext, Serializable {
@Override
public CreateViewAsStep<Record> createView(String viewName, String... fieldNames) {
return new CreateViewImpl<Record>(configuration, viewName, fieldNames);
return createView(tableByName(viewName), Utils.fieldsByName(viewName, fieldNames));
}
@Override
public CreateViewAsStep<Record> createView(Table<?> view, Field<?>... fields) {
return new CreateViewImpl<Record>(configuration, view, fields);
}
@Override

View File

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