[jOOQ/jOOQ#10188] Add Tools.visitSubquery(Context<?>, Select)

This commit is contained in:
Lukas Eder 2020-05-11 15:45:08 +02:00
parent 483a0e2a51
commit 4655b2fbdf
14 changed files with 65 additions and 152 deletions

View File

@ -76,6 +76,7 @@ import static org.jooq.impl.DSL.select;
import static org.jooq.impl.Keywords.K_AS;
import static org.jooq.impl.QueryPartListView.wrap;
import static org.jooq.impl.Tools.fieldNames;
import static org.jooq.impl.Tools.visitSubquery;
import static org.jooq.impl.Tools.BooleanDataKey.DATA_AS_REQUIRED;
import static org.jooq.impl.Tools.BooleanDataKey.DATA_UNALIAS_ALIASED_EXPRESSIONS;
@ -168,16 +169,7 @@ final class Alias<Q extends QueryPart> extends AbstractQueryPart {
&& SUPPORT_DERIVED_COLUMN_NAMES_SPECIAL1.contains(dialect)
&& (wrapped instanceof TableImpl || wrapped instanceof CommonTableExpressionImpl)) {
Select<Record> select =
select(asterisk()).from(((Table<?>) wrapped).as(alias));
context.sql('(')
.formatIndentStart().formatNewLine()
.subquery(true)
.visit(select)
.subquery(false)
.formatIndentEnd().formatNewLine()
.sql(')');
visitSubquery(context, select(asterisk()).from(((Table<?>) wrapped).as(alias)), true);
}
// [#1801] Some databases do not support "derived column names".
@ -239,13 +231,7 @@ final class Alias<Q extends QueryPart> extends AbstractQueryPart {
}
}
context.sql('(')
.formatIndentStart().formatNewLine()
.subquery(true)
.visit(select(fields).where(falseCondition()).unionAll(wrappedAsSelect))
.subquery(false)
.formatIndentEnd().formatNewLine()
.sql(')');
visitSubquery(context, select(fields).where(falseCondition()).unionAll(wrappedAsSelect), true);
}
}

View File

@ -38,6 +38,7 @@
package org.jooq.impl;
import static org.jooq.impl.Keywords.K_AS;
import static org.jooq.impl.Tools.visitSubquery;
import java.util.List;
@ -82,19 +83,10 @@ final class CommonTableExpressionImpl<R extends Record> extends AbstractTable<R>
@Override
public final void accept(Context<?> ctx) {
if (ctx.declareCTE())
ctx.visit(name)
.sql(' ')
.visit(K_AS)
.sql(" (")
.subquery(true)
.formatIndentStart()
.formatNewLine()
.visit(select)
.formatIndentEnd()
.formatNewLine()
.subquery(false)
.sql(')');
if (ctx.declareCTE()) {
ctx.visit(name).sql(' ').visit(K_AS).sql(' ');
visitSubquery(ctx, select, true);
}
else
ctx.visit(DSL.name(name.name));
}

View File

@ -39,6 +39,7 @@
package org.jooq.impl;
import static org.jooq.impl.Names.N_SELECT;
import static org.jooq.impl.Tools.visitSubquery;
import org.jooq.Clause;
import org.jooq.Context;
@ -89,13 +90,7 @@ final class DerivedTable<R extends Record> extends AbstractTable<R> {
@Override
public final void accept(Context<?> ctx) {
ctx.subquery(true)
.formatIndentStart()
.formatNewLine()
.visit(query)
.formatIndentEnd()
.formatNewLine()
.subquery(false);
visitSubquery(ctx, query);
}
@Override // Avoid AbstractTable implementation

View File

@ -43,6 +43,7 @@ import static org.jooq.Clause.CONDITION_EXISTS;
import static org.jooq.Clause.CONDITION_NOT_EXISTS;
import static org.jooq.impl.Keywords.K_EXISTS;
import static org.jooq.impl.Keywords.K_NOT_EXISTS;
import static org.jooq.impl.Tools.visitSubquery;
import org.jooq.Clause;
import org.jooq.Context;
@ -72,16 +73,8 @@ final class ExistsCondition extends AbstractCondition {
@Override
public final void accept(Context<?> ctx) {
ctx.visit(exists ? K_EXISTS : K_NOT_EXISTS)
.sql(" (")
.subquery(true)
.formatIndentStart()
.formatNewLine()
.visit(query)
.formatIndentEnd()
.formatNewLine()
.subquery(false)
.sql(')');
ctx.visit(exists ? K_EXISTS : K_NOT_EXISTS).sql(' ');
visitSubquery(ctx, query, true);
}
@Override

View File

@ -59,6 +59,7 @@ import static org.jooq.impl.Keywords.K_WITH;
import static org.jooq.impl.Names.N_JSON_TABLE;
import static org.jooq.impl.Names.N_OPENJSON;
import static org.jooq.impl.SQLDataType.JSONB;
import static org.jooq.impl.Tools.visitSubquery;
import java.util.ArrayList;
import java.util.List;
@ -233,22 +234,16 @@ implements
).as(col.field)
);
ctx.sql('(')
.formatIndentStart()
.formatNewLine()
.subquery(true)
.visit(
select(cols).from(hasOrdinality
? "jsonb_path_query({0}, {1}::jsonpath) {with} {ordinality} {as} t(j, o)"
: "jsonb_path_query({0}, {1}::jsonpath) {as} t(j)",
json.getType() == JSONB.class ? json : json.cast(JSONB),
path
)
)
.subquery(false)
.formatIndentEnd()
.formatNewLine()
.sql(')');
visitSubquery(
ctx,
select(cols).from(hasOrdinality
? "jsonb_path_query({0}, {1}::jsonpath) {with} {ordinality} {as} t(j, o)"
: "jsonb_path_query({0}, {1}::jsonpath) {as} t(j)",
json.getType() == JSONB.class ? json : json.cast(JSONB),
path
),
true
);
}
@ -275,14 +270,6 @@ implements

View File

@ -42,6 +42,7 @@ import static java.lang.Boolean.TRUE;
import static org.jooq.impl.DSL.select;
import static org.jooq.impl.DSL.table;
import static org.jooq.impl.DSL.val;
import static org.jooq.impl.Tools.visitSubquery;
import org.jooq.Configuration;
import org.jooq.Context;
@ -92,21 +93,11 @@ final class QuantifiedSelectImpl<R extends Record> extends AbstractQueryPart imp
@Override
public final void accept(Context<?> ctx) {
ctx.visit(quantifier.toKeyword());
boolean extraParentheses = false ;
ctx.visit(quantifier.toKeyword());
ctx.sql(extraParentheses ? " ((" : " (");
ctx.subquery(true)
.formatIndentStart()
.formatNewLine()
.visit(delegate(ctx.configuration()))
.formatIndentEnd()
.formatNewLine()
.subquery(false);
visitSubquery(ctx, delegate(ctx.configuration()));
ctx.sql(extraParentheses ? "))" : ")");
}

View File

@ -63,6 +63,7 @@ import static org.jooq.impl.DSL.notExists;
import static org.jooq.impl.DSL.select;
import static org.jooq.impl.Keywords.K_IS;
import static org.jooq.impl.Keywords.K_NOT;
import static org.jooq.impl.Tools.visitSubquery;
import java.util.Set;
@ -130,15 +131,7 @@ final class RowIsDistinctFrom extends AbstractCondition {
if (rhsRow != null)
ctx.visit(rhsRow);
else
ctx.sql('(')
.subquery(true)
.formatIndentStart()
.formatNewLine()
.visit(rhsSelect)
.formatIndentEnd()
.formatNewLine()
.subquery(false)
.sql(')');
visitSubquery(ctx, rhsSelect, true);
if (!not)
ctx.sql(')');
@ -154,15 +147,7 @@ final class RowIsDistinctFrom extends AbstractCondition {
if (rhsRow != null)
ctx.visit(rhsRow);
else
ctx.sql('(')
.subquery(true)
.formatIndentStart()
.formatNewLine()
.visit(rhsSelect)
.formatIndentEnd()
.formatNewLine()
.subquery(false)
.sql(')');
visitSubquery(ctx, rhsSelect, true);
}

View File

@ -65,6 +65,7 @@ import static org.jooq.impl.DSL.selectCount;
import static org.jooq.impl.Keywords.K_IS_NOT_NULL;
import static org.jooq.impl.Keywords.K_IS_NULL;
import static org.jooq.impl.Tools.fieldNameStrings;
import static org.jooq.impl.Tools.visitSubquery;
import java.util.ArrayList;
import java.util.List;
@ -146,13 +147,7 @@ final class RowIsNull extends AbstractCondition {
if (row != null)
ctx.visit(row);
else
ctx.sql('(')
.formatIndentStart().formatNewLine()
.subquery(true)
.visit(select)
.subquery(false)
.formatIndentEnd().formatNewLine()
.sql(')');
visitSubquery(ctx, select, true);
ctx.sql(' ')
.visit(isNull ? K_IS_NULL : K_IS_NOT_NULL);

View File

@ -60,6 +60,7 @@ import static org.jooq.impl.DSL.name;
import static org.jooq.impl.DSL.notExists;
import static org.jooq.impl.DSL.row;
import static org.jooq.impl.DSL.select;
import static org.jooq.impl.Tools.visitSubquery;
import java.util.Set;
@ -219,13 +220,7 @@ final class RowSubqueryCondition extends AbstractCondition {
ctx.subquery(true)
.formatIndentStart()
.formatNewLine()
.visit(right)
.formatIndentEnd()
.formatNewLine()
.subquery(false);
visitSubquery(ctx, right);

View File

@ -39,6 +39,7 @@
package org.jooq.impl;
import static org.jooq.impl.Names.N_SELECT;
import static org.jooq.impl.Tools.visitSubquery;
import org.jooq.Context;
import org.jooq.DataType;
@ -60,14 +61,6 @@ final class ScalarSubquery<T> extends AbstractField<T> {
@Override
public final void accept(Context<?> ctx) {
ctx.sql('(')
.subquery(true)
.formatIndentStart()
.formatNewLine()
.visit(query)
.formatIndentEnd()
.formatNewLine()
.subquery(false)
.sql(')');
visitSubquery(ctx, query, true);
}
}

View File

@ -2206,15 +2206,33 @@ final class Tools {
return cursor.ctx.exception();
}
static final void visitSubquery(Context<?> ctx, QueryPart query) {
visitSubquery(ctx, query, false);
}
static final void visitSubquery(Context<?> ctx, QueryPart query, boolean parentheses) {
if (parentheses)
ctx.sql('(');
ctx.subquery(true)
.formatIndentStart()
.formatNewLine()
.visit(query)
.formatIndentEnd()
.formatNewLine()
.subquery(false);
if (parentheses)
ctx.sql(')');
}
/**
* Visit each query part from a collection, given a context.
*/
static final <C extends Context<? super C>> C visitAll(C ctx, Collection<? extends QueryPart> parts) {
if (parts != null) {
for (QueryPart part : parts) {
if (parts != null)
for (QueryPart part : parts)
ctx.visit(part);
}
}
return ctx;
}
@ -2223,11 +2241,9 @@ final class Tools {
* Visit each query part from an array, given a context.
*/
static final <C extends Context<? super C>> C visitAll(C ctx, QueryPart[] parts) {
if (parts != null) {
for (QueryPart part : parts) {
if (parts != null)
for (QueryPart part : parts)
ctx.visit(part);
}
}
return ctx;
}

View File

@ -79,6 +79,7 @@ import static org.jooq.impl.Keywords.K_ROW;
import static org.jooq.impl.Keywords.K_SET;
import static org.jooq.impl.Keywords.K_UPDATE;
import static org.jooq.impl.Keywords.K_WHERE;
import static org.jooq.impl.Tools.visitSubquery;
import java.util.Arrays;
import java.util.Collection;
@ -600,15 +601,7 @@ final class UpdateQueryImpl<R extends Record> extends AbstractStoreQuery<R> impl
if (multiValue != null)
select = select(multiValue.fields());
ctx.sql('(')
.formatIndentStart()
.formatNewLine()
.subquery(true)
.visit(select)
.subquery(false)
.formatIndentEnd()
.formatNewLine()
.sql(')');
visitSubquery(ctx, select, true);
}
ctx.end(UPDATE_SET_ASSIGNMENT);

View File

@ -60,6 +60,7 @@ import static org.jooq.impl.Keywords.K_ROW;
import static org.jooq.impl.Keywords.K_TABLE;
import static org.jooq.impl.Keywords.K_VALUES;
import static org.jooq.impl.Names.N_VALUES;
import static org.jooq.impl.Tools.visitSubquery;
import java.util.Set;
@ -133,13 +134,7 @@ final class Values<R extends Record> extends AbstractTable<R> {
selects = selects.unionAll(select);
}
ctx.formatIndentStart()
.formatNewLine()
.subquery(true)
.visit(selects)
.subquery(false)
.formatIndentEnd()
.formatNewLine();
visitSubquery(ctx, selects);
}
// [#915] Native support of VALUES(..)

View File

@ -56,6 +56,7 @@ import static org.jooq.impl.Keywords.K_VALUE;
import static org.jooq.impl.Keywords.K_XMLTABLE;
import static org.jooq.impl.Names.N_XMLTABLE;
import static org.jooq.impl.SQLDataType.XML;
import static org.jooq.impl.Tools.visitSubquery;
import static org.jooq.impl.XMLPassingMechanism.BY_REF;
import static org.jooq.impl.XMLPassingMechanism.BY_VALUE;
@ -271,10 +272,6 @@ implements