[#2665] Implement SPI for RenderContext and BindContext listening to

allow for custom SQL transformation

 * Fixed semantics of UPDATE clauses
 * Added an UPDATE WHERE test case
This commit is contained in:
Lukas Eder 2013-08-08 16:36:53 +02:00
parent d7a5b3e9a0
commit c8f2ac0b14
87 changed files with 640 additions and 341 deletions

View File

@ -53,12 +53,14 @@ public enum Clause {
// -------------------------------------------------------------------------
CATALOG,
CATALOG_REFERENCE,
// -------------------------------------------------------------------------
// Clauses used in a any type of statement to model schema references
// -------------------------------------------------------------------------
SCHEMA,
SCHEMA_REFERENCE,
// -------------------------------------------------------------------------
// Clauses used in a any type of statement to model table references
@ -80,6 +82,9 @@ public enum Clause {
*/
TABLE,
TABLE_ALIAS,
TABLE_REFERENCE,
/**
*
*/
@ -104,6 +109,9 @@ public enum Clause {
// -------------------------------------------------------------------------
FIELD,
FIELD_ALIAS,
FIELD_REFERENCE,
FIELD_VALUE,
FIELD_CASE,
FIELD_ROW,
@ -229,11 +237,70 @@ public enum Clause {
// -------------------------------------------------------------------------
// Clauses that are used in an UPDATE statement
// -------------------------------------------------------------------------
/**
* A complete <code>UPDATE</code> statement.
*/
UPDATE,
/**
* An <code>UPDATE</code> clause within an {@link #UPDATE} statement.
* <p>
* This clause surrounds
* <ul>
* <li>the <code>UPDATE</code> keyword</li>
* <li>the table that is being updated</li>
* </ul>
*/
UPDATE_UPDATE,
/**
* A <code>SET</code> clause within an {@link #UPDATE} statement.
* <p>
* This clause surrounds
* <ul>
* <li>the <code>SET</code> keyword</li>
* <li>one or several assignments: {@link #UPDATE_SET_ASSIGNMENT}</li>
* </ul>
*/
UPDATE_SET,
/**
* An assigment within a {@link #UPDATE_SET} clause within an
* {@link #UPDATE} statement.
* <p>
* This clause surrounds
* <ul>
* <li>a column</li>
* <li>an assigment operator</li>
* <li>a value being assigned</li>
* </ul>
*/
UPDATE_SET_ASSIGNMENT,
/**
* A <code>WHERE</code> clause within an {@link #UPDATE} statement.
* <p>
* This clause surrounds
* <ul>
* <li>the <code>WHERE</code> keyword</li>
* <li>a {@link #CONDITION}</li>
* </ul>
*/
UPDATE_WHERE,
/**
* A <code>RETURNING</code> clause within an {@link #UPDATE} statement.
* <p>
* This clause surrounds
* <ul>
* <li>the <code>RETURNING</code> keyword</li>
* <li>several {@link #FIELD} "clauses"</li>
* </ul>
*/
UPDATE_RETURNING,

View File

@ -70,19 +70,20 @@ public interface QueryPartInternal extends QueryPart {
void bind(BindContext ctx) throws DataAccessException;
/**
* The {@link Clause} that is represented by this query part.
* The {@link Clause}s that are represented by this query part.
* <p>
* {@link QueryPart}s can specify a <code>Clause</code> for which an event
* will be emitted {@link Context#start(Clause) before} and
* {@link Context#end(Clause) after} visiting the the query part through
* {@link Context#visit(QueryPart)}
* {@link QueryPart}s can specify several <code>Clause</code>s for which an
* event will be emitted {@link Context#start(Clause) before} (in forward
* order) and {@link Context#end(Clause) after} (in reverse order) visiting
* the the query part through {@link Context#visit(QueryPart)}
* <p>
* This method is for JOOQ INTERNAL USE only. Do not reference directly
*
* @return The <code>Clause</code> represented by this query part or
* <code>null</code> if this query part does not represent a clause.
* @return The <code>Clause</code>s represented by this query part or
* <code>null</code> or an empty array if this query part does not
* represent a clause.
*/
Clause clause();
Clause[] clauses();
/**
* Check whether this {@link QueryPart} is able to declare fields in a

View File

@ -35,12 +35,14 @@
*/
package org.jooq.impl;
import static org.jooq.Clause.CONDITION;
import static org.jooq.impl.DSL.condition;
import static org.jooq.impl.DSL.exists;
import static org.jooq.impl.DSL.notExists;
import java.util.Arrays;
import org.jooq.Clause;
import org.jooq.Condition;
import org.jooq.Field;
import org.jooq.Operator;
@ -55,10 +57,16 @@ abstract class AbstractCondition extends AbstractQueryPart implements Condition
/**
* Generated UID
*/
private static final long serialVersionUID = -6683692251799468624L;
private static final long serialVersionUID = -6683692251799468624L;
private static final Clause[] CLAUSES = { CONDITION };
AbstractCondition() {}
@Override
public Clause[] clauses() {
return CLAUSES;
}
@Override
public final Condition and(Condition other) {
return new CombinedCondition(Operator.AND, Arrays.asList(this, other));

View File

@ -36,6 +36,7 @@
package org.jooq.impl;
import static org.jooq.Clause.DUMMY;
import static org.jooq.impl.Utils.DATA_OMIT_CLAUSE_EVENT_EMISSION;
import java.util.ArrayDeque;
import java.util.Deque;
@ -216,10 +217,11 @@ abstract class AbstractContext<C extends Context<C>> implements Context<C> {
@Override
public final C visit(QueryPart part) {
if (part != null) {
Clause clause = visitListeners.length > 0 ? clause(part) : null;
Clause[] clauses = visitListeners.length > 0 ? clause(part) : null;
if (clause != null)
start(clause);
if (clauses != null)
for (int i = 0; i < clauses.length; i++)
start(clauses[i]);
start(part);
QueryPartInternal internal = (QueryPartInternal) part;
@ -247,8 +249,9 @@ abstract class AbstractContext<C extends Context<C>> implements Context<C> {
}
end(part);
if (clause != null)
end(clause);
if (clauses != null)
for (int i = clauses.length - 1; i >= 0; i--)
end(clauses[i]);
}
return (C) this;
@ -270,9 +273,9 @@ abstract class AbstractContext<C extends Context<C>> implements Context<C> {
* {@link Context#visit(QueryPart)} event has to be issued here in
* <code>AbstractContext</code>.
*/
private final Clause clause(QueryPart part) {
if (part instanceof QueryPartInternal) {
return ((QueryPartInternal) part).clause();
private final Clause[] clause(QueryPart part) {
if (part instanceof QueryPartInternal && data(DATA_OMIT_CLAUSE_EVENT_EMISSION) == null) {
return ((QueryPartInternal) part).clauses();
}
return null;

View File

@ -98,9 +98,9 @@ abstract class AbstractDelegatingQuery<Q extends Query> extends AbstractQueryPar
}
@Override
public final Clause clause() {
public final Clause[] clauses() {
if (delegate instanceof QueryPartInternal) {
return ((QueryPartInternal) delegate).clause();
return ((QueryPartInternal) delegate).clauses();
}
return null;

View File

@ -35,7 +35,7 @@
*/
package org.jooq.impl;
import static org.jooq.Clause.DUMMY;
import static org.jooq.Clause.FIELD;
import static org.jooq.Comparator.EQUALS;
import static org.jooq.Comparator.GREATER;
import static org.jooq.Comparator.GREATER_OR_EQUAL;
@ -99,7 +99,8 @@ abstract class AbstractField<T> extends AbstractQueryPart implements Field<T> {
/**
* Generated UID
*/
private static final long serialVersionUID = 2884811923648354905L;
private static final long serialVersionUID = 2884811923648354905L;
private static final Clause[] CLAUSES = { FIELD };
private final String name;
private final DataType<T> dataType;
@ -122,8 +123,8 @@ abstract class AbstractField<T> extends AbstractQueryPart implements Field<T> {
public abstract void bind(BindContext context);
@Override
public /* non-final for now */ Clause clause() {
return DUMMY;
public Clause[] clauses() {
return CLAUSES;
}
// ------------------------------------------------------------------------

View File

@ -35,10 +35,7 @@
*/
package org.jooq.impl;
import static org.jooq.Clause.DUMMY;
import org.jooq.BindContext;
import org.jooq.Clause;
import org.jooq.Configuration;
import org.jooq.DataType;
import org.jooq.Field;
@ -75,11 +72,6 @@ abstract class AbstractFunction<T> extends AbstractField<T> {
ctx.visit(getFunction0(ctx.configuration()));
}
@Override
public final Clause clause() {
return DUMMY;
}
final Field<?>[] getArguments() {
return arguments;
}

View File

@ -35,8 +35,11 @@
*/
package org.jooq.impl;
import static org.jooq.Clause.FIELD;
import static org.jooq.Clause.FIELD_VALUE;
import static org.jooq.conf.ParamType.INLINED;
import org.jooq.Clause;
import org.jooq.DataType;
import org.jooq.Param;
import org.jooq.RenderContext;
@ -51,7 +54,8 @@ abstract class AbstractParam<T> extends AbstractField<T> implements Param<T> {
/**
* Generated UID
*/
private static final long serialVersionUID = 1311856649676227970L;
private static final long serialVersionUID = 1311856649676227970L;
private static final Clause[] CLAUSES = { FIELD, FIELD_VALUE };
private final String paramName;
T value;
@ -80,6 +84,15 @@ abstract class AbstractParam<T> extends AbstractField<T> implements Param<T> {
return paramName == null ? String.valueOf(value) : paramName;
}
// ------------------------------------------------------------------------
// XXX: QueryPart API
// ------------------------------------------------------------------------
@Override
public final Clause[] clauses() {
return CLAUSES;
}
// ------------------------------------------------------------------------
// XXX: Param API
// ------------------------------------------------------------------------

View File

@ -293,8 +293,8 @@ public abstract class AbstractRoutine<T> extends AbstractQueryPart implements Ro
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
@Override

View File

@ -50,7 +50,6 @@ import java.util.List;
import java.util.Map;
import org.jooq.BindContext;
import org.jooq.Clause;
import org.jooq.Configuration;
import org.jooq.DSLContext;
import org.jooq.ExecuteContext;
@ -149,17 +148,15 @@ abstract class AbstractStoreQuery<R extends Record> extends AbstractQuery implem
return returned;
}
final void toSQLReturning(RenderContext context, Clause clause) {
final void toSQLReturning(RenderContext context) {
if (!returning.isEmpty()) {
switch (context.configuration().dialect()) {
case FIREBIRD:
case POSTGRES:
context.formatSeparator()
.start(clause)
.keyword("returning")
.sql(" ")
.visit(returning)
.end(clause);
.visit(returning);
break;
default:

View File

@ -35,6 +35,7 @@
*/
package org.jooq.impl;
import static org.jooq.Clause.TABLE;
import static org.jooq.impl.DSL.table;
import static org.jooq.impl.DSL.val;
@ -44,6 +45,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.jooq.Clause;
import org.jooq.DataType;
import org.jooq.DivideByOnStep;
import org.jooq.Field;
@ -75,7 +77,8 @@ abstract class AbstractTable<R extends Record> extends AbstractQueryPart impleme
/**
* Generated UID
*/
private static final long serialVersionUID = 3155496238969274871L;
private static final long serialVersionUID = 3155496238969274871L;
private static final Clause[] CLAUSES = { TABLE };
private final Schema schema;
private final String name;
@ -91,6 +94,15 @@ abstract class AbstractTable<R extends Record> extends AbstractQueryPart impleme
this.name = name;
}
// ------------------------------------------------------------------------
// XXX: QueryPart API
// ------------------------------------------------------------------------
@Override
public Clause[] clauses() {
return CLAUSES;
}
// ------------------------------------------------------------------------
// XXX: TableLike API
// ------------------------------------------------------------------------

View File

@ -224,8 +224,8 @@ class Alias<Q extends QueryPart> extends AbstractQueryPart {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
@Override

View File

@ -176,8 +176,8 @@ class ArrayTable extends AbstractTable<Record> {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
private final Table<Record> table(Configuration configuration) {
@ -304,8 +304,8 @@ class ArrayTable extends AbstractTable<Record> {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
@Override

View File

@ -129,8 +129,8 @@ class ArrayTableSimulation extends AbstractTable<Record> {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
@Override

View File

@ -37,6 +37,7 @@
package org.jooq.impl;
import static java.util.Arrays.asList;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_BETWEEN;
import static org.jooq.SQLDialect.ASE;
import static org.jooq.SQLDialect.CUBRID;
@ -66,13 +67,14 @@ import org.jooq.RenderContext;
*/
class BetweenCondition<T> extends AbstractCondition implements BetweenAndStep<T> {
private static final long serialVersionUID = -4666251100802237878L;
private static final long serialVersionUID = -4666251100802237878L;
private static final Clause[] CLAUSES = { CONDITION, CONDITION_BETWEEN };
private final boolean symmetric;
private final boolean not;
private final Field<T> field;
private final Field<T> minValue;
private Field<T> maxValue;
private final boolean symmetric;
private final boolean not;
private final Field<T> field;
private final Field<T> minValue;
private Field<T> maxValue;
BetweenCondition(Field<T> field, Field<T> minValue, boolean not, boolean symmetric) {
this.field = field;
@ -109,8 +111,8 @@ class BetweenCondition<T> extends AbstractCondition implements BetweenAndStep<T>
}
@Override
public final Clause clause() {
return CONDITION_BETWEEN;
public final Clause[] clauses() {
return CLAUSES;
}
private final QueryPartInternal delegate(Configuration configuration) {
@ -151,8 +153,8 @@ class BetweenCondition<T> extends AbstractCondition implements BetweenAndStep<T>
}
@Override
public final Clause clause() {
return CONDITION_BETWEEN;
public final Clause[] clauses() {
return CLAUSES;
}
}
}

View File

@ -35,14 +35,11 @@
*/
package org.jooq.impl;
import static org.jooq.Clause.DUMMY;
import java.util.ArrayList;
import java.util.List;
import org.jooq.BindContext;
import org.jooq.CaseConditionStep;
import org.jooq.Clause;
import org.jooq.Condition;
import org.jooq.Field;
import org.jooq.RenderContext;
@ -140,9 +137,4 @@ class CaseConditionStepImpl<T> extends AbstractField<T> implements CaseCondition
context.keyword("end")
.formatIndentLockEnd();
}
@Override
public final Clause clause() {
return DUMMY;
}
}

View File

@ -36,6 +36,7 @@
package org.jooq.impl;
import static org.jooq.Clause.CATALOG;
import static org.jooq.Clause.CATALOG_REFERENCE;
import java.util.Collections;
import java.util.List;
@ -59,8 +60,9 @@ public class CatalogImpl extends AbstractQueryPart implements Catalog {
/**
* Generated UID
*/
private static final long serialVersionUID = -3650318934053960244L;
private final String catalogName;
private static final long serialVersionUID = -3650318934053960244L;
private static final Clause[] CLAUSES = { CATALOG, CATALOG_REFERENCE };
private final String catalogName;
public CatalogImpl(String name) {
super();
@ -82,8 +84,8 @@ public class CatalogImpl extends AbstractQueryPart implements Catalog {
}
@Override
public final Clause clause() {
return CATALOG;
public final Clause[] clauses() {
return CLAUSES;
}
@Override

View File

@ -36,6 +36,7 @@
package org.jooq.impl;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_AND;
import static org.jooq.Clause.CONDITION_OR;
import static org.jooq.Operator.AND;
@ -58,6 +59,8 @@ import org.jooq.RenderContext;
class CombinedCondition extends AbstractCondition {
private static final long serialVersionUID = -7373293246207052549L;
private static final Clause[] CLAUSES_AND = { CONDITION, CONDITION_AND };
private static final Clause[] CLAUSES_OR = { CONDITION, CONDITION_OR };
private final Operator operator;
private final List<Condition> conditions;
@ -99,8 +102,8 @@ class CombinedCondition extends AbstractCondition {
}
@Override
public final Clause clause() {
return operator == AND ? CONDITION_AND : CONDITION_OR;
public final Clause[] clauses() {
return operator == AND ? CLAUSES_AND : CLAUSES_OR;
}
@Override

View File

@ -37,6 +37,7 @@
package org.jooq.impl;
import static java.util.Arrays.asList;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_COMPARISON;
import static org.jooq.Comparator.LIKE;
import static org.jooq.Comparator.LIKE_IGNORE_CASE;
@ -59,12 +60,13 @@ import org.jooq.SQLDialect;
*/
class CompareCondition extends AbstractCondition {
private static final long serialVersionUID = -747240442279619486L;
private static final long serialVersionUID = -747240442279619486L;
private static final Clause[] CLAUSES = { CONDITION, CONDITION_COMPARISON };
private final Field<?> field1;
private final Field<?> field2;
private final Comparator comparator;
private final Character escape;
private final Field<?> field1;
private final Field<?> field2;
private final Comparator comparator;
private final Character escape;
CompareCondition(Field<?> field1, Field<?> field2, Comparator comparator) {
this(field1, field2, comparator, null);
@ -131,7 +133,7 @@ class CompareCondition extends AbstractCondition {
}
@Override
public final Clause clause() {
return CONDITION_COMPARISON;
public final Clause[] clauses() {
return CLAUSES;
}
}

View File

@ -123,7 +123,7 @@ class ConditionProviderImpl extends AbstractQueryPart implements ConditionProvid
}
@Override
public final Clause clause() {
public final Clause[] clauses() {
return null;
}

View File

@ -35,6 +35,7 @@
*/
package org.jooq.impl;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_COMPARISON;
import static org.jooq.impl.DSL.inline;
import static org.jooq.impl.DSL.val;
@ -56,11 +57,12 @@ class Contains<T> extends AbstractCondition {
/**
* Generated UID
*/
private static final long serialVersionUID = 6146303086487338550L;
private static final long serialVersionUID = 6146303086487338550L;
private static final Clause[] CLAUSES = { CONDITION, CONDITION_COMPARISON };
private final Field<T> lhs;
private final Field<T> rhs;
private final T value;
private final Field<T> lhs;
private final Field<T> rhs;
private final T value;
Contains(Field<T> field, T value) {
this.lhs = field;
@ -85,8 +87,8 @@ class Contains<T> extends AbstractCondition {
}
@Override
public final Clause clause() {
return CONDITION_COMPARISON;
public final Clause[] clauses() {
return CLAUSES;
}
private final Condition condition() {
@ -132,8 +134,8 @@ class Contains<T> extends AbstractCondition {
}
@Override
public final Clause clause() {
return CONDITION_COMPARISON;
public final Clause[] clauses() {
return CLAUSES;
}
private final Field<T> rhs() {

View File

@ -97,7 +97,7 @@ public abstract class CustomCondition extends AbstractCondition {
* {@inheritDoc}
*/
@Override
public Clause clause() {
public Clause[] clauses() {
return null;
}

View File

@ -98,8 +98,8 @@ public abstract class CustomField<T> extends AbstractField<T> {
* {@inheritDoc}
*/
@Override
public Clause clause() {
return null;
public Clause[] clauses() {
return super.clauses();
}
// -------------------------------------------------------------------------

View File

@ -108,7 +108,7 @@ public abstract class CustomQueryPart extends AbstractQueryPart {
* {@inheritDoc}
*/
@Override
public Clause clause() {
public Clause[] clauses() {
return null;
}

View File

@ -59,6 +59,7 @@ import org.jooq.Table;
class DeleteQueryImpl<R extends Record> extends AbstractQuery implements DeleteQuery<R> {
private static final long serialVersionUID = -1943687511774150929L;
private static final Clause[] CLAUSES = { DELETE };
private final Table<R> table;
private final ConditionProviderImpl condition;
@ -135,7 +136,7 @@ class DeleteQueryImpl<R extends Record> extends AbstractQuery implements DeleteQ
}
@Override
public final Clause clause() {
return DELETE;
public final Clause[] clauses() {
return CLAUSES;
}
}

View File

@ -36,10 +36,7 @@
package org.jooq.impl;
import static org.jooq.Clause.TABLE;
import org.jooq.BindContext;
import org.jooq.Clause;
import org.jooq.Record;
import org.jooq.RenderContext;
import org.jooq.Schema;
@ -127,11 +124,6 @@ class Dual extends AbstractTable<Record> {
@Override
public final void bind(BindContext context) {}
@Override
public final Clause clause() {
return TABLE;
}
@Override
final Fields<Record> fields0() {
return new Fields<Record>();

View File

@ -36,6 +36,7 @@
package org.jooq.impl;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_COMPARISON;
import org.jooq.BindContext;
@ -47,7 +48,8 @@ import org.jooq.RenderContext;
*/
class FalseCondition extends AbstractCondition {
private static final long serialVersionUID = -3972466479081463547L;
private static final long serialVersionUID = -3972466479081463547L;
private static final Clause[] CLAUSES = { CONDITION, CONDITION_COMPARISON };
@Override
public void bind(BindContext context) {}
@ -58,8 +60,8 @@ class FalseCondition extends AbstractCondition {
}
@Override
public final Clause clause() {
return CONDITION_COMPARISON;
public final Clause[] clauses() {
return CLAUSES;
}
FalseCondition() {}

View File

@ -72,8 +72,8 @@ class FieldCondition extends AbstractCondition {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
private final QueryPartInternal delegate(Configuration configuration) {

View File

@ -139,8 +139,8 @@ class FieldMapForInsert extends AbstractQueryPartMap<Field<?>, Field<?>> {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
final void putFields(Collection<? extends Field<?>> fields) {

View File

@ -107,8 +107,8 @@ class FieldMapForUpdate extends AbstractQueryPartMap<Field<?>, Field<?>> {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
final void set(Map<? extends Field<?>, ?> map) {

View File

@ -140,8 +140,8 @@ class FieldMapsForInsert extends AbstractQueryPart {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
// -------------------------------------------------------------------------

View File

@ -258,8 +258,8 @@ class Fields<R extends Record> extends AbstractQueryPart implements RecordType<R
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
// -------------------------------------------------------------------------

View File

@ -146,8 +146,8 @@ implements VersionsBetweenAndStep<R, T> {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
@Override

View File

@ -55,7 +55,6 @@ import java.util.Collection;
import org.jooq.AggregateFunction;
import org.jooq.BindContext;
import org.jooq.Clause;
import org.jooq.DataType;
import org.jooq.Field;
import org.jooq.Name;
@ -183,11 +182,6 @@ class Function<T> extends AbstractField<T> implements
// XXX QueryPart API
// -------------------------------------------------------------------------
@Override
public final Clause clause() {
return DUMMY;
}
@Override
public final void bind(BindContext context) {
if (term == LIST_AGG && asList(CUBRID, H2, HSQLDB, MARIADB, MYSQL).contains(context.configuration().dialect())) {

View File

@ -105,8 +105,8 @@ class FunctionTable<R extends Record> extends AbstractTable<R> {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
@Override

View File

@ -36,6 +36,7 @@
package org.jooq.impl;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_IN;
import static org.jooq.Clause.CONDITION_IN_NOT;
import static org.jooq.Comparator.IN;
@ -55,12 +56,14 @@ import org.jooq.RenderContext;
*/
class InCondition<T> extends AbstractCondition {
private static final long serialVersionUID = -1653924248576930761L;
private static final int IN_LIMIT = 1000;
private static final long serialVersionUID = -1653924248576930761L;
private static final int IN_LIMIT = 1000;
private static final Clause[] CLAUSES_IN = { CONDITION, CONDITION_IN };
private static final Clause[] CLAUSES_IN_NOT = { CONDITION, CONDITION_IN_NOT };
private final Field<T> field;
private final Field<?>[] values;
private final Comparator comparator;
private final Field<T> field;
private final Field<?>[] values;
private final Comparator comparator;
InCondition(Field<T> field, Field<?>[] values, Comparator comparator) {
this.field = field;
@ -69,8 +72,8 @@ class InCondition<T> extends AbstractCondition {
}
@Override
public final Clause clause() {
return comparator == IN ? CONDITION_IN : CONDITION_IN_NOT;
public final Clause[] clauses() {
return comparator == IN ? CLAUSES_IN : CLAUSES_IN_NOT;
}
@Override

View File

@ -38,7 +38,6 @@ package org.jooq.impl;
import static java.util.Arrays.asList;
import static org.jooq.Clause.INSERT;
import static org.jooq.Clause.INSERT_RETURNING;
import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.MYSQL;
@ -65,12 +64,13 @@ import org.jooq.exception.SQLDialectNotSupportedException;
*/
class InsertQueryImpl<R extends Record> extends AbstractStoreQuery<R> implements InsertQuery<R> {
private static final long serialVersionUID = 4466005417945353842L;
private static final long serialVersionUID = 4466005417945353842L;
private static final Clause[] CLAUSES = { INSERT };
private final FieldMapForUpdate updateMap;
private final FieldMapsForInsert insertMaps;
private boolean onDuplicateKeyUpdate;
private boolean onDuplicateKeyIgnore;
private final FieldMapForUpdate updateMap;
private final FieldMapsForInsert insertMaps;
private boolean onDuplicateKeyUpdate;
private boolean onDuplicateKeyIgnore;
InsertQueryImpl(Configuration configuration, Table<R> into) {
super(configuration, into);
@ -317,8 +317,8 @@ class InsertQueryImpl<R extends Record> extends AbstractStoreQuery<R> implements
}
@Override
public final Clause clause() {
return INSERT;
public final Clause[] clauses() {
return CLAUSES;
}
private final void toSQLInsert(RenderContext context) {
@ -332,7 +332,7 @@ class InsertQueryImpl<R extends Record> extends AbstractStoreQuery<R> implements
.sql(" ")
.visit(insertMaps);
toSQLReturning(context, INSERT_RETURNING);
toSQLReturning(context);
}
private final void bindInsert(BindContext context) {

View File

@ -56,11 +56,12 @@ class InsertSelectQueryImpl<R extends Record> extends AbstractQuery implements I
/**
* Generated UID
*/
private static final long serialVersionUID = -1540775270159018516L;
private static final long serialVersionUID = -1540775270159018516L;
private static final Clause[] CLAUSES = { INSERT };
private final Table<?> into;
private final Field<?>[] fields;
private final Select<?> select;
private final Table<?> into;
private final Field<?>[] fields;
private final Select<?> select;
InsertSelectQueryImpl(Configuration configuration, Table<?> into, Field<?>[] fields, Select<?> select) {
super(configuration);
@ -98,7 +99,7 @@ class InsertSelectQueryImpl<R extends Record> extends AbstractQuery implements I
}
@Override
public final Clause clause() {
return INSERT;
public final Clause[] clauses() {
return CLAUSES;
}
}

View File

@ -97,8 +97,8 @@ class IsDistinctFrom<T> extends AbstractCondition {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
/**

View File

@ -36,6 +36,7 @@
package org.jooq.impl;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_NULL;
import static org.jooq.Clause.CONDITION_NULL_NOT;
@ -49,10 +50,12 @@ import org.jooq.RenderContext;
*/
class IsNull extends AbstractCondition {
private static final long serialVersionUID = -747240442279619486L;
private static final long serialVersionUID = -747240442279619486L;
private static final Clause[] CLAUSES_NULL = { CONDITION, CONDITION_NULL };
private static final Clause[] CLAUSES_NULL_NOT = { CONDITION, CONDITION_NULL_NOT };
private final Field<?> field;
private final boolean isNull;
private final Field<?> field;
private final boolean isNull;
IsNull(Field<?> field, boolean isNull) {
this.field = field;
@ -70,7 +73,7 @@ class IsNull extends AbstractCondition {
}
@Override
public final Clause clause() {
return isNull ? CONDITION_NULL : CONDITION_NULL_NOT;
public final Clause[] clauses() {
return isNull ? CLAUSES_NULL : CLAUSES_NULL_NOT;
}
}

View File

@ -37,6 +37,7 @@ package org.jooq.impl;
import static java.util.Arrays.asList;
import static org.jooq.Clause.DUMMY;
import static org.jooq.Clause.TABLE;
import static org.jooq.Clause.TABLE_JOIN;
import static org.jooq.Clause.TABLE_JOIN_CROSS;
import static org.jooq.Clause.TABLE_JOIN_INNER;
@ -101,6 +102,7 @@ class JoinTable extends AbstractTable<Record> implements TableOptionalOnStep, Ta
* Generated UID
*/
private static final long serialVersionUID = 8377996833996498178L;
private static final Clause[] CLAUSES = { TABLE, TABLE_JOIN };
private final Table<?> lhs;
private final Table<?> rhs;
@ -341,8 +343,8 @@ class JoinTable extends AbstractTable<Record> implements TableOptionalOnStep, Ta
}
@Override
public final Clause clause() {
return TABLE_JOIN;
public final Clause[] clauses() {
return CLAUSES;
}
@Override

View File

@ -67,7 +67,7 @@ public class KeywordImpl extends AbstractQueryPart implements Keyword {
public final void bind(BindContext ctx) {}
@Override
public final Clause clause() {
public final Clause[] clauses() {
return null;
}
}

View File

@ -323,8 +323,8 @@ class Limit extends AbstractQueryPart {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
/**

View File

@ -198,6 +198,7 @@ implements
* Generated UID
*/
private static final long serialVersionUID = -8835479296876774391L;
private static final Clause[] CLAUSES = { MERGE };
private final Table<R> table;
private final ConditionProviderImpl on;
@ -1199,7 +1200,7 @@ implements
}
@Override
public final Clause clause() {
return MERGE;
public final Clause[] clauses() {
return CLAUSES;
}
}

View File

@ -76,8 +76,8 @@ class NameImpl extends AbstractQueryPart implements Name {
public final void bind(BindContext context) {}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
@Override

View File

@ -35,6 +35,7 @@
*/
package org.jooq.impl;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_NOT;
import org.jooq.BindContext;
@ -44,7 +45,8 @@ import org.jooq.RenderContext;
class NotCondition extends AbstractCondition {
private static final long serialVersionUID = 2921001862882237932L;
private static final long serialVersionUID = 2921001862882237932L;
private static final Clause[] CLAUSES = { CONDITION, CONDITION_NOT };
private final Condition condition;
@ -63,7 +65,7 @@ class NotCondition extends AbstractCondition {
}
@Override
public final Clause clause() {
return CONDITION_NOT;
public final Clause[] clauses() {
return CLAUSES;
}
}

View File

@ -89,8 +89,8 @@ public class PackageImpl extends AbstractQueryPart implements Package {
public final void bind(BindContext context) {}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
// ------------------------------------------------------------------------

View File

@ -94,8 +94,8 @@ class ParameterImpl<T> extends AbstractQueryPart implements Parameter<T> {
public final void bind(BindContext context) {}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
@Override

View File

@ -148,8 +148,8 @@ implements
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
private Table<Record> select(Configuration configuration) {
@ -270,8 +270,8 @@ implements
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
}
@ -330,8 +330,8 @@ implements
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
@Override

View File

@ -36,6 +36,7 @@
package org.jooq.impl;
import static org.jooq.Clause.TABLE;
import static org.jooq.Clause.TABLE_REFERENCE;
import org.jooq.BindContext;
import org.jooq.Clause;
@ -54,7 +55,8 @@ class QualifiedTable extends AbstractTable<Record> {
/**
* Generated UID
*/
private static final long serialVersionUID = 6937002867156868761L;
private static final long serialVersionUID = 6937002867156868761L;
private static final Clause[] CLAUSES = { TABLE, TABLE_REFERENCE };
private final String[] sql;
@ -83,8 +85,8 @@ class QualifiedTable extends AbstractTable<Record> {
public final void bind(BindContext context) {}
@Override
public final Clause clause() {
return TABLE;
public final Clause[] clauses() {
return CLAUSES;
}
@Override

View File

@ -37,7 +37,8 @@
package org.jooq.impl;
import static org.jooq.Clause.CONDITION_COMPARISON;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_BETWEEN;
import org.jooq.BindContext;
import org.jooq.Clause;
@ -52,6 +53,7 @@ import org.jooq.RenderContext;
class QuantifiedComparisonCondition extends AbstractCondition {
private static final long serialVersionUID = -402776705884329740L;
private static final Clause[] CLAUSES = { CONDITION, CONDITION_BETWEEN };
private final QuantifiedSelect<?> query;
private final Field<?> field;
@ -78,7 +80,7 @@ class QuantifiedComparisonCondition extends AbstractCondition {
}
@Override
public final Clause clause() {
return CONDITION_COMPARISON;
public final Clause[] clauses() {
return CLAUSES;
}
}

View File

@ -117,8 +117,8 @@ class QuantifiedSelectImpl<R extends Record> extends AbstractQueryPart implement
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
private final QueryPart part(Configuration context) {

View File

@ -128,8 +128,8 @@ class QueryPartList<T extends QueryPart> extends AbstractQueryPart implements Li
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
/**

View File

@ -130,7 +130,7 @@ class RegexpLike extends AbstractCondition {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
}

View File

@ -36,6 +36,7 @@
package org.jooq.impl;
import static java.util.Arrays.asList;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_BETWEEN;
import static org.jooq.Clause.DUMMY;
import static org.jooq.SQLDialect.ASE;
@ -166,13 +167,14 @@ implements
BetweenAndStep22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>,
BetweenAndStepN {
private static final long serialVersionUID = -4666251100802237878L;
private static final long serialVersionUID = -4666251100802237878L;
private static final Clause[] CLAUSES = { CONDITION, CONDITION_BETWEEN };
private final boolean symmetric;
private final boolean not;
private final Row row;
private final Row minValue;
private Row maxValue;
private final boolean symmetric;
private final boolean not;
private final Row row;
private final Row minValue;
private Row maxValue;
RowBetweenCondition(Row row, Row minValue, boolean not, boolean symmetric) {
this.row = row;
@ -689,8 +691,8 @@ implements
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
private final QueryPartInternal delegate(Configuration configuration) {
@ -755,8 +757,8 @@ implements
}
@Override
public final Clause clause() {
return CONDITION_BETWEEN;
public final Clause[] clauses() {
return CLAUSES;
}
}
}

View File

@ -36,6 +36,7 @@
package org.jooq.impl;
import static java.util.Arrays.asList;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_COMPARISON;
import static org.jooq.Clause.DUMMY;
import static org.jooq.Comparator.EQUALS;
@ -79,11 +80,12 @@ class RowCondition extends AbstractCondition {
/**
* Generated UID
*/
private static final long serialVersionUID = -1806139685201770706L;
private static final long serialVersionUID = -1806139685201770706L;
private static final Clause[] CLAUSES = { CONDITION, CONDITION_COMPARISON };
private final Row left;
private final Row right;
private final Comparator comparator;
private final Row left;
private final Row right;
private final Comparator comparator;
RowCondition(Row left, Row right, Comparator comparator) {
this.left = left;
@ -102,8 +104,8 @@ class RowCondition extends AbstractCondition {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
private final QueryPartInternal delegate(Configuration configuration) {
@ -216,8 +218,8 @@ class RowCondition extends AbstractCondition {
}
@Override
public final Clause clause() {
return CONDITION_COMPARISON;
public final Clause[] clauses() {
return CLAUSES;
}
}
}

View File

@ -36,6 +36,8 @@
package org.jooq.impl;
import static org.jooq.Clause.DUMMY;
import static org.jooq.Clause.FIELD;
import static org.jooq.Clause.FIELD_ROW;
import static org.jooq.impl.DSL.row;
import java.util.Arrays;
@ -160,9 +162,10 @@ implements
/**
* Generated UID
*/
private static final long serialVersionUID = -929427349071556318L;
private static final long serialVersionUID = -929427349071556318L;
private static final Clause[] CLAUSES = { FIELD, FIELD_ROW };
final Fields fields;
final Fields fields;
RowImpl(Field<?>... fields) {
this(new Fields(fields));
@ -203,8 +206,8 @@ implements
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return CLAUSES;
}
// ------------------------------------------------------------------------

View File

@ -36,6 +36,7 @@
package org.jooq.impl;
import static java.util.Arrays.asList;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_IN;
import static org.jooq.Clause.CONDITION_IN_NOT;
import static org.jooq.Clause.DUMMY;
@ -73,6 +74,8 @@ class RowInCondition extends AbstractCondition {
* Generated UID
*/
private static final long serialVersionUID = -1806139685201770706L;
private static final Clause[] CLAUSES_IN = { CONDITION, CONDITION_IN };
private static final Clause[] CLAUSES_IN_NOT = { CONDITION, CONDITION_IN_NOT };
private final Row left;
private final QueryPartList<? extends Row> right;
@ -95,8 +98,8 @@ class RowInCondition extends AbstractCondition {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
private final QueryPartInternal delegate(Configuration configuration) {
@ -143,8 +146,8 @@ class RowInCondition extends AbstractCondition {
}
@Override
public final Clause clause() {
return comparator == IN ? CONDITION_IN : CONDITION_IN_NOT;
public final Clause[] clauses() {
return comparator == IN ? CLAUSES_IN : CLAUSES_IN_NOT;
}
}
}

View File

@ -36,6 +36,7 @@
package org.jooq.impl;
import static java.util.Arrays.asList;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_NULL;
import static org.jooq.Clause.CONDITION_NULL_NOT;
import static org.jooq.Clause.DUMMY;
@ -73,10 +74,12 @@ class RowIsNull extends AbstractCondition {
/**
* Generated UID
*/
private static final long serialVersionUID = -1806139685201770706L;
private static final long serialVersionUID = -1806139685201770706L;
private static final Clause[] CLAUSES_NULL = { CONDITION, CONDITION_NULL };
private static final Clause[] CLAUSES_NULL_NOT = { CONDITION, CONDITION_NULL_NOT };
private final Row row;
private final boolean isNull;
private final Row row;
private final boolean isNull;
RowIsNull(Row row, boolean isNull) {
this.row = row;
@ -94,8 +97,8 @@ class RowIsNull extends AbstractCondition {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
private final QueryPartInternal delegate(Configuration configuration) {
@ -136,8 +139,8 @@ class RowIsNull extends AbstractCondition {
}
@Override
public final Clause clause() {
return isNull ? CONDITION_NULL : CONDITION_NULL_NOT;
public final Clause[] clauses() {
return isNull ? CLAUSES_NULL : CLAUSES_NULL_NOT;
}
}
}

View File

@ -36,6 +36,7 @@
package org.jooq.impl;
import static java.util.Arrays.asList;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_OVERLAPS;
import static org.jooq.Clause.DUMMY;
import static org.jooq.SQLDialect.ASE;
@ -69,10 +70,11 @@ class RowOverlapsCondition<T1, T2> extends AbstractCondition {
/**
* Generated UID
*/
private static final long serialVersionUID = 85887551884667824L;
private static final long serialVersionUID = 85887551884667824L;
private static final Clause[] CLAUSES = { CONDITION, CONDITION_OVERLAPS };
private final Row2<T1, T2> left;
private final Row2<T1, T2> right;
private final Row2<T1, T2> left;
private final Row2<T1, T2> right;
RowOverlapsCondition(Row2<T1, T2> left, Row2<T1, T2> right) {
this.left = left;
@ -90,8 +92,8 @@ class RowOverlapsCondition<T1, T2> extends AbstractCondition {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
private final QueryPartInternal delegate(Configuration configuration) {
@ -162,8 +164,8 @@ class RowOverlapsCondition<T1, T2> extends AbstractCondition {
}
@Override
public final Clause clause() {
return CONDITION_OVERLAPS;
public final Clause[] clauses() {
return CLAUSES;
}
}
}

View File

@ -36,6 +36,7 @@
package org.jooq.impl;
import static java.util.Arrays.asList;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_COMPARISON;
import static org.jooq.Clause.DUMMY;
import static org.jooq.Comparator.EQUALS;
@ -81,7 +82,8 @@ class RowSubqueryCondition extends AbstractCondition {
/**
* Generated UID
*/
private static final long serialVersionUID = -1806139685201770706L;
private static final long serialVersionUID = -1806139685201770706L;
private static final Clause[] CLAUSES = { CONDITION, CONDITION_COMPARISON };
private final Row left;
private final Select<?> right;
@ -104,8 +106,8 @@ class RowSubqueryCondition extends AbstractCondition {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
private final QueryPartInternal delegate(Configuration configuration, RenderContext context) {
@ -224,8 +226,8 @@ class RowSubqueryCondition extends AbstractCondition {
}
@Override
public final Clause clause() {
return CONDITION_COMPARISON;
public final Clause[] clauses() {
return CLAUSES;
}
}
}

View File

@ -35,12 +35,8 @@
*/
package org.jooq.impl;
import static org.jooq.Clause.CONDITION;
import org.jooq.BindContext;
import org.jooq.Clause;
import org.jooq.QueryPart;
import org.jooq.QueryPartInternal;
import org.jooq.RenderContext;
class SQLCondition extends AbstractCondition {
@ -74,13 +70,4 @@ class SQLCondition extends AbstractCondition {
public final void bind(BindContext context) {
context.visit(delegate);
}
@Override
public final Clause clause() {
if (delegate instanceof QueryPartInternal) {
return ((QueryPartInternal) delegate).clause();
}
return CONDITION;
}
}

View File

@ -35,13 +35,9 @@
*/
package org.jooq.impl;
import static org.jooq.Clause.FIELD;
import org.jooq.BindContext;
import org.jooq.Clause;
import org.jooq.DataType;
import org.jooq.QueryPart;
import org.jooq.QueryPartInternal;
import org.jooq.RenderContext;
class SQLField<T> extends AbstractField<T> {
@ -72,13 +68,4 @@ class SQLField<T> extends AbstractField<T> {
public final void bind(BindContext context) {
context.visit(delegate);
}
@Override
public final Clause clause() {
if (delegate instanceof QueryPartInternal) {
return ((QueryPartInternal) delegate).clause();
}
return FIELD;
}
}

View File

@ -75,9 +75,9 @@ class SQLQuery extends AbstractQuery {
}
@Override
public final Clause clause() {
public final Clause[] clauses() {
if (delegate instanceof QueryPartInternal) {
return ((QueryPartInternal) delegate).clause();
return ((QueryPartInternal) delegate).clauses();
}
return null;

View File

@ -81,9 +81,9 @@ class SQLResultQuery extends AbstractResultQuery<Record> {
}
@Override
public final Clause clause() {
public final Clause[] clauses() {
if (delegate instanceof QueryPartInternal) {
return ((QueryPartInternal) delegate).clause();
return ((QueryPartInternal) delegate).clauses();
}
return null;

View File

@ -35,12 +35,8 @@
*/
package org.jooq.impl;
import static org.jooq.Clause.TABLE;
import org.jooq.BindContext;
import org.jooq.Clause;
import org.jooq.QueryPart;
import org.jooq.QueryPartInternal;
import org.jooq.Record;
import org.jooq.RenderContext;
import org.jooq.Table;
@ -89,15 +85,6 @@ class SQLTable extends AbstractTable<Record> {
context.visit(delegate);
}
@Override
public final Clause clause() {
if (delegate instanceof QueryPartInternal) {
return ((QueryPartInternal) delegate).clause();
}
return TABLE;
}
@Override
final Fields<Record> fields0() {
return new Fields<Record>();

View File

@ -82,7 +82,7 @@ class SQLTemplate implements Template {
}
@Override
public final Clause clause() {
public final Clause[] clauses() {
return null;
}
}

View File

@ -37,6 +37,7 @@
package org.jooq.impl;
import static org.jooq.Clause.SCHEMA;
import static org.jooq.Clause.SCHEMA_REFERENCE;
import java.util.Collections;
import java.util.List;
@ -59,8 +60,10 @@ import org.jooq.tools.StringUtils;
*/
public class SchemaImpl extends AbstractQueryPart implements Schema {
private static final long serialVersionUID = -8101463810207566546L;
private final String schemaName;
private static final long serialVersionUID = -8101463810207566546L;
private static final Clause[] CLAUSES = { SCHEMA, SCHEMA_REFERENCE };
private final String schemaName;
public SchemaImpl(String name) {
super();
@ -82,8 +85,8 @@ public class SchemaImpl extends AbstractQueryPart implements Schema {
public final void bind(BindContext context) {}
@Override
public final Clause clause() {
return SCHEMA;
public final Clause[] clauses() {
return CLAUSES;
}
@Override

View File

@ -36,6 +36,7 @@
package org.jooq.impl;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_EXISTS;
import static org.jooq.Clause.CONDITION_EXISTS_NOT;
import static org.jooq.impl.ExistsOperator.EXISTS;
@ -50,10 +51,12 @@ import org.jooq.Select;
*/
class SelectQueryAsExistsCondition extends AbstractCondition {
private static final long serialVersionUID = 5678338161136603292L;
private static final long serialVersionUID = 5678338161136603292L;
private static final Clause[] CLAUSES_EXISTS = { CONDITION, CONDITION_EXISTS };
private static final Clause[] CLAUSES_EXISTS_NOT = { CONDITION, CONDITION_EXISTS_NOT };
private final Select<?> query;
private final ExistsOperator operator;
private final Select<?> query;
private final ExistsOperator operator;
SelectQueryAsExistsCondition(Select<?> query, ExistsOperator operator) {
this.query = query;
@ -103,7 +106,7 @@ class SelectQueryAsExistsCondition extends AbstractCondition {
}
@Override
public final Clause clause() {
return operator == EXISTS ? CONDITION_EXISTS : CONDITION_EXISTS_NOT;
public final Clause[] clauses() {
return operator == EXISTS ? CLAUSES_EXISTS : CLAUSES_EXISTS_NOT;
}
}

View File

@ -37,7 +37,6 @@
package org.jooq.impl;
import org.jooq.BindContext;
import org.jooq.Clause;
import org.jooq.DataType;
import org.jooq.Field;
import org.jooq.RenderContext;
@ -102,9 +101,4 @@ class SelectQueryAsField<T> extends AbstractField<T> {
.sql(")");
}
}
@Override
public final Clause clause() {
return null;
}
}

View File

@ -36,6 +36,7 @@
package org.jooq.impl;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_COMPARISON;
import org.jooq.BindContext;
@ -50,11 +51,12 @@ import org.jooq.Select;
*/
class SelectQueryAsSubQueryCondition extends AbstractCondition {
private static final long serialVersionUID = -402776705884329740L;
private static final long serialVersionUID = -402776705884329740L;
private static final Clause[] CLAUSES = { CONDITION, CONDITION_COMPARISON };
private final Select<?> query;
private final Field<?> field;
private final Comparator comparator;
private final Select<?> query;
private final Field<?> field;
private final Comparator comparator;
SelectQueryAsSubQueryCondition(Select<?> query, Field<?> field, Comparator comparator) {
this.query = query;
@ -110,7 +112,7 @@ class SelectQueryAsSubQueryCondition extends AbstractCondition {
}
@Override
public final Clause clause() {
return CONDITION_COMPARISON;
public final Clause[] clauses() {
return CLAUSES;
}
}

View File

@ -115,7 +115,7 @@ class SelectQueryAsTable<R extends Record> extends AbstractTable<R> {
}
@Override
public final Clause clause() {
public final Clause[] clauses() {
return null;
}
}

View File

@ -107,6 +107,7 @@ class SelectQueryImpl<R extends Record> extends AbstractSelect<R> implements Sel
* Generated UID
*/
private static final long serialVersionUID = 1646393178384872967L;
private static final Clause[] CLAUSES = { SELECT };
private final SelectFieldList select;
private String hint;
@ -165,8 +166,8 @@ class SelectQueryImpl<R extends Record> extends AbstractSelect<R> implements Sel
}
@Override
public final Clause clause() {
return SELECT;
public final Clause[] clauses() {
return CLAUSES;
}
@Override

View File

@ -166,7 +166,7 @@ class SortFieldImpl<T> extends AbstractQueryPart implements SortField<T> {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
}

View File

@ -129,8 +129,8 @@ class TableAlias<R extends Record> extends AbstractTable<R> {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
@Override

View File

@ -37,6 +37,8 @@
package org.jooq.impl;
import static org.jooq.Clause.FIELD;
import static org.jooq.Clause.FIELD_REFERENCE;
import static org.jooq.impl.Utils.DATA_OMIT_CLAUSE_EVENT_EMISSION;
import org.jooq.BindContext;
import org.jooq.Clause;
@ -54,7 +56,8 @@ import org.jooq.tools.StringUtils;
*/
class TableFieldImpl<R extends Record, T> extends AbstractField<T> implements TableField<R, T> {
private static final long serialVersionUID = -2211214195583539735L;
private static final long serialVersionUID = -2211214195583539735L;
private static final Clause[] CLAUSES = { FIELD, FIELD_REFERENCE };
private final Table<R> table;
@ -69,24 +72,31 @@ class TableFieldImpl<R extends Record, T> extends AbstractField<T> implements Ta
return table;
}
// ------------------------------------------------------------------------
// XXX: QueryPart API
// ------------------------------------------------------------------------
@Override
public final Clause[] clauses() {
return CLAUSES;
}
@Override
public final void toSQL(RenderContext context) {
context.data(DATA_OMIT_CLAUSE_EVENT_EMISSION, true);
if (context.qualify()) {
context.visit(table);
context.sql(".");
}
context.literal(getName());
context.data(DATA_OMIT_CLAUSE_EVENT_EMISSION, null);
}
@Override
public final void bind(BindContext context) {}
@Override
public final Clause clause() {
return FIELD;
}
// ------------------------------------------------------------------------
// XXX: Object API
// ------------------------------------------------------------------------

View File

@ -37,6 +37,7 @@
package org.jooq.impl;
import static org.jooq.Clause.TABLE;
import static org.jooq.Clause.TABLE_REFERENCE;
import org.jooq.BindContext;
import org.jooq.Clause;
@ -56,6 +57,7 @@ import org.jooq.tools.StringUtils;
public class TableImpl<R extends Record> extends AbstractTable<R> {
private static final long serialVersionUID = 261033315221985068L;
private static final Clause[] CLAUSES = { TABLE, TABLE_REFERENCE };
private final Fields<R> fields;
private final Alias<Table<R>> alias;
@ -98,8 +100,8 @@ public class TableImpl<R extends Record> extends AbstractTable<R> {
}
@Override
public final Clause clause() {
return TABLE;
public final Clause[] clauses() {
return CLAUSES;
}
@Override

View File

@ -36,6 +36,7 @@
package org.jooq.impl;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_COMPARISON;
import org.jooq.BindContext;
@ -47,7 +48,8 @@ import org.jooq.RenderContext;
*/
class TrueCondition extends AbstractCondition {
private static final long serialVersionUID = 775364624704563687L;
private static final long serialVersionUID = 775364624704563687L;
private static final Clause[] CLAUSES = { CONDITION, CONDITION_COMPARISON };
@Override
public final void bind(BindContext context) {}
@ -58,8 +60,8 @@ class TrueCondition extends AbstractCondition {
}
@Override
public final Clause clause() {
return CONDITION_COMPARISON;
public final Clause[] clauses() {
return CLAUSES;
}
TrueCondition() {}

View File

@ -59,7 +59,8 @@ class TruncateImpl<R extends Record> extends AbstractQuery implements
/**
* Generated UID
*/
private static final long serialVersionUID = 8904572826501186329L;
private static final long serialVersionUID = 8904572826501186329L;
private static final Clause[] CLAUSES = { TRUNCATE };
private final Table<R> table;
private Boolean cascade;
@ -137,7 +138,7 @@ class TruncateImpl<R extends Record> extends AbstractQuery implements
}
@Override
public final Clause clause() {
return TRUNCATE;
public final Clause[] clauses() {
return CLAUSES;
}
}

View File

@ -140,8 +140,8 @@ public class UDTImpl<R extends UDTRecord<R>> extends AbstractQueryPart implement
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
/**

View File

@ -64,6 +64,7 @@ class Union<R extends Record> extends AbstractSelect<R> {
private final List<Select<? extends R>> queries;
private final CombineOperator operator;
private final Clause[] clauses;
Union(Configuration configuration, Select<R> query1, Select<? extends R> query2, CombineOperator operator) {
super(configuration);
@ -72,6 +73,14 @@ class Union<R extends Record> extends AbstractSelect<R> {
this.queries.add(query1);
this.queries.add(query2);
this.operator = operator;
switch (operator) {
case EXCEPT: this.clauses = new Clause[] { SELECT_EXCEPT } ; break;
case INTERSECT: this.clauses = new Clause[] { SELECT_INTERSECT } ; break;
case UNION: this.clauses = new Clause[] { SELECT_UNION } ; break;
case UNION_ALL: this.clauses = new Clause[] { SELECT_UNION_ALL } ; break;
default: throw new IllegalArgumentException("Operator not supported : " + operator);
}
}
@Override
@ -134,14 +143,8 @@ class Union<R extends Record> extends AbstractSelect<R> {
}
@Override
public final Clause clause() {
switch (operator) {
case EXCEPT: return SELECT_EXCEPT;
case INTERSECT: return SELECT_INTERSECT;
case UNION: return SELECT_UNION;
case UNION_ALL: return SELECT_UNION_ALL;
default: throw new IllegalArgumentException("Operator not supported : " + operator);
}
public final Clause[] clauses() {
return clauses;
}
@Override

View File

@ -115,6 +115,7 @@ import org.jooq.UpdateQuery;
class UpdateQueryImpl<R extends Record> extends AbstractStoreQuery<R> implements UpdateQuery<R> {
private static final long serialVersionUID = -660460731970074719L;
private static final Clause[] CLAUSES = { UPDATE };
private final FieldMapForUpdate updateMap;
private final ConditionProviderImpl condition;
@ -509,17 +510,21 @@ class UpdateQueryImpl<R extends Record> extends AbstractStoreQuery<R> implements
.formatIndentLockEnd();
}
context.end(UPDATE_SET);
context.end(UPDATE_SET)
.start(UPDATE_WHERE);
if (!(getWhere() instanceof TrueCondition)) {
context.formatSeparator()
.start(UPDATE_WHERE)
.keyword("where ")
.visit(getWhere())
.end(UPDATE_WHERE);
.visit(getWhere());
}
toSQLReturning(context, UPDATE_RETURNING);
context.end(UPDATE_WHERE)
.start(UPDATE_RETURNING);
toSQLReturning(context);
context.end(UPDATE_RETURNING);
}
@Override
@ -550,8 +555,8 @@ class UpdateQueryImpl<R extends Record> extends AbstractStoreQuery<R> implements
}
@Override
public final Clause clause() {
return UPDATE;
public final Clause[] clauses() {
return CLAUSES;
}
@Override

View File

@ -183,6 +183,8 @@ final class Utils {
*/
static final String DATA_FORCE_STATIC_STATEMENT = "org.jooq.configuration.force-static-statement";
static final String DATA_OMIT_CLAUSE_EVENT_EMISSION = "org.jooq.configuration.omit-clause-event-emission";
// ------------------------------------------------------------------------
// Other constants
// ------------------------------------------------------------------------

View File

@ -161,8 +161,8 @@ class Values<R extends Record> extends AbstractTable<R> {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
@Override

View File

@ -83,8 +83,8 @@ class WithTable<R extends Record> extends AbstractTable<R> {
}
@Override
public final Clause clause() {
return DUMMY;
public final Clause[] clauses() {
return new Clause[] { DUMMY };
}
@Override

View File

@ -68,7 +68,7 @@ class WrappedList extends AbstractQueryPart {
}
@Override
public final Clause clause() {
public final Clause[] clauses() {
return null;
}
}

View File

@ -35,20 +35,48 @@
*/
package org.jooq.test;
import static java.util.Arrays.asList;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.fail;
import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_COMPARISON;
import static org.jooq.Clause.FIELD;
import static org.jooq.Clause.FIELD_REFERENCE;
import static org.jooq.Clause.FIELD_ROW;
import static org.jooq.Clause.FIELD_VALUE;
import static org.jooq.Clause.SELECT_WHERE;
import static org.jooq.Clause.TABLE;
import static org.jooq.Clause.TABLE_REFERENCE;
import static org.jooq.Clause.UPDATE;
import static org.jooq.Clause.UPDATE_RETURNING;
import static org.jooq.Clause.UPDATE_SET;
import static org.jooq.Clause.UPDATE_SET_ASSIGNMENT;
import static org.jooq.Clause.UPDATE_UPDATE;
import static org.jooq.Clause.UPDATE_WHERE;
import static org.jooq.SQLDialect.POSTGRES;
import static org.jooq.impl.DSL.row;
import static org.jooq.impl.DSL.select;
import static org.jooq.impl.DSL.using;
import static org.jooq.impl.DSL.val;
import static org.jooq.impl.DefaultVisitListenerProvider.providers;
import static org.jooq.test.data.Table1.FIELD_DATE1;
import static org.jooq.test.data.Table1.FIELD_ID1;
import static org.jooq.test.data.Table1.FIELD_NAME1;
import static org.jooq.test.data.Table1.TABLE1;
import static org.jooq.tools.StringUtils.leftPad;
import java.util.ArrayList;
import java.util.List;
import org.jooq.Clause;
import org.jooq.Configuration;
import org.jooq.DSLContext;
import org.jooq.VisitContext;
import org.jooq.VisitListener;
import org.jooq.impl.DSL;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
@ -56,8 +84,26 @@ import org.junit.Test;
*
* @author Lukas Eder
*/
@SuppressWarnings("unchecked")
public class VisitContextTest extends AbstractTest {
private DSLContext ctx;
private SimpleListener listener;
@Before
public void setup() {
listener = new SimpleListener();
ctx = DSL.using(
create.configuration().derive(providers(listener)));
}
@After
public void teardown() {
ctx = null;
listener = null;
}
@Test
public void testClauses() {
Configuration c = create.configuration().derive(providers(new ClausesListener()));
@ -130,4 +176,149 @@ public class VisitContextTest extends AbstractTest {
public void visitEnd(VisitContext context) {
}
}
@Test
public void test_UPDATE_SET_simple() {
ctx.update(TABLE1)
.set(FIELD_NAME1, "value")
.getSQL();
assertEvents(asList(
asList(UPDATE),
asList(UPDATE, UPDATE_UPDATE),
asList(UPDATE, UPDATE_UPDATE, TABLE),
asList(UPDATE, UPDATE_UPDATE, TABLE, TABLE_REFERENCE),
asList(UPDATE, UPDATE_SET),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_REFERENCE),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_VALUE),
asList(UPDATE, UPDATE_WHERE),
asList(UPDATE, UPDATE_RETURNING)
));
}
@Test
public void test_UPDATE_SET_twoValues() {
ctx.update(TABLE1)
.set(FIELD_NAME1, "value")
.set(FIELD_DATE1, FIELD_DATE1)
.getSQL();
assertEvents(asList(
asList(UPDATE),
asList(UPDATE, UPDATE_UPDATE),
asList(UPDATE, UPDATE_UPDATE, TABLE),
asList(UPDATE, UPDATE_UPDATE, TABLE, TABLE_REFERENCE),
asList(UPDATE, UPDATE_SET),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_REFERENCE),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_VALUE),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_REFERENCE),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_REFERENCE),
asList(UPDATE, UPDATE_WHERE),
asList(UPDATE, UPDATE_RETURNING)
));
}
@Test
public void test_UPDATE_SET_rowValueExpressions() {
// Postgres is known to support this syntax particularly well
ctx.configuration().set(POSTGRES);
ctx.update(TABLE1)
.set(row(FIELD_NAME1, FIELD_DATE1),
row(val("value"), FIELD_DATE1))
.getSQL();
assertEvents(asList(
asList(UPDATE),
asList(UPDATE, UPDATE_UPDATE),
asList(UPDATE, UPDATE_UPDATE, TABLE),
asList(UPDATE, UPDATE_UPDATE, TABLE, TABLE_REFERENCE),
asList(UPDATE, UPDATE_SET),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_ROW),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_ROW, FIELD),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_ROW, FIELD, FIELD_REFERENCE),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_ROW, FIELD),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_ROW, FIELD, FIELD_REFERENCE),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_ROW),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_ROW, FIELD),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_ROW, FIELD, FIELD_VALUE),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_ROW, FIELD),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_ROW, FIELD, FIELD_REFERENCE),
asList(UPDATE, UPDATE_WHERE),
asList(UPDATE, UPDATE_RETURNING)
));
}
@Test
public void test_UPDATE_SET_WHERE() {
ctx.update(TABLE1)
.set(FIELD_NAME1, "value")
.where(FIELD_ID1.eq(1))
.getSQL();
assertEvents(asList(
asList(UPDATE),
asList(UPDATE, UPDATE_UPDATE),
asList(UPDATE, UPDATE_UPDATE, TABLE),
asList(UPDATE, UPDATE_UPDATE, TABLE, TABLE_REFERENCE),
asList(UPDATE, UPDATE_SET),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_REFERENCE),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_VALUE),
asList(UPDATE, UPDATE_WHERE),
asList(UPDATE, UPDATE_WHERE, CONDITION),
asList(UPDATE, UPDATE_WHERE, CONDITION, CONDITION_COMPARISON),
asList(UPDATE, UPDATE_WHERE, CONDITION, CONDITION_COMPARISON, FIELD),
asList(UPDATE, UPDATE_WHERE, CONDITION, CONDITION_COMPARISON, FIELD, FIELD_REFERENCE),
asList(UPDATE, UPDATE_WHERE, CONDITION, CONDITION_COMPARISON, FIELD),
asList(UPDATE, UPDATE_WHERE, CONDITION, CONDITION_COMPARISON, FIELD, FIELD_VALUE),
asList(UPDATE, UPDATE_RETURNING)
));
}
private void assertEvents(List<List<Clause>> expected) {
// This assertion is a bit more verbose to be able to detect errors more easily
for (int i = 0; i < expected.size() && i < listener.clauses.size(); i++) {
assertEquals("Mismatch at position " + i + ":", expected.get(i), listener.clauses.get(i));
}
if (expected.size() != listener.clauses.size()) {
fail("Size mismatch:\n\tExpected: " + expected + "\n\tActual: " + listener.clauses);
}
}
private static class SimpleListener implements VisitListener {
List<List<Clause>> clauses = new ArrayList<List<Clause>>();
@Override
public void clauseStart(VisitContext context) {
clauses.add(asList(context.clauses()));
}
@Override
public void clauseEnd(VisitContext context) {}
@Override
public void visitStart(VisitContext context) {}
@Override
public void visitEnd(VisitContext context) {}
}
}