From 9b9577abd46ab3fb1214bdea8ff6365d96823775 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Sun, 19 Nov 2023 06:38:41 -0500 Subject: [PATCH 01/13] Remove a procrastination if --- src/main/java/org/mybatis/dynamic/sql/SqlColumn.java | 6 +++--- .../dynamic/sql/util/kotlin/elements/SqlTableExtensions.kt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java b/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java index 1095f1144..be63bb032 100644 --- a/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java +++ b/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java @@ -46,7 +46,7 @@ private SqlColumn(Builder builder) { alias = builder.alias; typeHandler = builder.typeHandler; renderingStrategy = builder.renderingStrategy; - parameterTypeConverter = builder.parameterTypeConverter; + parameterTypeConverter = Objects.requireNonNull(builder.parameterTypeConverter); tableQualifier = builder.tableQualifier; javaType = builder.javaType; } @@ -81,7 +81,7 @@ public Optional> javaType() { @Override public Object convertParameterType(T value) { - return parameterTypeConverter == null ? value : parameterTypeConverter.convert(value); + return parameterTypeConverter.convert(value); } @Override @@ -218,7 +218,7 @@ public static class Builder { protected String alias; protected String typeHandler; protected RenderingStrategy renderingStrategy; - protected ParameterTypeConverter parameterTypeConverter; + protected ParameterTypeConverter parameterTypeConverter = v -> v; protected String tableQualifier; protected Class javaType; diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/elements/SqlTableExtensions.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/elements/SqlTableExtensions.kt index 07b7cc326..3288118f7 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/elements/SqlTableExtensions.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/elements/SqlTableExtensions.kt @@ -33,7 +33,7 @@ fun SqlTable.column( jdbcType: JDBCType? = null, typeHandler: String? = null, renderingStrategy: RenderingStrategy? = null, - parameterTypeConverter: ((T?) -> Any?)? = null, + parameterTypeConverter: ((T?) -> Any?)? = { it }, javaType: KClass? = null ): SqlColumn = SqlColumn.Builder().run { withTable(this@column) From ac6aa803e894ca9ad9fb445b0cd4c6b9373e2b8c Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Sun, 19 Nov 2023 06:54:47 -0500 Subject: [PATCH 02/13] Use a reasonable default --- .../org/mybatis/dynamic/sql/render/RenderingContext.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java index 1d865a824..cab877788 100644 --- a/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java +++ b/src/main/java/org/mybatis/dynamic/sql/render/RenderingContext.java @@ -42,11 +42,10 @@ public class RenderingContext { private RenderingContext(Builder builder) { renderingStrategy = Objects.requireNonNull(builder.renderingStrategy); configuredParameterName = builder.parameterName; + tableAliasCalculator = Objects.requireNonNull(builder.tableAliasCalculator); // reasonable defaults sequence = builder.sequence == null ? new AtomicInteger(1) : builder.sequence; - tableAliasCalculator = builder.tableAliasCalculator == null ? TableAliasCalculator.empty() - : builder.tableAliasCalculator; calculatedParameterName = builder.parameterName == null ? RenderingStrategy.DEFAULT_PARAMETER_PREFIX : builder.parameterName + "." + RenderingStrategy.DEFAULT_PARAMETER_PREFIX; //$NON-NLS-1$ } @@ -96,7 +95,7 @@ public String aliasedTableName(SqlTable table) { } /** - * Crete a new rendering context based on this, with the table alias calculator modified to include the + * Create a new rendering context based on this, with the table alias calculator modified to include the * specified child table alias calculator. This is used by the query expression renderer when the alias calculator * may change during rendering. * @@ -125,7 +124,7 @@ public static Builder withRenderingStrategy(RenderingStrategy renderingStrategy) public static class Builder { private RenderingStrategy renderingStrategy; private AtomicInteger sequence; - private TableAliasCalculator tableAliasCalculator; + private TableAliasCalculator tableAliasCalculator = TableAliasCalculator.empty(); private String parameterName; public Builder withRenderingStrategy(RenderingStrategy renderingStrategy) { From 835c6edb17eeeea4e7639498e519298b7bc3b042 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Sun, 19 Nov 2023 07:04:40 -0500 Subject: [PATCH 03/13] Don't return null from a method --- .../dynamic/sql/select/MultiSelectDSL.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectDSL.java index 2f03fedf8..f21cb99fa 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectDSL.java @@ -74,24 +74,24 @@ public FetchFirstFinisher fetchFirst(long fetchFirstRows) { @NotNull @Override public MultiSelectModel build() { - return new MultiSelectModel.Builder() + MultiSelectModel.Builder builder = new MultiSelectModel.Builder() .withInitialSelect(initialSelect) .withUnionQueries(unionQueries) - .withOrderByModel(orderByModel) - .withPagingModel(buildPagingModel()) - .build(); + .withOrderByModel(orderByModel); + + addPagingModel(builder); + return builder.build(); } - private PagingModel buildPagingModel() { - if (limit == null && offset == null && fetchFirstRows == null) { - return null; + private void addPagingModel(MultiSelectModel.Builder builder) { + if (limit != null || offset != null || fetchFirstRows != null) { + // add paging model if any values set + builder.withPagingModel(new PagingModel.Builder() + .withLimit(limit) + .withOffset(offset) + .withFetchFirstRows(fetchFirstRows) + .build()); } - - return new PagingModel.Builder() - .withLimit(limit) - .withOffset(offset) - .withFetchFirstRows(fetchFirstRows) - .build(); } public class LimitFinisher implements Buildable { From 9c4c8b82741e945d5c31957bedb253ee1b309e17 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Sun, 19 Nov 2023 08:52:36 -0500 Subject: [PATCH 04/13] Add validation utility --- .../common/AbstractBooleanExpressionDSL.java | 8 +-- .../dynamic/sql/common/OrderByModel.java | 7 +-- .../dynamic/sql/insert/BatchInsertModel.java | 11 ++-- .../sql/insert/GeneralInsertModel.java | 7 +-- .../sql/insert/InsertColumnListModel.java | 8 +-- .../dynamic/sql/insert/InsertModel.java | 7 +-- .../sql/insert/MultiRowInsertModel.java | 11 ++-- .../insert/render/GeneralInsertRenderer.java | 7 +-- .../sql/insert/render/InsertRenderer.java | 7 +-- .../dynamic/sql/select/GroupByModel.java | 7 +-- .../dynamic/sql/select/MultiSelectModel.java | 7 +-- .../sql/select/QueryExpressionModel.java | 8 +-- .../dynamic/sql/select/SelectModel.java | 8 +-- .../dynamic/sql/select/aggregate/Sum.java | 7 +-- .../dynamic/sql/select/join/JoinModel.java | 8 +-- .../sql/select/join/JoinSpecification.java | 8 +-- .../dynamic/sql/update/UpdateModel.java | 8 +-- .../sql/update/render/UpdateRenderer.java | 8 ++- .../mybatis/dynamic/sql/util/Validator.java | 50 +++++++++++++++++++ 19 files changed, 89 insertions(+), 103 deletions(-) create mode 100644 src/main/java/org/mybatis/dynamic/sql/util/Validator.java diff --git a/src/main/java/org/mybatis/dynamic/sql/common/AbstractBooleanExpressionDSL.java b/src/main/java/org/mybatis/dynamic/sql/common/AbstractBooleanExpressionDSL.java index 701177d89..881448345 100644 --- a/src/main/java/org/mybatis/dynamic/sql/common/AbstractBooleanExpressionDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/common/AbstractBooleanExpressionDSL.java @@ -28,8 +28,7 @@ import org.mybatis.dynamic.sql.ExistsPredicate; import org.mybatis.dynamic.sql.SqlCriterion; import org.mybatis.dynamic.sql.VisitableCondition; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; public abstract class AbstractBooleanExpressionDSL> { private SqlCriterion initialCriterion; // WARNING - may be null! @@ -146,10 +145,7 @@ private void addSubCriteria(String connector, List criteria) } protected void setInitialCriterion(SqlCriterion initialCriterion, StatementType statementType) { - if (this.initialCriterion != null) { - throw new InvalidSqlException(Messages.getString(statementType.messageNumber())); //$NON-NLS-1$ - } - + Validator.assertTrue(this.initialCriterion == null, statementType.messageNumber()); this.initialCriterion = initialCriterion; } diff --git a/src/main/java/org/mybatis/dynamic/sql/common/OrderByModel.java b/src/main/java/org/mybatis/dynamic/sql/common/OrderByModel.java index 54cc8d6f2..61523ec57 100644 --- a/src/main/java/org/mybatis/dynamic/sql/common/OrderByModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/common/OrderByModel.java @@ -23,17 +23,14 @@ import java.util.stream.Stream; import org.mybatis.dynamic.sql.SortSpecification; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; public class OrderByModel { private final List columns = new ArrayList<>(); private OrderByModel(Collection columns) { Objects.requireNonNull(columns); - if (columns.isEmpty()) { - throw new InvalidSqlException(Messages.getString("ERROR.12")); //$NON-NLS-1$ - } + Validator.assertNotEmpty(columns, "ERROR.12"); //$NON-NLS-1$ this.columns.addAll(columns); } diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/BatchInsertModel.java b/src/main/java/org/mybatis/dynamic/sql/insert/BatchInsertModel.java index c0af048a6..bd38515a0 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/BatchInsertModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/BatchInsertModel.java @@ -18,22 +18,17 @@ import java.util.Collection; import org.jetbrains.annotations.NotNull; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; import org.mybatis.dynamic.sql.insert.render.BatchInsert; import org.mybatis.dynamic.sql.insert.render.BatchInsertRenderer; import org.mybatis.dynamic.sql.render.RenderingStrategy; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; public class BatchInsertModel extends AbstractMultiRowInsertModel { private BatchInsertModel(Builder builder) { super(builder); - if (records().isEmpty()) { - throw new InvalidSqlException(Messages.getString("ERROR.19")); //$NON-NLS-1$ - } - if (columnMappings.isEmpty()) { - throw new InvalidSqlException(Messages.getString("ERROR.5")); //$NON-NLS-1$ - } + Validator.assertNotEmpty(records(), "ERROR.19"); //$NON-NLS-1$ + Validator.assertNotEmpty(columnMappings, "ERROR.5"); //$NON-NLS-1$ } @NotNull diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/GeneralInsertModel.java b/src/main/java/org/mybatis/dynamic/sql/insert/GeneralInsertModel.java index 2a504da2a..555994095 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/GeneralInsertModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/GeneralInsertModel.java @@ -23,12 +23,11 @@ import org.jetbrains.annotations.NotNull; import org.mybatis.dynamic.sql.SqlTable; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; import org.mybatis.dynamic.sql.insert.render.GeneralInsertRenderer; import org.mybatis.dynamic.sql.insert.render.GeneralInsertStatementProvider; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.util.AbstractColumnMapping; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; public class GeneralInsertModel { @@ -37,9 +36,7 @@ public class GeneralInsertModel { private GeneralInsertModel(Builder builder) { table = Objects.requireNonNull(builder.table); - if (builder.insertMappings.isEmpty()) { - throw new InvalidSqlException(Messages.getString("ERROR.6")); //$NON-NLS-1$ - } + Validator.assertNotEmpty(builder.insertMappings, "ERROR.6"); //$NON-NLS-1$ insertMappings = builder.insertMappings; } diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/InsertColumnListModel.java b/src/main/java/org/mybatis/dynamic/sql/insert/InsertColumnListModel.java index 7ce19a9bd..fe67f03fc 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/InsertColumnListModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/InsertColumnListModel.java @@ -22,18 +22,14 @@ import java.util.stream.Stream; import org.mybatis.dynamic.sql.SqlColumn; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; public class InsertColumnListModel { private final List> columns = new ArrayList<>(); private InsertColumnListModel(List> columns) { Objects.requireNonNull(columns); - if (columns.isEmpty()) { - throw new InvalidSqlException(Messages.getString("ERROR.4")); //$NON-NLS-1$ - } - + Validator.assertNotEmpty(columns, "ERROR.4"); //$NON-NLS-1$ this.columns.addAll(columns); } diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/InsertModel.java b/src/main/java/org/mybatis/dynamic/sql/insert/InsertModel.java index cb229aefa..bcdff9d26 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/InsertModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/InsertModel.java @@ -23,12 +23,11 @@ import org.jetbrains.annotations.NotNull; import org.mybatis.dynamic.sql.SqlTable; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; import org.mybatis.dynamic.sql.insert.render.InsertRenderer; import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.util.AbstractColumnMapping; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; public class InsertModel { private final SqlTable table; @@ -39,9 +38,7 @@ private InsertModel(Builder builder) { table = Objects.requireNonNull(builder.table); row = Objects.requireNonNull(builder.row); columnMappings = Objects.requireNonNull(builder.columnMappings); - if (columnMappings.isEmpty()) { - throw new InvalidSqlException(Messages.getString("ERROR.7")); //$NON-NLS-1$ - } + Validator.assertNotEmpty(columnMappings, "ERROR.7"); //$NON-NLS-1$ } public Stream mapColumnMappings(Function mapper) { diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/MultiRowInsertModel.java b/src/main/java/org/mybatis/dynamic/sql/insert/MultiRowInsertModel.java index d8ba0f29d..82391a410 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/MultiRowInsertModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/MultiRowInsertModel.java @@ -18,22 +18,17 @@ import java.util.Collection; import org.jetbrains.annotations.NotNull; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; import org.mybatis.dynamic.sql.insert.render.MultiRowInsertRenderer; import org.mybatis.dynamic.sql.insert.render.MultiRowInsertStatementProvider; import org.mybatis.dynamic.sql.render.RenderingStrategy; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; public class MultiRowInsertModel extends AbstractMultiRowInsertModel { private MultiRowInsertModel(Builder builder) { super(builder); - if (records().isEmpty()) { - throw new InvalidSqlException(Messages.getString("ERROR.20")); //$NON-NLS-1$ - } - if (columnMappings.isEmpty()) { - throw new InvalidSqlException(Messages.getString("ERROR.8")); //$NON-NLS-1$ - } + Validator.assertNotEmpty(records(), "ERROR.20"); //$NON-NLS-1$ + Validator.assertNotEmpty(columnMappings, "ERROR.8"); //$NON-NLS-1$ } @NotNull diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertRenderer.java b/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertRenderer.java index 5cdee9706..d689dc7e6 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertRenderer.java @@ -18,11 +18,10 @@ import java.util.Objects; import java.util.Optional; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; import org.mybatis.dynamic.sql.insert.GeneralInsertModel; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategy; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; public class GeneralInsertRenderer { @@ -43,9 +42,7 @@ public GeneralInsertStatementProvider render() { .map(Optional::get) .collect(FieldAndValueCollector.collect()); - if (collector.isEmpty()) { - throw new InvalidSqlException(Messages.getString("ERROR.9")); //$NON-NLS-1$ - } + Validator.assertFalse(collector.isEmpty(), "ERROR.9"); //$NON-NLS-1$ String insertStatement = InsertRenderingUtilities.calculateInsertStatement(model.table(), collector); diff --git a/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertRenderer.java b/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertRenderer.java index 25eec367e..0cb4f0881 100644 --- a/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/insert/render/InsertRenderer.java @@ -18,10 +18,9 @@ import java.util.Objects; import java.util.Optional; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; import org.mybatis.dynamic.sql.insert.InsertModel; import org.mybatis.dynamic.sql.render.RenderingStrategy; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; public class InsertRenderer { @@ -41,9 +40,7 @@ public InsertStatementProvider render() { .map(Optional::get) .collect(FieldAndValueCollector.collect()); - if (collector.isEmpty()) { - throw new InvalidSqlException(Messages.getString("ERROR.10")); //$NON-NLS-1$ - } + Validator.assertFalse(collector.isEmpty(), "ERROR.10"); //$NON-NLS-1$ String insertStatement = InsertRenderingUtilities.calculateInsertStatement(model.table(), collector); diff --git a/src/main/java/org/mybatis/dynamic/sql/select/GroupByModel.java b/src/main/java/org/mybatis/dynamic/sql/select/GroupByModel.java index 3781f023e..2c78a99f3 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/GroupByModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/GroupByModel.java @@ -23,17 +23,14 @@ import java.util.stream.Stream; import org.mybatis.dynamic.sql.BasicColumn; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; public class GroupByModel { private final List columns = new ArrayList<>(); private GroupByModel(Collection columns) { Objects.requireNonNull(columns); - if (columns.isEmpty()) { - throw new InvalidSqlException(Messages.getString("ERROR.11")); //$NON-NLS-1$ - } + Validator.assertNotEmpty(columns, "ERROR.11"); //$NON-NLS-1$ this.columns.addAll(columns); } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectModel.java b/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectModel.java index aa5a804cd..93def05fd 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectModel.java @@ -24,11 +24,10 @@ import org.jetbrains.annotations.NotNull; import org.mybatis.dynamic.sql.common.OrderByModel; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.select.render.MultiSelectRenderer; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; public class MultiSelectModel { private final SelectModel initialSelect; @@ -41,9 +40,7 @@ private MultiSelectModel(Builder builder) { unionQueries = builder.unionQueries; orderByModel = builder.orderByModel; pagingModel = builder.pagingModel; - if (unionQueries.isEmpty()) { - throw new InvalidSqlException(Messages.getString("ERROR.35")); //$NON-NLS-1$ - } + Validator.assertNotEmpty(unionQueries, "ERROR.35"); //$NON-NLS-1$); } public SelectModel initialSelect() { diff --git a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionModel.java b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionModel.java index f1e27d7ee..40b16e23e 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionModel.java @@ -27,9 +27,8 @@ import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.SqlTable; import org.mybatis.dynamic.sql.TableExpression; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; import org.mybatis.dynamic.sql.select.join.JoinModel; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; import org.mybatis.dynamic.sql.where.WhereModel; public class QueryExpressionModel { @@ -53,10 +52,7 @@ private QueryExpressionModel(Builder builder) { whereModel = builder.whereModel; groupByModel = builder.groupByModel; havingModel = builder.havingModel; - - if (selectList.isEmpty()) { - throw new InvalidSqlException(Messages.getString("ERROR.13")); //$NON-NLS-1$ - } + Validator.assertNotEmpty(selectList, "ERROR.13"); //$NON-NLS-1$ } public Optional connector() { diff --git a/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java b/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java index c2ee62794..16ff5bdfc 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/SelectModel.java @@ -24,12 +24,11 @@ import org.jetbrains.annotations.NotNull; import org.mybatis.dynamic.sql.common.OrderByModel; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.select.render.SelectRenderer; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; public class SelectModel { private final List queryExpressions; @@ -38,10 +37,7 @@ public class SelectModel { private SelectModel(Builder builder) { queryExpressions = Objects.requireNonNull(builder.queryExpressions); - if (queryExpressions.isEmpty()) { - throw new InvalidSqlException(Messages.getString("ERROR.14")); //$NON-NLS-1$ - } - + Validator.assertNotEmpty(queryExpressions, "ERROR.14"); //$NON-NLS-1$ orderByModel = builder.orderByModel; pagingModel = builder.pagingModel; } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java b/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java index dbb03096f..aa3404221 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java @@ -17,11 +17,10 @@ import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.VisitableCondition; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.select.function.AbstractUniTypeFunction; import org.mybatis.dynamic.sql.util.FragmentAndParameters; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; import org.mybatis.dynamic.sql.where.render.DefaultConditionVisitor; public class Sum extends AbstractUniTypeFunction> { @@ -50,9 +49,7 @@ private FragmentAndParameters renderWithoutCondition(RenderingContext renderingC } private FragmentAndParameters renderWithCondition(RenderingContext renderingContext) { - if (!condition.shouldRender()) { - throw new InvalidSqlException(Messages.getString("ERROR.37", "sum")); //$NON-NLS-1$ //$NON-NLS-2$ - } + Validator.assertTrue(condition.shouldRender(), "ERROR.37", "sum"); //$NON-NLS-1$ //$NON-NLS-2$ DefaultConditionVisitor visitor = new DefaultConditionVisitor.Builder() .withColumn(column) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/join/JoinModel.java b/src/main/java/org/mybatis/dynamic/sql/select/join/JoinModel.java index bb94ea451..e24139efd 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/join/JoinModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/join/JoinModel.java @@ -22,18 +22,14 @@ import java.util.stream.Stream; import org.mybatis.dynamic.sql.TableExpression; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; public class JoinModel { private final List joinSpecifications = new ArrayList<>(); private JoinModel(List joinSpecifications) { Objects.requireNonNull(joinSpecifications); - if (joinSpecifications.isEmpty()) { - throw new InvalidSqlException(Messages.getString("ERROR.15")); //$NON-NLS-1$ - } - + Validator.assertNotEmpty(joinSpecifications, "ERROR.15"); //$NON-NLS-1$ this.joinSpecifications.addAll(joinSpecifications); } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/join/JoinSpecification.java b/src/main/java/org/mybatis/dynamic/sql/select/join/JoinSpecification.java index 7aba7473e..4c85120f3 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/join/JoinSpecification.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/join/JoinSpecification.java @@ -22,8 +22,7 @@ import java.util.stream.Stream; import org.mybatis.dynamic.sql.TableExpression; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; public class JoinSpecification { @@ -35,10 +34,7 @@ private JoinSpecification(Builder builder) { table = Objects.requireNonNull(builder.table); joinCriteria = Objects.requireNonNull(builder.joinCriteria); joinType = Objects.requireNonNull(builder.joinType); - - if (joinCriteria.isEmpty()) { - throw new InvalidSqlException(Messages.getString("ERROR.16")); //$NON-NLS-1$ - } + Validator.assertNotEmpty(joinCriteria, "ERROR.16"); //$NON-NLS-1$ } public TableExpression table() { diff --git a/src/main/java/org/mybatis/dynamic/sql/update/UpdateModel.java b/src/main/java/org/mybatis/dynamic/sql/update/UpdateModel.java index e12db1dea..3cf7caf1a 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/UpdateModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/UpdateModel.java @@ -26,12 +26,11 @@ import org.mybatis.dynamic.sql.SqlTable; import org.mybatis.dynamic.sql.common.CommonBuilder; import org.mybatis.dynamic.sql.common.OrderByModel; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.update.render.UpdateRenderer; import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider; import org.mybatis.dynamic.sql.util.AbstractColumnMapping; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; import org.mybatis.dynamic.sql.where.WhereModel; public class UpdateModel { @@ -49,10 +48,7 @@ private UpdateModel(Builder builder) { tableAlias = builder.tableAlias(); limit = builder.limit(); orderByModel = builder.orderByModel(); - - if (columnMappings.isEmpty()) { - throw new InvalidSqlException(Messages.getString("ERROR.17")); //$NON-NLS-1$ - } + Validator.assertNotEmpty(columnMappings, "ERROR.17"); //$NON-NLS-1$ } public SqlTable table() { diff --git a/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java b/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java index b58458b89..c74f70afe 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/render/UpdateRenderer.java @@ -22,7 +22,6 @@ import org.mybatis.dynamic.sql.common.OrderByModel; import org.mybatis.dynamic.sql.common.OrderByRenderer; -import org.mybatis.dynamic.sql.exception.InvalidSqlException; import org.mybatis.dynamic.sql.render.ExplicitTableAliasCalculator; import org.mybatis.dynamic.sql.render.RenderedParameterInfo; import org.mybatis.dynamic.sql.render.RenderingContext; @@ -31,7 +30,7 @@ import org.mybatis.dynamic.sql.update.UpdateModel; import org.mybatis.dynamic.sql.util.FragmentAndParameters; import org.mybatis.dynamic.sql.util.FragmentCollector; -import org.mybatis.dynamic.sql.util.Messages; +import org.mybatis.dynamic.sql.util.Validator; import org.mybatis.dynamic.sql.where.WhereModel; import org.mybatis.dynamic.sql.where.render.WhereRenderer; @@ -81,9 +80,8 @@ private FragmentAndParameters calculateSetPhrase() { updateModel.mapColumnMappings(m -> m.accept(visitor)) .collect(Collectors.toList()); - if (fragmentsAndParameters.stream().noneMatch(Optional::isPresent)) { - throw new InvalidSqlException(Messages.getString("ERROR.18")); //$NON-NLS-1$ - } + Validator.assertFalse(fragmentsAndParameters.stream().noneMatch(Optional::isPresent), + "ERROR.18"); //$NON-NLS-1$ FragmentCollector fragmentCollector = fragmentsAndParameters.stream() .filter(Optional::isPresent) diff --git a/src/main/java/org/mybatis/dynamic/sql/util/Validator.java b/src/main/java/org/mybatis/dynamic/sql/util/Validator.java new file mode 100644 index 000000000..b4ab5df49 --- /dev/null +++ b/src/main/java/org/mybatis/dynamic/sql/util/Validator.java @@ -0,0 +1,50 @@ +/* + * Copyright 2016-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.mybatis.dynamic.sql.util; + +import java.util.Collection; + +import org.mybatis.dynamic.sql.exception.InvalidSqlException; + +public class Validator { + private Validator() {} + + public static void assertNotEmpty(Collection collection, String messageNumber) { + assertFalse(collection.isEmpty(), messageNumber); + } + + public static void assertFalse(boolean condition, String messageNumber) { + internalAssertFalse(condition, Messages.getString(messageNumber)); + } + + public static void assertFalse(boolean condition, String messageNumber, String p1) { + internalAssertFalse(condition, Messages.getString(messageNumber, p1)); + } + + public static void assertTrue(boolean condition, String messageNumber) { + assertFalse(!condition, messageNumber); + } + + public static void assertTrue(boolean condition, String messageNumber, String p1) { + assertFalse(!condition, messageNumber, p1); + } + + private static void internalAssertFalse(boolean condition, String message) { + if (condition) { + throw new InvalidSqlException(message); + } + } +} From 6141b784a851d56c6ca504c155840ad65c11ed9f Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Sun, 19 Nov 2023 09:34:49 -0500 Subject: [PATCH 05/13] Add Kotlin validation utility --- .../util/kotlin/GroupingCriteriaCollector.kt | 5 +-- .../dynamic/sql/util/kotlin/KValidator.kt | 32 +++++++++++++++++++ .../util/kotlin/KotlinBatchInsertBuilder.kt | 21 ++++++------ .../sql/util/kotlin/KotlinInsertBuilder.kt | 21 ++++++------ .../kotlin/KotlinMultiRowInsertBuilder.kt | 21 ++++++------ .../util/kotlin/KotlinMultiSelectBuilder.kt | 4 +-- .../sql/util/kotlin/KotlinSubQueryBuilders.kt | 4 +-- 7 files changed, 62 insertions(+), 46 deletions(-) create mode 100644 src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KValidator.kt diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/GroupingCriteriaCollector.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/GroupingCriteriaCollector.kt index 5f9be1816..fbcdeac2e 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/GroupingCriteriaCollector.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/GroupingCriteriaCollector.kt @@ -25,7 +25,6 @@ import org.mybatis.dynamic.sql.NotCriterion import org.mybatis.dynamic.sql.SqlBuilder import org.mybatis.dynamic.sql.SqlCriterion import org.mybatis.dynamic.sql.VisitableCondition -import org.mybatis.dynamic.sql.util.Messages typealias GroupingCriteriaReceiver = GroupingCriteriaCollector.() -> Unit @@ -131,9 +130,7 @@ sealed class SubCriteriaCollector { class GroupingCriteriaCollector : SubCriteriaCollector() { internal var initialCriterion: SqlCriterion? = null private set(value) { - if (field != null) { - throw KInvalidSQLException(Messages.getString("ERROR.21")) //$NON-NLS-1$ - } + assertNull(field, "ERROR.21") //$NON-NLS-1$ field = value } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KValidator.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KValidator.kt new file mode 100644 index 000000000..e4e69a089 --- /dev/null +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KValidator.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2016-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.mybatis.dynamic.sql.util.kotlin + +import org.mybatis.dynamic.sql.util.Messages + +fun assertNotNull(o: Any?, messageNumber: String) { + assertTrue(o != null, messageNumber) +} + +fun assertNull(o: Any?, messageNumber: String) { + assertTrue(o == null, messageNumber) +} + +fun assertTrue(condition: Boolean, messageNumber: String) { + if (!condition) { + throw KInvalidSQLException(Messages.getString(messageNumber)) + } +} diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinBatchInsertBuilder.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinBatchInsertBuilder.kt index a5c641002..a93fc7389 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinBatchInsertBuilder.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinBatchInsertBuilder.kt @@ -21,7 +21,6 @@ import org.mybatis.dynamic.sql.insert.BatchInsertDSL import org.mybatis.dynamic.sql.insert.BatchInsertModel import org.mybatis.dynamic.sql.util.AbstractColumnMapping import org.mybatis.dynamic.sql.util.Buildable -import org.mybatis.dynamic.sql.util.Messages typealias KotlinBatchInsertCompleter = KotlinBatchInsertBuilder.() -> Unit @@ -38,15 +37,13 @@ class KotlinBatchInsertBuilder (private val rows: Collection): Build columnMappings.add(it) } - override fun build(): BatchInsertModel = - if (table == null) { - throw KInvalidSQLException(Messages.getString("ERROR.23")) //$NON-NLS-1$ - } else { - with(BatchInsertDSL.Builder()) { - withRecords(rows) - withTable(table) - withColumnMappings(columnMappings) - build() - }.build() - } + override fun build(): BatchInsertModel { + assertNotNull(table, "ERROR.23") //$NON-NLS-1$ + return with(BatchInsertDSL.Builder()) { + withRecords(rows) + withTable(table) + withColumnMappings(columnMappings) + build() + }.build() + } } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinInsertBuilder.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinInsertBuilder.kt index 491fc2d9e..b1bef0d74 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinInsertBuilder.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinInsertBuilder.kt @@ -21,7 +21,6 @@ import org.mybatis.dynamic.sql.insert.InsertDSL import org.mybatis.dynamic.sql.insert.InsertModel import org.mybatis.dynamic.sql.util.AbstractColumnMapping import org.mybatis.dynamic.sql.util.Buildable -import org.mybatis.dynamic.sql.util.Messages typealias KotlinInsertCompleter = KotlinInsertBuilder.() -> Unit @@ -38,15 +37,13 @@ class KotlinInsertBuilder (private val row: T): Buildable = - if (table == null) { - throw KInvalidSQLException(Messages.getString("ERROR.25")) //$NON-NLS-1$ - } else { - with(InsertDSL.Builder()) { - withRow(row) - withTable(table) - withColumnMappings(columnMappings) - build() - }.build() - } + override fun build(): InsertModel { + assertNotNull(table, "ERROR.25") //$NON-NLS-1$ + return with(InsertDSL.Builder()) { + withRow(row) + withTable(table) + withColumnMappings(columnMappings) + build() + }.build() + } } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinMultiRowInsertBuilder.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinMultiRowInsertBuilder.kt index 2baa3ec3c..e15d4c7d7 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinMultiRowInsertBuilder.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinMultiRowInsertBuilder.kt @@ -21,7 +21,6 @@ import org.mybatis.dynamic.sql.insert.MultiRowInsertDSL import org.mybatis.dynamic.sql.insert.MultiRowInsertModel import org.mybatis.dynamic.sql.util.AbstractColumnMapping import org.mybatis.dynamic.sql.util.Buildable -import org.mybatis.dynamic.sql.util.Messages typealias KotlinMultiRowInsertCompleter = KotlinMultiRowInsertBuilder.() -> Unit @@ -38,15 +37,13 @@ class KotlinMultiRowInsertBuilder (private val rows: Collection): Bu columnMappings.add(it) } - override fun build(): MultiRowInsertModel = - if (table == null) { - throw KInvalidSQLException(Messages.getString("ERROR.26")) //$NON-NLS-1$ - } else { - with(MultiRowInsertDSL.Builder()) { - withRecords(rows) - withTable(table) - withColumnMappings(columnMappings) - build() - }.build() - } + override fun build(): MultiRowInsertModel { + assertNotNull(table, "ERROR.26") //$NON-NLS-1$ + return with(MultiRowInsertDSL.Builder()) { + withRecords(rows) + withTable(table) + withColumnMappings(columnMappings) + build() + }.build() + } } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinMultiSelectBuilder.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinMultiSelectBuilder.kt index f747c8cb6..bb57a04a5 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinMultiSelectBuilder.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinMultiSelectBuilder.kt @@ -29,9 +29,7 @@ typealias MultiSelectCompleter = KotlinMultiSelectBuilder.() -> Unit class KotlinMultiSelectBuilder: Buildable { private var dsl: MultiSelectDSL? = null private set(value) { - if (field != null) { - throw KInvalidSQLException(Messages.getString("ERROR.33")) //$NON-NLS-1$ - } + assertNull(field, "ERROR.33") //$NON-NLS-1$ field = value } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinSubQueryBuilders.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinSubQueryBuilders.kt index 8eece57e1..ef05ddc68 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinSubQueryBuilders.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinSubQueryBuilders.kt @@ -77,9 +77,7 @@ class KotlinInsertSelectSubQueryBuilder : KotlinBaseSubQueryBuilder(), Buildable } override fun build(): InsertSelectModel { - if (table == null) { - throw KInvalidSQLException(Messages.getString("ERROR.29")) //$NON-NLS-1$ - } + assertNotNull(table, "ERROR.29") //$NON-NLS-1$ return if (columnList == null) { SqlBuilder.insertInto(table) From b088bf818fdc261633ffac50ad17e16b6fb9523d Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Sun, 19 Nov 2023 09:59:54 -0500 Subject: [PATCH 06/13] Add Kotlin validation utility --- .../org/mybatis/dynamic/sql/util/kotlin/JoinCollector.kt | 4 +--- .../org/mybatis/dynamic/sql/util/kotlin/KValidator.kt | 7 +++++++ .../mybatis/dynamic/sql/util/kotlin/KotlinCountBuilder.kt | 4 +--- .../dynamic/sql/util/kotlin/KotlinMultiSelectBuilder.kt | 5 +---- .../mybatis/dynamic/sql/util/kotlin/KotlinSelectBuilder.kt | 5 +---- .../dynamic/sql/util/kotlin/KotlinSubQueryBuilders.kt | 4 +--- 6 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/JoinCollector.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/JoinCollector.kt index 24473360f..ce18db039 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/JoinCollector.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/JoinCollector.kt @@ -19,7 +19,6 @@ import org.mybatis.dynamic.sql.BindableColumn import org.mybatis.dynamic.sql.SqlBuilder import org.mybatis.dynamic.sql.select.join.JoinCondition import org.mybatis.dynamic.sql.select.join.JoinCriterion -import org.mybatis.dynamic.sql.util.Messages typealias JoinReceiver = JoinCollector.() -> Unit @@ -28,8 +27,7 @@ class JoinCollector { private var onJoinCriterion: JoinCriterion<*>? = null internal val andJoinCriteria = mutableListOf>() - internal fun onJoinCriterion() : JoinCriterion<*> = - onJoinCriterion?: throw KInvalidSQLException(Messages.getString("ERROR.22")) //$NON-NLS-1$ + internal fun onJoinCriterion() : JoinCriterion<*> = invalidIfNull(onJoinCriterion, "ERROR.22") //$NON-NLS-1$ fun on(leftColumn: BindableColumn): RightColumnCollector = RightColumnCollector { onJoinCriterion = JoinCriterion.Builder() diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KValidator.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KValidator.kt index e4e69a089..e6d2a6bd0 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KValidator.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KValidator.kt @@ -17,6 +17,13 @@ package org.mybatis.dynamic.sql.util.kotlin import org.mybatis.dynamic.sql.util.Messages +fun invalidIfNull(o: T?, messageNumber: String): T { + if (o == null) { + throw KInvalidSQLException(Messages.getString(messageNumber)) + } + return o +} + fun assertNotNull(o: Any?, messageNumber: String) { assertTrue(o != null, messageNumber) } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinCountBuilder.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinCountBuilder.kt index 2692f265d..ef88cdbfd 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinCountBuilder.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinCountBuilder.kt @@ -19,7 +19,6 @@ import org.mybatis.dynamic.sql.SqlTable import org.mybatis.dynamic.sql.select.CountDSL import org.mybatis.dynamic.sql.select.SelectModel import org.mybatis.dynamic.sql.util.Buildable -import org.mybatis.dynamic.sql.util.Messages typealias CountCompleter = KotlinCountBuilder.() -> Unit @@ -36,6 +35,5 @@ class KotlinCountBuilder(private val fromGatherer: CountDSL.FromGatherer = - dsl?: throw KInvalidSQLException(Messages.getString("ERROR.24")) //$NON-NLS-1$ + override fun getDsl(): CountDSL = invalidIfNull(dsl, "ERROR.24") //$NON-NLS-1$ } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinMultiSelectBuilder.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinMultiSelectBuilder.kt index bb57a04a5..4c6d4e984 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinMultiSelectBuilder.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinMultiSelectBuilder.kt @@ -21,7 +21,6 @@ import org.mybatis.dynamic.sql.SqlBuilder import org.mybatis.dynamic.sql.select.MultiSelectDSL import org.mybatis.dynamic.sql.select.MultiSelectModel import org.mybatis.dynamic.sql.util.Buildable -import org.mybatis.dynamic.sql.util.Messages typealias MultiSelectCompleter = KotlinMultiSelectBuilder.() -> Unit @@ -78,7 +77,5 @@ class KotlinMultiSelectBuilder: Buildable { override fun build(): MultiSelectModel = getDsl().build() - private fun getDsl(): MultiSelectDSL { - return dsl?: throw KInvalidSQLException(Messages.getString("ERROR.34")) //$NON-NLS-1$ - } + private fun getDsl(): MultiSelectDSL = invalidIfNull(dsl, "ERROR.34") //$NON-NLS-1$ } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinSelectBuilder.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinSelectBuilder.kt index 0456930fd..ead5e8396 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinSelectBuilder.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinSelectBuilder.kt @@ -23,7 +23,6 @@ import org.mybatis.dynamic.sql.select.QueryExpressionDSL import org.mybatis.dynamic.sql.select.SelectModel import org.mybatis.dynamic.sql.select.SubQuery import org.mybatis.dynamic.sql.util.Buildable -import org.mybatis.dynamic.sql.util.Messages typealias SelectCompleter = KotlinSelectBuilder.() -> Unit @@ -79,9 +78,7 @@ class KotlinSelectBuilder(private val fromGatherer: QueryExpressionDSL.FromGathe override fun build(): SelectModel = getDsl().build() - override fun getDsl(): KQueryExpressionDSL { - return dsl?: throw KInvalidSQLException(Messages.getString("ERROR.27")) //$NON-NLS-1$ - } + override fun getDsl(): KQueryExpressionDSL = invalidIfNull(dsl, "ERROR.27") //$NON-NLS-1$ } /** diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinSubQueryBuilders.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinSubQueryBuilders.kt index ef05ddc68..367f4821d 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinSubQueryBuilders.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinSubQueryBuilders.kt @@ -22,7 +22,6 @@ import org.mybatis.dynamic.sql.SqlTable import org.mybatis.dynamic.sql.insert.InsertSelectModel import org.mybatis.dynamic.sql.select.SelectModel import org.mybatis.dynamic.sql.util.Buildable -import org.mybatis.dynamic.sql.util.Messages @MyBatisDslMarker sealed class KotlinBaseSubQueryBuilder { @@ -42,8 +41,7 @@ sealed class KotlinBaseSubQueryBuilder { selectBuilder = KotlinSelectBuilder(SqlBuilder.selectDistinct(selectList)).apply(completer) } - internal fun buildSelectModel(): SelectModel = - (selectBuilder?: throw KInvalidSQLException(Messages.getString("ERROR.28"))).build() //$NON-NLS-1$ + internal fun buildSelectModel(): SelectModel = invalidIfNull(selectBuilder, "ERROR.28").build() //$NON-NLS-1$ } class KotlinSubQueryBuilder : KotlinBaseSubQueryBuilder(), Buildable { From 2a608654720e528dc3785fbd1ba2e039d78e73b0 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Sun, 19 Nov 2023 10:09:24 -0500 Subject: [PATCH 07/13] Don't return nulls from methods --- .../mybatis/dynamic/sql/select/SelectDSL.java | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java index 817a63e16..ef74fcc75 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java @@ -130,11 +130,10 @@ public SelectDSL configureStatement(Consumer consumer @NotNull @Override public R build() { - SelectModel selectModel = SelectModel.withQueryExpressions(buildModels()) - .withOrderByModel(orderByModel) - .withPagingModel(buildPagingModel()) - .build(); - return adapterFunction.apply(selectModel); + SelectModel.Builder builder = SelectModel.withQueryExpressions(buildModels()) + .withOrderByModel(orderByModel); + addPagingModel(builder); + return adapterFunction.apply(builder.build()); } private List buildModels() { @@ -143,16 +142,15 @@ private List buildModels() { .collect(Collectors.toList()); } - private PagingModel buildPagingModel() { - if (limit == null && offset == null && fetchFirstRows == null) { - return null; + private void addPagingModel(SelectModel.Builder builder) { + if (limit != null || offset != null || fetchFirstRows != null) { + // add paging model if any values set + builder.withPagingModel(new PagingModel.Builder() + .withLimit(limit) + .withOffset(offset) + .withFetchFirstRows(fetchFirstRows) + .build()); } - - return new PagingModel.Builder() - .withLimit(limit) - .withOffset(offset) - .withFetchFirstRows(fetchFirstRows) - .build(); } public class LimitFinisher implements Buildable { From 565b1143bb5a22eb53518d549a668eee3d6bbb81 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 20 Nov 2023 06:03:04 -0500 Subject: [PATCH 08/13] Sometimes small objects can replace if statements --- .../dynamic/sql/select/aggregate/Sum.java | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java b/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java index aa3404221..2772aac6d 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java @@ -15,6 +15,8 @@ */ package org.mybatis.dynamic.sql.select.aggregate; +import java.util.function.Function; + import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.VisitableCondition; import org.mybatis.dynamic.sql.render.RenderingContext; @@ -24,48 +26,44 @@ import org.mybatis.dynamic.sql.where.render.DefaultConditionVisitor; public class Sum extends AbstractUniTypeFunction> { - private final VisitableCondition condition; + private final Function renderer; private Sum(BindableColumn column) { - this(column, null); + super(column); + renderer = rc -> column.render(rc).mapFragment(Sum::applyAggregate); } private Sum(BindableColumn column, VisitableCondition condition) { super(column); - this.condition = condition; - } + renderer = rc -> { + Validator.assertTrue(condition.shouldRender(), "ERROR.37", "sum"); //$NON-NLS-1$ //$NON-NLS-2$ - @Override - public FragmentAndParameters render(RenderingContext renderingContext) { - if (condition == null) { - return renderWithoutCondition(renderingContext); - } else { - return renderWithCondition(renderingContext); - } - } + DefaultConditionVisitor visitor = new DefaultConditionVisitor.Builder() + .withColumn(column) + .withRenderingContext(rc) + .build(); - private FragmentAndParameters renderWithoutCondition(RenderingContext renderingContext) { - return column.render(renderingContext).mapFragment(this::applyAggregate); + return condition.accept(visitor).mapFragment(Sum::applyAggregate); + }; } - private FragmentAndParameters renderWithCondition(RenderingContext renderingContext) { - Validator.assertTrue(condition.shouldRender(), "ERROR.37", "sum"); //$NON-NLS-1$ //$NON-NLS-2$ - - DefaultConditionVisitor visitor = new DefaultConditionVisitor.Builder() - .withColumn(column) - .withRenderingContext(renderingContext) - .build(); + private Sum(BindableColumn column, Function renderer) { + super(column); + this.renderer = renderer; + } - return condition.accept(visitor).mapFragment(this::applyAggregate); + @Override + public FragmentAndParameters render(RenderingContext renderingContext) { + return renderer.apply(renderingContext); } - private String applyAggregate(String s) { + private static String applyAggregate(String s) { return "sum(" + s + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } @Override protected Sum copy() { - return new Sum<>(column, condition); + return new Sum<>(column, renderer); } public static Sum of(BindableColumn column) { From d2873b6e2e1d7f29e61ca2be93fc1513e8255f28 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 20 Nov 2023 06:10:23 -0500 Subject: [PATCH 09/13] Polishing --- .../java/org/mybatis/dynamic/sql/select/aggregate/Sum.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java b/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java index 2772aac6d..935701272 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java @@ -30,7 +30,7 @@ public class Sum extends AbstractUniTypeFunction> { private Sum(BindableColumn column) { super(column); - renderer = rc -> column.render(rc).mapFragment(Sum::applyAggregate); + renderer = rc -> column.render(rc).mapFragment(this::applyAggregate); } private Sum(BindableColumn column, VisitableCondition condition) { @@ -43,7 +43,7 @@ private Sum(BindableColumn column, VisitableCondition condition) { .withRenderingContext(rc) .build(); - return condition.accept(visitor).mapFragment(Sum::applyAggregate); + return condition.accept(visitor).mapFragment(this::applyAggregate); }; } @@ -57,7 +57,7 @@ public FragmentAndParameters render(RenderingContext renderingContext) { return renderer.apply(renderingContext); } - private static String applyAggregate(String s) { + private String applyAggregate(String s) { return "sum(" + s + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } From f863db48e83a060bf2c070778e035007859e3eb3 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Mon, 4 Dec 2023 14:18:43 -0500 Subject: [PATCH 10/13] Grammar --- src/main/java/org/mybatis/dynamic/sql/SqlColumn.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java b/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java index be63bb032..0561f4354 100644 --- a/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java +++ b/src/main/java/org/mybatis/dynamic/sql/SqlColumn.java @@ -110,7 +110,7 @@ public SqlColumn qualifiedWith(String tableQualifier) { } /** - * Set an alias with a camel cased string based on the column name. The can be useful for queries using + * Set an alias with a camel cased string based on the column name. This can be useful for queries using * the {@link org.mybatis.dynamic.sql.util.mybatis3.CommonSelectMapper} where the columns are placed into * a map based on the column name returned from the database. * From 13157a5f78b4d79686c53f55f88edecc1d5a3ab1 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 5 Dec 2023 10:04:49 -0500 Subject: [PATCH 11/13] Use consistent build pattern --- .../mybatis/dynamic/sql/delete/DeleteDSL.java | 11 +++++----- .../mybatis/dynamic/sql/select/CountDSL.java | 22 ++++++++----------- .../sql/select/QueryExpressionDSL.java | 21 +++++------------- .../mybatis/dynamic/sql/update/UpdateDSL.java | 12 +++++----- 4 files changed, 25 insertions(+), 41 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java b/src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java index d40f25f2e..33690104f 100644 --- a/src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java @@ -78,15 +78,14 @@ public DeleteDSL orderBy(Collection columns) { @NotNull @Override public R build() { - DeleteModel.Builder deleteModelBuilder = DeleteModel.withTable(table) + DeleteModel deleteModel = DeleteModel.withTable(table) .withTableAlias(tableAlias) .withLimit(limit) - .withOrderByModel(orderByModel); - if (whereBuilder != null) { - deleteModelBuilder.withWhereModel(whereBuilder.buildWhereModel()); - } + .withOrderByModel(orderByModel) + .withWhereModel(whereBuilder == null ? null : whereBuilder.buildWhereModel()) + .build(); - return adapterFunction.apply(deleteModelBuilder.build()); + return adapterFunction.apply(deleteModel); } @Override diff --git a/src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java index 8a5d79f53..5721e590a 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java @@ -25,6 +25,7 @@ import org.mybatis.dynamic.sql.SqlTable; import org.mybatis.dynamic.sql.configuration.StatementConfiguration; import org.mybatis.dynamic.sql.util.Buildable; +import org.mybatis.dynamic.sql.util.Utilities; import org.mybatis.dynamic.sql.where.AbstractWhereFinisher; import org.mybatis.dynamic.sql.where.WhereModel; @@ -33,7 +34,7 @@ * clauses, but not the other parts of a select (group by, order by, etc.) Count queries always return * a long. If these restrictions are not acceptable, then use the Select DSL for an unrestricted select statement. * - * @param the type of model built by this Builder. Typically SelectModel. + * @param the type of model built by this Builder. Typically, SelectModel. * * @author Jeff Butler */ @@ -53,9 +54,7 @@ private CountDSL(BasicColumn countColumn, SqlTable table, Function configureStatement(Consumer consumer) } private SelectModel buildModel() { - QueryExpressionModel.Builder b = new QueryExpressionModel.Builder() + QueryExpressionModel queryExpressionModel = new QueryExpressionModel.Builder() .withSelectColumn(countColumn) .withTable(table()) - .withTableAliases(tableAliases()); - - if (whereBuilder != null) { - b.withWhereModel(whereBuilder.buildWhereModel()); - } - - buildJoinModel().ifPresent(b::withJoinModel); + .withTableAliases(tableAliases()) + .withJoinModel(buildJoinModel().orElse(null)) + .withWhereModel(whereBuilder == null ? null : whereBuilder.buildWhereModel()) + .build(); return new SelectModel.Builder() - .withQueryExpression(b.build()) + .withQueryExpression(queryExpressionModel) .build(); } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java index 7a1c5ecae..64b2128de 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java @@ -85,9 +85,7 @@ public QueryExpressionDSL configureStatement(Consumer * @return The having builder */ protected QueryExpressionHavingBuilder having() { - if (havingBuilder == null) { - havingBuilder = new QueryExpressionHavingBuilder(); - } + havingBuilder = Utilities.buildIfNecessary(havingBuilder, QueryExpressionHavingBuilder::new); return havingBuilder; } @@ -185,23 +183,16 @@ public UnionBuilder unionAll() { } protected QueryExpressionModel buildModel() { - QueryExpressionModel.Builder builder = QueryExpressionModel.withSelectList(selectList) + return QueryExpressionModel.withSelectList(selectList) .withConnector(connector) .withTable(table()) .isDistinct(isDistinct) .withTableAliases(tableAliases()) .withJoinModel(buildJoinModel().orElse(null)) - .withGroupByModel(groupByModel); - - if (whereBuilder != null) { - builder.withWhereModel(whereBuilder.buildWhereModel()); - } - - if (havingBuilder != null) { - builder.withHavingModel(havingBuilder.buildHavingModel()); - } - - return builder.build(); + .withGroupByModel(groupByModel) + .withWhereModel(whereBuilder == null ? null : whereBuilder.buildWhereModel()) + .withHavingModel(havingBuilder == null ? null : havingBuilder.buildHavingModel()) + .build(); } public SelectDSL.LimitFinisher limit(long limit) { diff --git a/src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java b/src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java index 8fe9ab8b9..1d7da54d7 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java @@ -98,17 +98,15 @@ public UpdateDSL orderBy(Collection columns) { @NotNull @Override public R build() { - UpdateModel.Builder updateModelBuilder = UpdateModel.withTable(table) + UpdateModel updateModel = UpdateModel.withTable(table) .withTableAlias(tableAlias) .withColumnMappings(columnMappings) .withLimit(limit) - .withOrderByModel(orderByModel); + .withOrderByModel(orderByModel) + .withWhereModel(whereBuilder == null ? null : whereBuilder.buildWhereModel()) + .build(); - if (whereBuilder != null) { - updateModelBuilder.withWhereModel(whereBuilder.buildWhereModel()); - } - - return adapterFunction.apply(updateModelBuilder.build()); + return adapterFunction.apply(updateModel); } @Override From 2674ee47cadb8ddb12b2d07ec16c19a12adb04ad Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 5 Dec 2023 11:08:21 -0500 Subject: [PATCH 12/13] Use consistent build pattern --- .../dynamic/sql/select/MultiSelectDSL.java | 25 ++++++++----------- .../dynamic/sql/select/PagingModel.java | 8 ++++-- .../mybatis/dynamic/sql/select/SelectDSL.java | 25 +++++++++---------- .../mybatis/dynamic/sql/InvalidSQLTest.java | 11 ++++---- 4 files changed, 34 insertions(+), 35 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectDSL.java index f21cb99fa..758629453 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectDSL.java @@ -19,6 +19,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Optional; import org.jetbrains.annotations.NotNull; import org.mybatis.dynamic.sql.SortSpecification; @@ -74,24 +75,20 @@ public FetchFirstFinisher fetchFirst(long fetchFirstRows) { @NotNull @Override public MultiSelectModel build() { - MultiSelectModel.Builder builder = new MultiSelectModel.Builder() + return new MultiSelectModel.Builder() .withInitialSelect(initialSelect) .withUnionQueries(unionQueries) - .withOrderByModel(orderByModel); - - addPagingModel(builder); - return builder.build(); + .withOrderByModel(orderByModel) + .withPagingModel(buildPagingModel().orElse(null)) + .build(); } - private void addPagingModel(MultiSelectModel.Builder builder) { - if (limit != null || offset != null || fetchFirstRows != null) { - // add paging model if any values set - builder.withPagingModel(new PagingModel.Builder() - .withLimit(limit) - .withOffset(offset) - .withFetchFirstRows(fetchFirstRows) - .build()); - } + private Optional buildPagingModel() { + return new PagingModel.Builder() + .withLimit(limit) + .withOffset(offset) + .withFetchFirstRows(fetchFirstRows) + .build(); } public class LimitFinisher implements Buildable { diff --git a/src/main/java/org/mybatis/dynamic/sql/select/PagingModel.java b/src/main/java/org/mybatis/dynamic/sql/select/PagingModel.java index 0d2acd44c..9ae2560ee 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/PagingModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/PagingModel.java @@ -62,8 +62,12 @@ public Builder withFetchFirstRows(Long fetchFirstRows) { return this; } - public PagingModel build() { - return new PagingModel(this); + public Optional build() { + if (limit == null && offset == null && fetchFirstRows == null) { + return Optional.empty(); + } + + return Optional.of(new PagingModel(this)); } } } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java index ef74fcc75..41c4eb6ce 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; @@ -130,10 +131,11 @@ public SelectDSL configureStatement(Consumer consumer @NotNull @Override public R build() { - SelectModel.Builder builder = SelectModel.withQueryExpressions(buildModels()) - .withOrderByModel(orderByModel); - addPagingModel(builder); - return adapterFunction.apply(builder.build()); + SelectModel selectModel = SelectModel.withQueryExpressions(buildModels()) + .withOrderByModel(orderByModel) + .withPagingModel(buildPagingModel().orElse(null)) + .build(); + return adapterFunction.apply(selectModel); } private List buildModels() { @@ -142,15 +144,12 @@ private List buildModels() { .collect(Collectors.toList()); } - private void addPagingModel(SelectModel.Builder builder) { - if (limit != null || offset != null || fetchFirstRows != null) { - // add paging model if any values set - builder.withPagingModel(new PagingModel.Builder() - .withLimit(limit) - .withOffset(offset) - .withFetchFirstRows(fetchFirstRows) - .build()); - } + private Optional buildPagingModel() { + return new PagingModel.Builder() + .withLimit(limit) + .withOffset(offset) + .withFetchFirstRows(fetchFirstRows) + .build(); } public class LimitFinisher implements Buildable { diff --git a/src/test/java/org/mybatis/dynamic/sql/InvalidSQLTest.java b/src/test/java/org/mybatis/dynamic/sql/InvalidSQLTest.java index 92aa57003..01a784760 100644 --- a/src/test/java/org/mybatis/dynamic/sql/InvalidSQLTest.java +++ b/src/test/java/org/mybatis/dynamic/sql/InvalidSQLTest.java @@ -47,7 +47,7 @@ import org.mybatis.dynamic.sql.select.join.JoinModel; import org.mybatis.dynamic.sql.select.join.JoinSpecification; import org.mybatis.dynamic.sql.select.join.JoinType; -import org.mybatis.dynamic.sql.select.render.PagingModelRenderer; +import org.mybatis.dynamic.sql.select.render.FetchFirstPagingModelRenderer; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; import org.mybatis.dynamic.sql.update.UpdateModel; import org.mybatis.dynamic.sql.util.InternalError; @@ -238,16 +238,15 @@ void testMissingMessage() { @Test void testInvalidPagingModel() { - PagingModel pagingModel = new PagingModel.Builder().build(); + Optional pagingModel = new PagingModel.Builder().withLimit(22L).build(); RenderingContext renderingContext = RenderingContext .withRenderingStrategy(RenderingStrategies.MYBATIS3) .build(); - PagingModelRenderer renderer = new PagingModelRenderer.Builder() - .withPagingModel(pagingModel) - .withRenderingContext(renderingContext) - .build(); + assertThat(pagingModel).isPresent(); + + FetchFirstPagingModelRenderer renderer = new FetchFirstPagingModelRenderer(renderingContext, pagingModel.get()); assertThatExceptionOfType(InvalidSqlException.class) .isThrownBy(renderer::render) From 442da70fa745909f50bb49fcff6cdfcbe1662e90 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 5 Dec 2023 15:33:36 -0500 Subject: [PATCH 13/13] Checkstyle --- .../java/org/mybatis/dynamic/sql/select/MultiSelectModel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectModel.java b/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectModel.java index 93def05fd..e7132a0e4 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectModel.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectModel.java @@ -40,7 +40,7 @@ private MultiSelectModel(Builder builder) { unionQueries = builder.unionQueries; orderByModel = builder.orderByModel; pagingModel = builder.pagingModel; - Validator.assertNotEmpty(unionQueries, "ERROR.35"); //$NON-NLS-1$); + Validator.assertNotEmpty(unionQueries, "ERROR.35"); //$NON-NLS-1$ } public SelectModel initialSelect() {