[#3340] Improved CREATE VIEW API
This commit is contained in:
parent
5b20df44ad
commit
e023c7177e
@ -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.
|
||||
|
||||
@ -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(")");
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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(
|
||||
|
||||
Loading…
Reference in New Issue
Block a user