From c8f2ac0b14cdb718afccebd92577e66e9bf45117 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 8 Aug 2013 16:36:53 +0200 Subject: [PATCH] [#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 --- jOOQ/src/main/java/org/jooq/Clause.java | 67 ++++++ .../main/java/org/jooq/QueryPartInternal.java | 17 +- .../java/org/jooq/impl/AbstractCondition.java | 10 +- .../java/org/jooq/impl/AbstractContext.java | 19 +- .../jooq/impl/AbstractDelegatingQuery.java | 4 +- .../java/org/jooq/impl/AbstractField.java | 9 +- .../java/org/jooq/impl/AbstractFunction.java | 8 - .../java/org/jooq/impl/AbstractParam.java | 15 +- .../java/org/jooq/impl/AbstractRoutine.java | 4 +- .../org/jooq/impl/AbstractStoreQuery.java | 7 +- .../java/org/jooq/impl/AbstractTable.java | 14 +- jOOQ/src/main/java/org/jooq/impl/Alias.java | 4 +- .../main/java/org/jooq/impl/ArrayTable.java | 8 +- .../org/jooq/impl/ArrayTableSimulation.java | 4 +- .../java/org/jooq/impl/BetweenCondition.java | 22 +- .../org/jooq/impl/CaseConditionStepImpl.java | 8 - .../main/java/org/jooq/impl/CatalogImpl.java | 10 +- .../java/org/jooq/impl/CombinedCondition.java | 7 +- .../java/org/jooq/impl/CompareCondition.java | 16 +- .../org/jooq/impl/ConditionProviderImpl.java | 2 +- .../src/main/java/org/jooq/impl/Contains.java | 18 +- .../java/org/jooq/impl/CustomCondition.java | 2 +- .../main/java/org/jooq/impl/CustomField.java | 4 +- .../java/org/jooq/impl/CustomQueryPart.java | 2 +- .../java/org/jooq/impl/DeleteQueryImpl.java | 5 +- jOOQ/src/main/java/org/jooq/impl/Dual.java | 8 - .../java/org/jooq/impl/FalseCondition.java | 8 +- .../java/org/jooq/impl/FieldCondition.java | 4 +- .../java/org/jooq/impl/FieldMapForInsert.java | 4 +- .../java/org/jooq/impl/FieldMapForUpdate.java | 4 +- .../org/jooq/impl/FieldMapsForInsert.java | 4 +- jOOQ/src/main/java/org/jooq/impl/Fields.java | 4 +- .../java/org/jooq/impl/FlashbackTable.java | 4 +- .../src/main/java/org/jooq/impl/Function.java | 6 - .../java/org/jooq/impl/FunctionTable.java | 4 +- .../main/java/org/jooq/impl/InCondition.java | 17 +- .../java/org/jooq/impl/InsertQueryImpl.java | 18 +- .../org/jooq/impl/InsertSelectQueryImpl.java | 13 +- .../java/org/jooq/impl/IsDistinctFrom.java | 4 +- jOOQ/src/main/java/org/jooq/impl/IsNull.java | 13 +- .../main/java/org/jooq/impl/JoinTable.java | 6 +- .../main/java/org/jooq/impl/KeywordImpl.java | 2 +- jOOQ/src/main/java/org/jooq/impl/Limit.java | 4 +- .../main/java/org/jooq/impl/MergeImpl.java | 5 +- .../src/main/java/org/jooq/impl/NameImpl.java | 4 +- .../main/java/org/jooq/impl/NotCondition.java | 8 +- .../main/java/org/jooq/impl/PackageImpl.java | 4 +- .../java/org/jooq/impl/ParameterImpl.java | 4 +- jOOQ/src/main/java/org/jooq/impl/Pivot.java | 12 +- .../java/org/jooq/impl/QualifiedTable.java | 8 +- .../impl/QuantifiedComparisonCondition.java | 8 +- .../org/jooq/impl/QuantifiedSelectImpl.java | 4 +- .../java/org/jooq/impl/QueryPartList.java | 4 +- .../main/java/org/jooq/impl/RegexpLike.java | 4 +- .../org/jooq/impl/RowBetweenCondition.java | 22 +- .../main/java/org/jooq/impl/RowCondition.java | 18 +- jOOQ/src/main/java/org/jooq/impl/RowImpl.java | 11 +- .../java/org/jooq/impl/RowInCondition.java | 11 +- .../main/java/org/jooq/impl/RowIsNull.java | 17 +- .../org/jooq/impl/RowOverlapsCondition.java | 16 +- .../org/jooq/impl/RowSubqueryCondition.java | 12 +- .../main/java/org/jooq/impl/SQLCondition.java | 13 -- .../src/main/java/org/jooq/impl/SQLField.java | 13 -- .../src/main/java/org/jooq/impl/SQLQuery.java | 4 +- .../java/org/jooq/impl/SQLResultQuery.java | 4 +- .../src/main/java/org/jooq/impl/SQLTable.java | 13 -- .../main/java/org/jooq/impl/SQLTemplate.java | 2 +- .../main/java/org/jooq/impl/SchemaImpl.java | 11 +- .../impl/SelectQueryAsExistsCondition.java | 13 +- .../org/jooq/impl/SelectQueryAsField.java | 6 - .../impl/SelectQueryAsSubQueryCondition.java | 14 +- .../org/jooq/impl/SelectQueryAsTable.java | 2 +- .../java/org/jooq/impl/SelectQueryImpl.java | 5 +- .../java/org/jooq/impl/SortFieldImpl.java | 4 +- .../main/java/org/jooq/impl/TableAlias.java | 4 +- .../java/org/jooq/impl/TableFieldImpl.java | 22 +- .../main/java/org/jooq/impl/TableImpl.java | 6 +- .../java/org/jooq/impl/TrueCondition.java | 8 +- .../main/java/org/jooq/impl/TruncateImpl.java | 7 +- jOOQ/src/main/java/org/jooq/impl/UDTImpl.java | 4 +- jOOQ/src/main/java/org/jooq/impl/Union.java | 19 +- .../java/org/jooq/impl/UpdateQueryImpl.java | 19 +- jOOQ/src/main/java/org/jooq/impl/Utils.java | 2 + jOOQ/src/main/java/org/jooq/impl/Values.java | 4 +- .../main/java/org/jooq/impl/WithTable.java | 4 +- .../main/java/org/jooq/impl/WrappedList.java | 2 +- .../java/org/jooq/test/VisitContextTest.java | 191 ++++++++++++++++++ 87 files changed, 640 insertions(+), 341 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/Clause.java b/jOOQ/src/main/java/org/jooq/Clause.java index 6dc1f382c6..2b0a6fda24 100644 --- a/jOOQ/src/main/java/org/jooq/Clause.java +++ b/jOOQ/src/main/java/org/jooq/Clause.java @@ -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 UPDATE statement. + */ UPDATE, + + /** + * An UPDATE clause within an {@link #UPDATE} statement. + *

+ * This clause surrounds + *

+ */ UPDATE_UPDATE, + + /** + * A SET clause within an {@link #UPDATE} statement. + *

+ * This clause surrounds + *

+ */ UPDATE_SET, + + /** + * An assigment within a {@link #UPDATE_SET} clause within an + * {@link #UPDATE} statement. + *

+ * This clause surrounds + *

+ */ UPDATE_SET_ASSIGNMENT, + + /** + * A WHERE clause within an {@link #UPDATE} statement. + *

+ * This clause surrounds + *

+ */ UPDATE_WHERE, + + /** + * A RETURNING clause within an {@link #UPDATE} statement. + *

+ * This clause surrounds + *

+ */ UPDATE_RETURNING, diff --git a/jOOQ/src/main/java/org/jooq/QueryPartInternal.java b/jOOQ/src/main/java/org/jooq/QueryPartInternal.java index f521c5c9db..2373e217d7 100644 --- a/jOOQ/src/main/java/org/jooq/QueryPartInternal.java +++ b/jOOQ/src/main/java/org/jooq/QueryPartInternal.java @@ -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. *

- * {@link QueryPart}s can specify a Clause 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 Clauses 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)} *

* This method is for JOOQ INTERNAL USE only. Do not reference directly * - * @return The Clause represented by this query part or - * null if this query part does not represent a clause. + * @return The Clauses represented by this query part or + * null 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 diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractCondition.java b/jOOQ/src/main/java/org/jooq/impl/AbstractCondition.java index 14ac1eb34f..4bf2c5d67d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractCondition.java @@ -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)); diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java index 21dd145e09..4e5053d322 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java @@ -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> implements Context { @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> implements Context { } 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> implements Context { * {@link Context#visit(QueryPart)} event has to be issued here in * AbstractContext. */ - 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; diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDelegatingQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDelegatingQuery.java index 7fef0a418f..d23bd0ce85 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDelegatingQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDelegatingQuery.java @@ -98,9 +98,9 @@ abstract class AbstractDelegatingQuery 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; diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java index 04c5106614..c4a277fc0c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java @@ -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 extends AbstractQueryPart implements Field { /** * 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 dataType; @@ -122,8 +123,8 @@ abstract class AbstractField extends AbstractQueryPart implements Field { public abstract void bind(BindContext context); @Override - public /* non-final for now */ Clause clause() { - return DUMMY; + public Clause[] clauses() { + return CLAUSES; } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractFunction.java b/jOOQ/src/main/java/org/jooq/impl/AbstractFunction.java index 9addece115..aaaef55fd6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractFunction.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractFunction.java @@ -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 extends AbstractField { ctx.visit(getFunction0(ctx.configuration())); } - @Override - public final Clause clause() { - return DUMMY; - } - final Field[] getArguments() { return arguments; } diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractParam.java b/jOOQ/src/main/java/org/jooq/impl/AbstractParam.java index fd22867219..77e7b135ef 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractParam.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractParam.java @@ -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 extends AbstractField implements Param { /** * 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 extends AbstractField implements Param { return paramName == null ? String.valueOf(value) : paramName; } + // ------------------------------------------------------------------------ + // XXX: QueryPart API + // ------------------------------------------------------------------------ + + @Override + public final Clause[] clauses() { + return CLAUSES; + } + // ------------------------------------------------------------------------ // XXX: Param API // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java index 1a136a2d1d..d24c31eba6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java @@ -293,8 +293,8 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractStoreQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractStoreQuery.java index 1d14d0d913..a0225bc166 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractStoreQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractStoreQuery.java @@ -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 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: diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java index 341b5046e8..9635e6553e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java @@ -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 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 extends AbstractQueryPart impleme this.name = name; } + // ------------------------------------------------------------------------ + // XXX: QueryPart API + // ------------------------------------------------------------------------ + + @Override + public Clause[] clauses() { + return CLAUSES; + } + // ------------------------------------------------------------------------ // XXX: TableLike API // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/Alias.java b/jOOQ/src/main/java/org/jooq/impl/Alias.java index d283795a3e..7a1d4a034c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Alias.java +++ b/jOOQ/src/main/java/org/jooq/impl/Alias.java @@ -224,8 +224,8 @@ class Alias extends AbstractQueryPart { } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayTable.java b/jOOQ/src/main/java/org/jooq/impl/ArrayTable.java index e936369861..9187c3d19e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayTable.java @@ -176,8 +176,8 @@ class ArrayTable extends AbstractTable { } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } private final Table table(Configuration configuration) { @@ -304,8 +304,8 @@ class ArrayTable extends AbstractTable { } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayTableSimulation.java b/jOOQ/src/main/java/org/jooq/impl/ArrayTableSimulation.java index e7f3502851..7cec968f04 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayTableSimulation.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayTableSimulation.java @@ -129,8 +129,8 @@ class ArrayTableSimulation extends AbstractTable { } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/BetweenCondition.java b/jOOQ/src/main/java/org/jooq/impl/BetweenCondition.java index 1256cd8143..790c2ca1d4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BetweenCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/BetweenCondition.java @@ -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 extends AbstractCondition implements BetweenAndStep { - 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 field; - private final Field minValue; - private Field maxValue; + private final boolean symmetric; + private final boolean not; + private final Field field; + private final Field minValue; + private Field maxValue; BetweenCondition(Field field, Field minValue, boolean not, boolean symmetric) { this.field = field; @@ -109,8 +111,8 @@ class BetweenCondition extends AbstractCondition implements BetweenAndStep } @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 extends AbstractCondition implements BetweenAndStep } @Override - public final Clause clause() { - return CONDITION_BETWEEN; + public final Clause[] clauses() { + return CLAUSES; } } } diff --git a/jOOQ/src/main/java/org/jooq/impl/CaseConditionStepImpl.java b/jOOQ/src/main/java/org/jooq/impl/CaseConditionStepImpl.java index b0d5193836..d1d233a463 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CaseConditionStepImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CaseConditionStepImpl.java @@ -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 extends AbstractField implements CaseCondition context.keyword("end") .formatIndentLockEnd(); } - - @Override - public final Clause clause() { - return DUMMY; - } } diff --git a/jOOQ/src/main/java/org/jooq/impl/CatalogImpl.java b/jOOQ/src/main/java/org/jooq/impl/CatalogImpl.java index 3bee3beba7..f5f8e4aefb 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CatalogImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CatalogImpl.java @@ -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 diff --git a/jOOQ/src/main/java/org/jooq/impl/CombinedCondition.java b/jOOQ/src/main/java/org/jooq/impl/CombinedCondition.java index dcc25a34c8..fdf18d2d06 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CombinedCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/CombinedCondition.java @@ -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 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 diff --git a/jOOQ/src/main/java/org/jooq/impl/CompareCondition.java b/jOOQ/src/main/java/org/jooq/impl/CompareCondition.java index ed67513c4f..eed9a71578 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CompareCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/CompareCondition.java @@ -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; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/ConditionProviderImpl.java b/jOOQ/src/main/java/org/jooq/impl/ConditionProviderImpl.java index ba4a916d18..9e43c3ca32 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ConditionProviderImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ConditionProviderImpl.java @@ -123,7 +123,7 @@ class ConditionProviderImpl extends AbstractQueryPart implements ConditionProvid } @Override - public final Clause clause() { + public final Clause[] clauses() { return null; } diff --git a/jOOQ/src/main/java/org/jooq/impl/Contains.java b/jOOQ/src/main/java/org/jooq/impl/Contains.java index 5021c3b296..a2bb54a1fa 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Contains.java +++ b/jOOQ/src/main/java/org/jooq/impl/Contains.java @@ -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 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 lhs; - private final Field rhs; - private final T value; + private final Field lhs; + private final Field rhs; + private final T value; Contains(Field field, T value) { this.lhs = field; @@ -85,8 +87,8 @@ class Contains 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 extends AbstractCondition { } @Override - public final Clause clause() { - return CONDITION_COMPARISON; + public final Clause[] clauses() { + return CLAUSES; } private final Field rhs() { diff --git a/jOOQ/src/main/java/org/jooq/impl/CustomCondition.java b/jOOQ/src/main/java/org/jooq/impl/CustomCondition.java index c2c988eaa7..88b1c866a1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CustomCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/CustomCondition.java @@ -97,7 +97,7 @@ public abstract class CustomCondition extends AbstractCondition { * {@inheritDoc} */ @Override - public Clause clause() { + public Clause[] clauses() { return null; } diff --git a/jOOQ/src/main/java/org/jooq/impl/CustomField.java b/jOOQ/src/main/java/org/jooq/impl/CustomField.java index 3a75518dfc..045965217d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CustomField.java +++ b/jOOQ/src/main/java/org/jooq/impl/CustomField.java @@ -98,8 +98,8 @@ public abstract class CustomField extends AbstractField { * {@inheritDoc} */ @Override - public Clause clause() { - return null; + public Clause[] clauses() { + return super.clauses(); } // ------------------------------------------------------------------------- diff --git a/jOOQ/src/main/java/org/jooq/impl/CustomQueryPart.java b/jOOQ/src/main/java/org/jooq/impl/CustomQueryPart.java index 2de5c6f521..1057eb0654 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CustomQueryPart.java +++ b/jOOQ/src/main/java/org/jooq/impl/CustomQueryPart.java @@ -108,7 +108,7 @@ public abstract class CustomQueryPart extends AbstractQueryPart { * {@inheritDoc} */ @Override - public Clause clause() { + public Clause[] clauses() { return null; } diff --git a/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java index b7ca33137b..7f6258350f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java @@ -59,6 +59,7 @@ import org.jooq.Table; class DeleteQueryImpl extends AbstractQuery implements DeleteQuery { private static final long serialVersionUID = -1943687511774150929L; + private static final Clause[] CLAUSES = { DELETE }; private final Table table; private final ConditionProviderImpl condition; @@ -135,7 +136,7 @@ class DeleteQueryImpl extends AbstractQuery implements DeleteQ } @Override - public final Clause clause() { - return DELETE; + public final Clause[] clauses() { + return CLAUSES; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Dual.java b/jOOQ/src/main/java/org/jooq/impl/Dual.java index 5dbe4b9355..1ebe11f3eb 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Dual.java +++ b/jOOQ/src/main/java/org/jooq/impl/Dual.java @@ -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 { @Override public final void bind(BindContext context) {} - @Override - public final Clause clause() { - return TABLE; - } - @Override final Fields fields0() { return new Fields(); diff --git a/jOOQ/src/main/java/org/jooq/impl/FalseCondition.java b/jOOQ/src/main/java/org/jooq/impl/FalseCondition.java index 4bf2eac11a..523fe4ebca 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FalseCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/FalseCondition.java @@ -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() {} diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldCondition.java b/jOOQ/src/main/java/org/jooq/impl/FieldCondition.java index f3034e4e2e..538fc031f9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldCondition.java @@ -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) { diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldMapForInsert.java b/jOOQ/src/main/java/org/jooq/impl/FieldMapForInsert.java index 8881179cff..d720feb13b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldMapForInsert.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldMapForInsert.java @@ -139,8 +139,8 @@ class FieldMapForInsert extends AbstractQueryPartMap, Field> { } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } final void putFields(Collection> fields) { diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java b/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java index d959a06869..34617536c8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java @@ -107,8 +107,8 @@ class FieldMapForUpdate extends AbstractQueryPartMap, Field> { } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } final void set(Map, ?> map) { diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java b/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java index 12fa47f343..70edadb323 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java @@ -140,8 +140,8 @@ class FieldMapsForInsert extends AbstractQueryPart { } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } // ------------------------------------------------------------------------- diff --git a/jOOQ/src/main/java/org/jooq/impl/Fields.java b/jOOQ/src/main/java/org/jooq/impl/Fields.java index f7be7f3bff..6938cb019a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Fields.java +++ b/jOOQ/src/main/java/org/jooq/impl/Fields.java @@ -258,8 +258,8 @@ class Fields extends AbstractQueryPart implements RecordType { } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/Function.java b/jOOQ/src/main/java/org/jooq/impl/Function.java index 72dcb59f50..13fe1824c8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Function.java +++ b/jOOQ/src/main/java/org/jooq/impl/Function.java @@ -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 extends AbstractField 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())) { diff --git a/jOOQ/src/main/java/org/jooq/impl/FunctionTable.java b/jOOQ/src/main/java/org/jooq/impl/FunctionTable.java index a7adc63f50..2976149430 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FunctionTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/FunctionTable.java @@ -105,8 +105,8 @@ class FunctionTable extends AbstractTable { } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/InCondition.java b/jOOQ/src/main/java/org/jooq/impl/InCondition.java index 24cce4e561..c845f9ace0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/InCondition.java @@ -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 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 field; - private final Field[] values; - private final Comparator comparator; + private final Field field; + private final Field[] values; + private final Comparator comparator; InCondition(Field field, Field[] values, Comparator comparator) { this.field = field; @@ -69,8 +72,8 @@ class InCondition 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 diff --git a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java index e559e45187..76692c3291 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java @@ -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 extends AbstractStoreQuery implements InsertQuery { - 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 into) { super(configuration, into); @@ -317,8 +317,8 @@ class InsertQueryImpl extends AbstractStoreQuery 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 extends AbstractStoreQuery implements .sql(" ") .visit(insertMaps); - toSQLReturning(context, INSERT_RETURNING); + toSQLReturning(context); } private final void bindInsert(BindContext context) { diff --git a/jOOQ/src/main/java/org/jooq/impl/InsertSelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/InsertSelectQueryImpl.java index c6a5f12abe..4fe58e3093 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InsertSelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/InsertSelectQueryImpl.java @@ -56,11 +56,12 @@ class InsertSelectQueryImpl 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 extends AbstractQuery implements I } @Override - public final Clause clause() { - return INSERT; + public final Clause[] clauses() { + return CLAUSES; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/IsDistinctFrom.java b/jOOQ/src/main/java/org/jooq/impl/IsDistinctFrom.java index 2e973fd9ea..ce50a9ca28 100644 --- a/jOOQ/src/main/java/org/jooq/impl/IsDistinctFrom.java +++ b/jOOQ/src/main/java/org/jooq/impl/IsDistinctFrom.java @@ -97,8 +97,8 @@ class IsDistinctFrom extends AbstractCondition { } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/IsNull.java b/jOOQ/src/main/java/org/jooq/impl/IsNull.java index 7507ebbee6..7831f93153 100644 --- a/jOOQ/src/main/java/org/jooq/impl/IsNull.java +++ b/jOOQ/src/main/java/org/jooq/impl/IsNull.java @@ -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; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java index a1e921894a..aec8d64be2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java @@ -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 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 implements TableOptionalOnStep, Ta } @Override - public final Clause clause() { - return TABLE_JOIN; + public final Clause[] clauses() { + return CLAUSES; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/KeywordImpl.java b/jOOQ/src/main/java/org/jooq/impl/KeywordImpl.java index a8beaf03c0..a9341ab910 100644 --- a/jOOQ/src/main/java/org/jooq/impl/KeywordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/KeywordImpl.java @@ -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; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Limit.java b/jOOQ/src/main/java/org/jooq/impl/Limit.java index afeabb4cfa..91c6d0cadf 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Limit.java +++ b/jOOQ/src/main/java/org/jooq/impl/Limit.java @@ -323,8 +323,8 @@ class Limit extends AbstractQueryPart { } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java b/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java index 2c86e64636..529f06e9e3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java @@ -198,6 +198,7 @@ implements * Generated UID */ private static final long serialVersionUID = -8835479296876774391L; + private static final Clause[] CLAUSES = { MERGE }; private final Table table; private final ConditionProviderImpl on; @@ -1199,7 +1200,7 @@ implements } @Override - public final Clause clause() { - return MERGE; + public final Clause[] clauses() { + return CLAUSES; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/NameImpl.java b/jOOQ/src/main/java/org/jooq/impl/NameImpl.java index b3b10cdf04..0214a1696e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/NameImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/NameImpl.java @@ -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 diff --git a/jOOQ/src/main/java/org/jooq/impl/NotCondition.java b/jOOQ/src/main/java/org/jooq/impl/NotCondition.java index 063f7e419d..d624646e86 100644 --- a/jOOQ/src/main/java/org/jooq/impl/NotCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/NotCondition.java @@ -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; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/PackageImpl.java b/jOOQ/src/main/java/org/jooq/impl/PackageImpl.java index 56ab174c80..5ee2d243c4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/PackageImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/PackageImpl.java @@ -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 }; } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/ParameterImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParameterImpl.java index 177f2882dd..2b41e34e75 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParameterImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParameterImpl.java @@ -94,8 +94,8 @@ class ParameterImpl extends AbstractQueryPart implements Parameter { public final void bind(BindContext context) {} @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/Pivot.java b/jOOQ/src/main/java/org/jooq/impl/Pivot.java index a13ca8947a..6cbf32dc16 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Pivot.java +++ b/jOOQ/src/main/java/org/jooq/impl/Pivot.java @@ -148,8 +148,8 @@ implements } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } private Table 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 diff --git a/jOOQ/src/main/java/org/jooq/impl/QualifiedTable.java b/jOOQ/src/main/java/org/jooq/impl/QualifiedTable.java index 491fa18bea..83b28b43fc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QualifiedTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/QualifiedTable.java @@ -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 { /** * 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 { public final void bind(BindContext context) {} @Override - public final Clause clause() { - return TABLE; + public final Clause[] clauses() { + return CLAUSES; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/QuantifiedComparisonCondition.java b/jOOQ/src/main/java/org/jooq/impl/QuantifiedComparisonCondition.java index 84fb63fb40..ec3a36e1cf 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QuantifiedComparisonCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/QuantifiedComparisonCondition.java @@ -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; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/QuantifiedSelectImpl.java b/jOOQ/src/main/java/org/jooq/impl/QuantifiedSelectImpl.java index d832c416eb..ea9aa15837 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QuantifiedSelectImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/QuantifiedSelectImpl.java @@ -117,8 +117,8 @@ class QuantifiedSelectImpl extends AbstractQueryPart implement } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } private final QueryPart part(Configuration context) { diff --git a/jOOQ/src/main/java/org/jooq/impl/QueryPartList.java b/jOOQ/src/main/java/org/jooq/impl/QueryPartList.java index e34740f2f7..cc80922a7f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QueryPartList.java +++ b/jOOQ/src/main/java/org/jooq/impl/QueryPartList.java @@ -128,8 +128,8 @@ class QueryPartList extends AbstractQueryPart implements Li } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/RegexpLike.java b/jOOQ/src/main/java/org/jooq/impl/RegexpLike.java index 2c6a08b246..15d57aed5b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegexpLike.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegexpLike.java @@ -130,7 +130,7 @@ class RegexpLike extends AbstractCondition { } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/RowBetweenCondition.java b/jOOQ/src/main/java/org/jooq/impl/RowBetweenCondition.java index c246ff632c..0c7730d009 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowBetweenCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowBetweenCondition.java @@ -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, 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; } } } diff --git a/jOOQ/src/main/java/org/jooq/impl/RowCondition.java b/jOOQ/src/main/java/org/jooq/impl/RowCondition.java index 3406029182..9a869887cb 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowCondition.java @@ -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; } } } \ No newline at end of file diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl.java index ff6b82fd3d..cebcfa1893 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl.java @@ -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; } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/RowInCondition.java b/jOOQ/src/main/java/org/jooq/impl/RowInCondition.java index 78b1cf5ff4..f7628eaccd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowInCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowInCondition.java @@ -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 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; } } } \ No newline at end of file diff --git a/jOOQ/src/main/java/org/jooq/impl/RowIsNull.java b/jOOQ/src/main/java/org/jooq/impl/RowIsNull.java index 88a6e8ef24..4bab36e1e2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowIsNull.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowIsNull.java @@ -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; } } } \ No newline at end of file diff --git a/jOOQ/src/main/java/org/jooq/impl/RowOverlapsCondition.java b/jOOQ/src/main/java/org/jooq/impl/RowOverlapsCondition.java index d4e80249ab..d500fb696b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowOverlapsCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowOverlapsCondition.java @@ -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 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 left; - private final Row2 right; + private final Row2 left; + private final Row2 right; RowOverlapsCondition(Row2 left, Row2 right) { this.left = left; @@ -90,8 +92,8 @@ class RowOverlapsCondition 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 extends AbstractCondition { } @Override - public final Clause clause() { - return CONDITION_OVERLAPS; + public final Clause[] clauses() { + return CLAUSES; } } } \ No newline at end of file diff --git a/jOOQ/src/main/java/org/jooq/impl/RowSubqueryCondition.java b/jOOQ/src/main/java/org/jooq/impl/RowSubqueryCondition.java index aa6c61e46d..dd7275f22c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowSubqueryCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowSubqueryCondition.java @@ -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; } } } \ No newline at end of file diff --git a/jOOQ/src/main/java/org/jooq/impl/SQLCondition.java b/jOOQ/src/main/java/org/jooq/impl/SQLCondition.java index 2f2e0fd0cf..363ca8d267 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SQLCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/SQLCondition.java @@ -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; - } } diff --git a/jOOQ/src/main/java/org/jooq/impl/SQLField.java b/jOOQ/src/main/java/org/jooq/impl/SQLField.java index 89fcf8a315..7c6e923201 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SQLField.java +++ b/jOOQ/src/main/java/org/jooq/impl/SQLField.java @@ -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 extends AbstractField { @@ -72,13 +68,4 @@ class SQLField extends AbstractField { public final void bind(BindContext context) { context.visit(delegate); } - - @Override - public final Clause clause() { - if (delegate instanceof QueryPartInternal) { - return ((QueryPartInternal) delegate).clause(); - } - - return FIELD; - } } diff --git a/jOOQ/src/main/java/org/jooq/impl/SQLQuery.java b/jOOQ/src/main/java/org/jooq/impl/SQLQuery.java index a0fc23bb5d..1696269b13 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SQLQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/SQLQuery.java @@ -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; diff --git a/jOOQ/src/main/java/org/jooq/impl/SQLResultQuery.java b/jOOQ/src/main/java/org/jooq/impl/SQLResultQuery.java index c13ef074b9..0bb13ec7f6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SQLResultQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/SQLResultQuery.java @@ -81,9 +81,9 @@ class SQLResultQuery extends AbstractResultQuery { } @Override - public final Clause clause() { + public final Clause[] clauses() { if (delegate instanceof QueryPartInternal) { - return ((QueryPartInternal) delegate).clause(); + return ((QueryPartInternal) delegate).clauses(); } return null; diff --git a/jOOQ/src/main/java/org/jooq/impl/SQLTable.java b/jOOQ/src/main/java/org/jooq/impl/SQLTable.java index 88e116a14f..9470d05499 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SQLTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/SQLTable.java @@ -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 { context.visit(delegate); } - @Override - public final Clause clause() { - if (delegate instanceof QueryPartInternal) { - return ((QueryPartInternal) delegate).clause(); - } - - return TABLE; - } - @Override final Fields fields0() { return new Fields(); diff --git a/jOOQ/src/main/java/org/jooq/impl/SQLTemplate.java b/jOOQ/src/main/java/org/jooq/impl/SQLTemplate.java index b6e2286bc5..3f71d0b97d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SQLTemplate.java +++ b/jOOQ/src/main/java/org/jooq/impl/SQLTemplate.java @@ -82,7 +82,7 @@ class SQLTemplate implements Template { } @Override - public final Clause clause() { + public final Clause[] clauses() { return null; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/SchemaImpl.java b/jOOQ/src/main/java/org/jooq/impl/SchemaImpl.java index b4569cef59..c82b68c08e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SchemaImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SchemaImpl.java @@ -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 diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsExistsCondition.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsExistsCondition.java index 72e7a00d56..44ec8e8a86 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsExistsCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsExistsCondition.java @@ -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; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsField.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsField.java index 3bf32885d1..c9a3b8064a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsField.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsField.java @@ -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 extends AbstractField { .sql(")"); } } - - @Override - public final Clause clause() { - return null; - } } diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsSubQueryCondition.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsSubQueryCondition.java index 0f13cf1010..59768034bc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsSubQueryCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsSubQueryCondition.java @@ -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; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsTable.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsTable.java index 2b7b78c2f0..a322d6f7cf 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsTable.java @@ -115,7 +115,7 @@ class SelectQueryAsTable extends AbstractTable { } @Override - public final Clause clause() { + public final Clause[] clauses() { return null; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index 92ca04b8c4..ceae51b15c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -107,6 +107,7 @@ class SelectQueryImpl extends AbstractSelect 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 extends AbstractSelect implements Sel } @Override - public final Clause clause() { - return SELECT; + public final Clause[] clauses() { + return CLAUSES; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/SortFieldImpl.java b/jOOQ/src/main/java/org/jooq/impl/SortFieldImpl.java index a32593d94c..f93d68b2cc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SortFieldImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SortFieldImpl.java @@ -166,7 +166,7 @@ class SortFieldImpl extends AbstractQueryPart implements SortField { } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/TableAlias.java b/jOOQ/src/main/java/org/jooq/impl/TableAlias.java index 6480395833..5fc83152c8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableAlias.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableAlias.java @@ -129,8 +129,8 @@ class TableAlias extends AbstractTable { } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/TableFieldImpl.java b/jOOQ/src/main/java/org/jooq/impl/TableFieldImpl.java index d3ae226db5..ef930c4675 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableFieldImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableFieldImpl.java @@ -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 extends AbstractField implements TableField { - private static final long serialVersionUID = -2211214195583539735L; + private static final long serialVersionUID = -2211214195583539735L; + private static final Clause[] CLAUSES = { FIELD, FIELD_REFERENCE }; private final Table table; @@ -69,24 +72,31 @@ class TableFieldImpl extends AbstractField 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 // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/TableImpl.java b/jOOQ/src/main/java/org/jooq/impl/TableImpl.java index f118e013e1..f000871f01 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableImpl.java @@ -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 extends AbstractTable { private static final long serialVersionUID = 261033315221985068L; + private static final Clause[] CLAUSES = { TABLE, TABLE_REFERENCE }; private final Fields fields; private final Alias> alias; @@ -98,8 +100,8 @@ public class TableImpl extends AbstractTable { } @Override - public final Clause clause() { - return TABLE; + public final Clause[] clauses() { + return CLAUSES; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/TrueCondition.java b/jOOQ/src/main/java/org/jooq/impl/TrueCondition.java index 1eb4a0758b..f13fec9294 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TrueCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/TrueCondition.java @@ -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() {} diff --git a/jOOQ/src/main/java/org/jooq/impl/TruncateImpl.java b/jOOQ/src/main/java/org/jooq/impl/TruncateImpl.java index 19730eb1fb..bbc249c274 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TruncateImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TruncateImpl.java @@ -59,7 +59,8 @@ class TruncateImpl 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 table; private Boolean cascade; @@ -137,7 +138,7 @@ class TruncateImpl extends AbstractQuery implements } @Override - public final Clause clause() { - return TRUNCATE; + public final Clause[] clauses() { + return CLAUSES; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/UDTImpl.java b/jOOQ/src/main/java/org/jooq/impl/UDTImpl.java index cb85b2c1fd..73c4fdfe6e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UDTImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UDTImpl.java @@ -140,8 +140,8 @@ public class UDTImpl> extends AbstractQueryPart implement } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/Union.java b/jOOQ/src/main/java/org/jooq/impl/Union.java index 0227bf4812..58a88c7067 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Union.java +++ b/jOOQ/src/main/java/org/jooq/impl/Union.java @@ -64,6 +64,7 @@ class Union extends AbstractSelect { private final List> queries; private final CombineOperator operator; + private final Clause[] clauses; Union(Configuration configuration, Select query1, Select query2, CombineOperator operator) { super(configuration); @@ -72,6 +73,14 @@ class Union extends AbstractSelect { 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 extends AbstractSelect { } @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 diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java index d83aa05019..db5a38b9fc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java @@ -115,6 +115,7 @@ import org.jooq.UpdateQuery; class UpdateQueryImpl extends AbstractStoreQuery implements UpdateQuery { 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 extends AbstractStoreQuery 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 extends AbstractStoreQuery implements } @Override - public final Clause clause() { - return UPDATE; + public final Clause[] clauses() { + return CLAUSES; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/Utils.java b/jOOQ/src/main/java/org/jooq/impl/Utils.java index 6a6ed1d5fa..fe5d5485f4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Utils.java +++ b/jOOQ/src/main/java/org/jooq/impl/Utils.java @@ -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 // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/Values.java b/jOOQ/src/main/java/org/jooq/impl/Values.java index dd48eb3c9d..781a49a0f1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Values.java +++ b/jOOQ/src/main/java/org/jooq/impl/Values.java @@ -161,8 +161,8 @@ class Values extends AbstractTable { } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/WithTable.java b/jOOQ/src/main/java/org/jooq/impl/WithTable.java index 82016866cd..20ec0ddda6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/WithTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/WithTable.java @@ -83,8 +83,8 @@ class WithTable extends AbstractTable { } @Override - public final Clause clause() { - return DUMMY; + public final Clause[] clauses() { + return new Clause[] { DUMMY }; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/WrappedList.java b/jOOQ/src/main/java/org/jooq/impl/WrappedList.java index 96a7703a1c..e174c42822 100644 --- a/jOOQ/src/main/java/org/jooq/impl/WrappedList.java +++ b/jOOQ/src/main/java/org/jooq/impl/WrappedList.java @@ -68,7 +68,7 @@ class WrappedList extends AbstractQueryPart { } @Override - public final Clause clause() { + public final Clause[] clauses() { return null; } } diff --git a/jOOQ/src/test/java/org/jooq/test/VisitContextTest.java b/jOOQ/src/test/java/org/jooq/test/VisitContextTest.java index 78d72adf01..a520bd46f7 100644 --- a/jOOQ/src/test/java/org/jooq/test/VisitContextTest.java +++ b/jOOQ/src/test/java/org/jooq/test/VisitContextTest.java @@ -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> 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> clauses = new ArrayList>(); + + @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) {} + + } }