[jOOQ/jOOQ#10188] Add Tools.visitSubquery(Context<?>, Select)
This commit is contained in:
parent
483a0e2a51
commit
4655b2fbdf
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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 ? "))" : ")");
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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(..)
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user