diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractName.java b/jOOQ/src/main/java/org/jooq/impl/AbstractName.java index 807266f352..c3885819e4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractName.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractName.java @@ -54,7 +54,7 @@ import org.jooq.WindowSpecification; * * @author Lukas Eder */ -abstract class AbstractName extends AbstractQueryPart implements Name { +abstract class AbstractName extends AbstractQueryPart implements Name, SimpleQueryPart { /** * Generated UID diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractParam.java b/jOOQ/src/main/java/org/jooq/impl/AbstractParam.java index 4b9fd334df..58af1fa093 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractParam.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractParam.java @@ -64,7 +64,7 @@ import org.jooq.tools.StringUtils; * * @author Lukas Eder */ -abstract class AbstractParam extends AbstractParamX { +abstract class AbstractParam extends AbstractParamX implements SimpleQueryPart { /** * Generated UID diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRow.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRow.java index 2ddb1ae39e..4c2de8a51d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRow.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRow.java @@ -124,7 +124,7 @@ abstract class AbstractRow extends AbstractQueryPart implements Row { ctx.sql("(") - .visit(wrap(fields.fields).indentSize(0)) + .visit(wrap(fields.fields)) .sql(")"); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Alias.java b/jOOQ/src/main/java/org/jooq/impl/Alias.java index 40e780e1f8..f583244656 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Alias.java +++ b/jOOQ/src/main/java/org/jooq/impl/Alias.java @@ -305,7 +305,7 @@ final class Alias extends AbstractQueryPart { if (context.declareTables() && o instanceof ArrayTable) context.sql('(') - .visit(wrap(((ArrayTable) o).fields()).qualify(false).indentSize(0)) + .visit(wrap(((ArrayTable) o).fields()).qualify(false)) .sql(')'); break; @@ -352,7 +352,7 @@ final class Alias extends AbstractQueryPart { } private final void toSQLDerivedColumnList(Context ctx) { - ctx.sql(" (").visit(wrap(fieldAliases).indentSize(0)).sql(')'); + ctx.sql(" (").visit(wrap(fieldAliases)).sql(')'); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/Coalesce.java b/jOOQ/src/main/java/org/jooq/impl/Coalesce.java index b373daa4be..4fc121e7af 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Coalesce.java +++ b/jOOQ/src/main/java/org/jooq/impl/Coalesce.java @@ -80,7 +80,7 @@ final class Coalesce extends AbstractField { default: { - ctx.visit(DSL.function("coalesce", getDataType(), fields)); + ctx.visit(DSL.function(N_COALESCE, getDataType(), fields)); break; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/ForLock.java b/jOOQ/src/main/java/org/jooq/impl/ForLock.java index 347cd8d6a2..edafa15049 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ForLock.java +++ b/jOOQ/src/main/java/org/jooq/impl/ForLock.java @@ -160,7 +160,7 @@ final class ForLock extends AbstractQueryPart { // Render the OF [table-names] clause default: - ctx.visit(wrap(forLockOfTables).qualify(false).indentSize(0)); + ctx.visit(wrap(forLockOfTables).qualify(false)); break; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/GrantImpl.java b/jOOQ/src/main/java/org/jooq/impl/GrantImpl.java index acfcc7544f..00e497b560 100644 --- a/jOOQ/src/main/java/org/jooq/impl/GrantImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/GrantImpl.java @@ -170,7 +170,7 @@ implements public final void accept(Context ctx) { ctx.start(Clause.GRANT_PRIVILEGE) .visit(K_GRANT).sql(' ') - .visit(QueryPartCollectionView.wrap(privileges).indentSize(0)) + .visit(QueryPartCollectionView.wrap(privileges)) .end(Clause.GRANT_PRIVILEGE).sql(' ') .start(Clause.GRANT_ON) .visit(K_ON).sql(' ') diff --git a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java index df17df1cc2..1e1337202b 100755 --- a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java @@ -475,7 +475,7 @@ implements ctx.formatSeparator() .start(TABLE_JOIN_USING) .visit(K_USING) - .sql(" (").visit(wrap(using).indentSize(0).qualify(false)).sql(')') + .sql(" (").visit(wrap(using).qualify(false)).sql(')') .end(TABLE_JOIN_USING); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Keywords.java b/jOOQ/src/main/java/org/jooq/impl/Keywords.java index 5123ec8b7f..1e56a62dc3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Keywords.java +++ b/jOOQ/src/main/java/org/jooq/impl/Keywords.java @@ -90,7 +90,6 @@ final class Keywords { static final Keyword K_CHANGE_COLUMN = keyword("change column"); static final Keyword K_CHARACTER_SET = keyword("character set"); static final Keyword K_CHECK = keyword("check"); - static final Keyword K_COALESCE = keyword("coalesce"); static final Keyword K_COLLATE = keyword("collate"); static final Keyword K_COLLATION = keyword("collation"); static final Keyword K_COLUMN = keyword("column"); diff --git a/jOOQ/src/main/java/org/jooq/impl/NullIf.java b/jOOQ/src/main/java/org/jooq/impl/NullIf.java index b268181b6c..09b064ea7e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/NullIf.java +++ b/jOOQ/src/main/java/org/jooq/impl/NullIf.java @@ -37,6 +37,7 @@ */ package org.jooq.impl; +import static org.jooq.impl.DSL.function; import static org.jooq.impl.Keywords.K_NULL; import static org.jooq.impl.Names.N_IIF; import static org.jooq.impl.Names.N_NULLIF; @@ -74,7 +75,7 @@ final class NullIf extends AbstractField { default: - ctx.visit(N_NULLIF).sql('(').visit(arg1).sql(", ").visit(arg2).sql(')'); + ctx.visit(function(N_NULLIF, getDataType(), arg1, arg2)); break; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Nvl.java b/jOOQ/src/main/java/org/jooq/impl/Nvl.java index 164a5f8d45..3014cca7cd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Nvl.java +++ b/jOOQ/src/main/java/org/jooq/impl/Nvl.java @@ -37,7 +37,7 @@ */ package org.jooq.impl; -import static org.jooq.impl.Keywords.K_COALESCE; +import static org.jooq.impl.DSL.function; import static org.jooq.impl.Keywords.K_IS_NULL; import static org.jooq.impl.Names.N_IFNULL; import static org.jooq.impl.Names.N_IIF; @@ -79,16 +79,22 @@ final class Nvl extends AbstractField { - case H2: - case HSQLDB: - ctx.visit(N_NVL).sql('(').visit(arg1).sql(", ").visit(arg2).sql(')'); - break; + + + + + + + + case CUBRID: case DERBY: + case IGNITE: + case FIREBIRD: case POSTGRES: - ctx.visit(K_COALESCE).sql('(').visit(arg1).sql(", ").visit(arg2).sql(')'); + ctx.visit(DSL.coalesce(arg1, arg2)); break; @@ -97,11 +103,11 @@ final class Nvl extends AbstractField { case MARIADB: case MYSQL: case SQLITE: - ctx.visit(N_IFNULL).sql('(').visit(arg1).sql(", ").visit(arg2).sql(')'); + ctx.visit(function(N_IFNULL, getDataType(), arg1, arg2)); break; default: - ctx.visit(DSL.when(arg1.isNotNull(), arg1).otherwise(arg2)); + ctx.visit(function(N_NVL, getDataType(), arg1, arg2)); break; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/PositionalWindowFunction.java b/jOOQ/src/main/java/org/jooq/impl/PositionalWindowFunction.java index 54ed4a343a..83ae21b009 100644 --- a/jOOQ/src/main/java/org/jooq/impl/PositionalWindowFunction.java +++ b/jOOQ/src/main/java/org/jooq/impl/PositionalWindowFunction.java @@ -39,7 +39,7 @@ package org.jooq.impl; import static org.jooq.conf.ParamType.INLINED; import static org.jooq.impl.DSL.inlined; -import static org.jooq.impl.Keywords.K_COALESCE; +import static org.jooq.impl.Names.N_COALESCE; import static org.jooq.impl.PositionalWindowFunction.PositionalFunctionType.LAG; import static org.jooq.impl.PositionalWindowFunction.PositionalFunctionType.LEAD; diff --git a/jOOQ/src/main/java/org/jooq/impl/PrivilegeImpl.java b/jOOQ/src/main/java/org/jooq/impl/PrivilegeImpl.java index 83c70e55fb..0b28363db8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/PrivilegeImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/PrivilegeImpl.java @@ -47,7 +47,7 @@ import org.jooq.Privilege; /** * @author Timur Shaidullin */ -final class PrivilegeImpl extends AbstractQueryPart implements Privilege { +final class PrivilegeImpl extends AbstractQueryPart implements Privilege, SimpleQueryPart { /** * Generated UID diff --git a/jOOQ/src/main/java/org/jooq/impl/QueryPartCollectionView.java b/jOOQ/src/main/java/org/jooq/impl/QueryPartCollectionView.java index 9be3d8fcef..af9ae9056b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QueryPartCollectionView.java +++ b/jOOQ/src/main/java/org/jooq/impl/QueryPartCollectionView.java @@ -65,7 +65,6 @@ class QueryPartCollectionView extends AbstractQueryPart imp private static final long serialVersionUID = -2936922742534009564L; final Collection wrapped; - int indentSize; Boolean qualify; String separator; Function mapper; @@ -76,18 +75,9 @@ class QueryPartCollectionView extends AbstractQueryPart imp QueryPartCollectionView(Collection wrapped) { this.wrapped = wrapped != null ? wrapped : Collections.emptyList(); - this.indentSize = 2; this.separator = ","; } - /** - * Whether to indent this list, and after what size indentation is applied. - */ - QueryPartCollectionView indentSize(int newIndentSize) { - this.indentSize = newIndentSize <= 0 ? Integer.MAX_VALUE : newIndentSize; - return this; - } - QueryPartCollectionView qualify(boolean newQualify) { this.qualify = newQualify; return this; @@ -121,7 +111,7 @@ class QueryPartCollectionView extends AbstractQueryPart imp rendersContent.set(i++, ((QueryPartInternal) e).rendersContent(ctx)); int size = rendersContent.cardinality(); - boolean format = ctx.format() && size >= indentSize; + boolean format = ctx.format() && (size >= 2 && requireIndentation()); boolean previousQualify = ctx.qualify(); boolean previousAlreadyIndented = TRUE.equals(ctx.data(DATA_LIST_ALREADY_INDENTED)); boolean indent = format && !previousAlreadyIndented; @@ -194,6 +184,14 @@ class QueryPartCollectionView extends AbstractQueryPart imp ctx.data(DATA_LIST_ALREADY_INDENTED, previousAlreadyIndented); } + private final boolean requireIndentation() { + for (T t : this) + if (!Tools.isSimple(t)) + return true; + + return false; + } + /** * Subclasses may override this method */ diff --git a/jOOQ/src/main/java/org/jooq/impl/QueryPartList.java b/jOOQ/src/main/java/org/jooq/impl/QueryPartList.java index a96aca1314..5178a6f7ac 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QueryPartList.java +++ b/jOOQ/src/main/java/org/jooq/impl/QueryPartList.java @@ -68,11 +68,6 @@ class QueryPartList extends QueryPartListView { addAll(wrappedList); } - @Override - QueryPartList indentSize(int newIndentSize) { - return (QueryPartList) super.indentSize(newIndentSize); - } - @Override QueryPartList qualify(boolean newQualify) { return (QueryPartList) super.qualify(newQualify); diff --git a/jOOQ/src/main/java/org/jooq/impl/QueryPartListView.java b/jOOQ/src/main/java/org/jooq/impl/QueryPartListView.java index be7b98e330..277227a2e6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QueryPartListView.java +++ b/jOOQ/src/main/java/org/jooq/impl/QueryPartListView.java @@ -76,11 +76,6 @@ class QueryPartListView extends QueryPartCollectionView super(wrappedList); } - @Override - QueryPartListView indentSize(int newIndentSize) { - return (QueryPartListView) super.indentSize(newIndentSize); - } - @Override QueryPartListView qualify(boolean newQualify) { return (QueryPartListView) super.qualify(newQualify); diff --git a/jOOQ/src/main/java/org/jooq/impl/RevokeImpl.java b/jOOQ/src/main/java/org/jooq/impl/RevokeImpl.java index 6f02c1956e..50a6059af1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RevokeImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/RevokeImpl.java @@ -169,7 +169,7 @@ implements ctx.visit(K_GRANT_OPTION_FOR) .sql(' '); - ctx.visit(QueryPartCollectionView.wrap(privileges).indentSize(0)) + ctx.visit(QueryPartCollectionView.wrap(privileges)) .end(Clause.REVOKE_PRIVILEGE).sql(' ') .start(Clause.REVOKE_ON) .visit(K_ON).sql(' ') diff --git a/jOOQ/src/main/java/org/jooq/impl/ScopeMappable.java b/jOOQ/src/main/java/org/jooq/impl/ScopeMappable.java index 0de4d8b37a..a5f5fb8327 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ScopeMappable.java +++ b/jOOQ/src/main/java/org/jooq/impl/ScopeMappable.java @@ -47,5 +47,4 @@ import org.jooq.QueryPartInternal; * * @author Lukas Eder */ -interface ScopeMappable extends QueryPartInternal { -} +interface ScopeMappable extends QueryPartInternal {} diff --git a/jOOQ/src/main/java/org/jooq/impl/ScopeNestable.java b/jOOQ/src/main/java/org/jooq/impl/ScopeNestable.java index 7c3dff795e..fd0ea32533 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ScopeNestable.java +++ b/jOOQ/src/main/java/org/jooq/impl/ScopeNestable.java @@ -37,8 +37,6 @@ */ package org.jooq.impl; -import org.jooq.Context; -import org.jooq.QueryPart; import org.jooq.QueryPartInternal; /** @@ -46,5 +44,4 @@ import org.jooq.QueryPartInternal; * * @author Lukas Eder */ -interface ScopeNestable extends QueryPartInternal { -} +interface ScopeNestable extends QueryPartInternal {} diff --git a/jOOQ/src/main/java/org/jooq/impl/SortFieldImpl.java b/jOOQ/src/main/java/org/jooq/impl/SortFieldImpl.java index 76ac761a50..e33da1baa1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SortFieldImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SortFieldImpl.java @@ -67,7 +67,7 @@ import org.jooq.SQLDialect; import org.jooq.SortField; import org.jooq.SortOrder; -final class SortFieldImpl extends AbstractQueryPart implements SortField { +final class SortFieldImpl extends AbstractQueryPart implements SortField, SimpleQueryPart { /** * Generated UID @@ -87,6 +87,11 @@ final class SortFieldImpl extends AbstractQueryPart implements SortField { this.order = order; } + @Override + public boolean isSimple() { + return !nullsFirst && !nullsLast && Tools.isSimple(field); + } + @Override public final String getName() { return field.getName(); diff --git a/jOOQ/src/main/java/org/jooq/impl/SplitPart.java b/jOOQ/src/main/java/org/jooq/impl/SplitPart.java index 95aa3c58e8..14390b71bf 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SplitPart.java +++ b/jOOQ/src/main/java/org/jooq/impl/SplitPart.java @@ -126,6 +126,7 @@ extends + case MARIADB: diff --git a/jOOQ/src/main/java/org/jooq/impl/Substring.java b/jOOQ/src/main/java/org/jooq/impl/Substring.java index bd78b2c95f..5377b14331 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Substring.java +++ b/jOOQ/src/main/java/org/jooq/impl/Substring.java @@ -162,9 +162,9 @@ extends } if (length == null) - ctx.visit(functionName).sql('(').visit(string).sql(", ").visit(startingPosition).sql(')'); + ctx.visit(function(functionName, getDataType(), string, startingPosition)); else - ctx.visit(functionName).sql('(').visit(string).sql(", ").visit(startingPosition).sql(", ").visit(length).sql(')'); + ctx.visit(function(functionName, getDataType(), string, startingPosition, length)); } diff --git a/jOOQ/src/main/java/org/jooq/impl/TableFieldImpl.java b/jOOQ/src/main/java/org/jooq/impl/TableFieldImpl.java index b69c419fdd..d257314af6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableFieldImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableFieldImpl.java @@ -58,7 +58,7 @@ import org.jooq.tools.StringUtils; * * @author Lukas Eder */ -class TableFieldImpl extends AbstractField implements TableField { +class TableFieldImpl extends AbstractField implements TableField, SimpleQueryPart { private static final long serialVersionUID = -2211214195583539735L; private static final Clause[] CLAUSES = { FIELD, FIELD_REFERENCE }; diff --git a/jOOQ/src/main/java/org/jooq/impl/TableImpl.java b/jOOQ/src/main/java/org/jooq/impl/TableImpl.java index bf71b18555..96dcdffd9f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableImpl.java @@ -84,7 +84,7 @@ import org.jooq.tools.StringUtils; * @author Lukas Eder */ @org.jooq.Internal -public class TableImpl extends AbstractTable implements ScopeMappable, ScopeNestable { +public class TableImpl extends AbstractTable implements ScopeMappable, ScopeNestable, SimpleQueryPart { private static final long serialVersionUID = 261033315221985068L; private static final Clause[] CLAUSES_TABLE_REFERENCE = { TABLE, TABLE_REFERENCE }; diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index ab51c8f813..a8ea0fa487 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -3149,8 +3149,11 @@ final class Tools { } static final boolean isWindow(Field f) { - return f instanceof AbstractWindowFunction - && ((AbstractWindowFunction) f).isWindow(); + return f instanceof AbstractWindowFunction && ((AbstractWindowFunction) f).isWindow(); + } + + static final boolean isSimple(QueryPart part) { + return part instanceof SimpleQueryPart && ((SimpleQueryPart) part).isSimple(); } static final Val extractVal(Field field) {