Skip to content

Commit 5a68a75

Browse files
committed
Kotlin DSL statement configuration should not call where()
This could cause an exception if no where clause is specified
1 parent e31f68f commit 5a68a75

File tree

9 files changed

+76
-9
lines changed

9 files changed

+76
-9
lines changed

src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.mybatis.dynamic.sql.delete;
1717

1818
import java.util.Objects;
19+
import java.util.function.Consumer;
1920
import java.util.function.Function;
2021

2122
import org.jetbrains.annotations.NotNull;
@@ -26,7 +27,8 @@
2627
import org.mybatis.dynamic.sql.where.AbstractWhereSupport;
2728
import org.mybatis.dynamic.sql.where.WhereModel;
2829

29-
public class DeleteDSL<R> extends AbstractWhereSupport<DeleteDSL<R>.DeleteWhereBuilder> implements Buildable<R> {
30+
public class DeleteDSL<R> extends AbstractWhereSupport<DeleteDSL<R>.DeleteWhereBuilder, DeleteDSL<R>>
31+
implements Buildable<R> {
3032

3133
private final Function<DeleteModel, R> adapterFunction;
3234
private final SqlTable table;
@@ -66,6 +68,12 @@ public R build() {
6668
return adapterFunction.apply(deleteModelBuilder.build());
6769
}
6870

71+
@Override
72+
public DeleteDSL<R> configureStatement(Consumer<StatementConfiguration> consumer) {
73+
consumer.accept(statementConfiguration);
74+
return this;
75+
}
76+
6977
public static <R> DeleteDSL<R> deleteFrom(Function<DeleteModel, R> adapterFunction, SqlTable table,
7078
String tableAlias) {
7179
return new DeleteDSL<>(table, tableAlias, adapterFunction);

src/main/java/org/mybatis/dynamic/sql/select/AbstractQueryExpressionDSL.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
public abstract class AbstractQueryExpressionDSL<W extends AbstractWhereDSL<?>,
4040
T extends AbstractQueryExpressionDSL<W, T>>
41-
extends AbstractWhereSupport<W> {
41+
extends AbstractWhereSupport<W, T> {
4242

4343
private final List<JoinSpecification.Builder> joinSpecificationBuilders = new ArrayList<>();
4444
private final Map<SqlTable, String> tableAliases = new HashMap<>();

src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.mybatis.dynamic.sql.select;
1717

1818
import java.util.Objects;
19+
import java.util.function.Consumer;
1920
import java.util.function.Function;
2021

2122
import org.jetbrains.annotations.NotNull;
@@ -64,6 +65,12 @@ public R build() {
6465
return adapterFunction.apply(buildModel());
6566
}
6667

68+
@Override
69+
public CountDSL<R> configureStatement(Consumer<StatementConfiguration> consumer) {
70+
consumer.accept(statementConfiguration);
71+
return this;
72+
}
73+
6774
private SelectModel buildModel() {
6875
QueryExpressionModel.Builder b = new QueryExpressionModel.Builder()
6976
.withSelectColumn(countColumn)

src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,13 @@
3333
import org.mybatis.dynamic.sql.select.join.JoinSpecification;
3434
import org.mybatis.dynamic.sql.select.join.JoinType;
3535
import org.mybatis.dynamic.sql.util.Buildable;
36-
import org.mybatis.dynamic.sql.util.ConfigurableStatement;
3736
import org.mybatis.dynamic.sql.where.AbstractWhereDSL;
3837
import org.mybatis.dynamic.sql.where.AbstractWhereSupport;
3938
import org.mybatis.dynamic.sql.where.WhereModel;
4039

4140
public class QueryExpressionDSL<R>
4241
extends AbstractQueryExpressionDSL<QueryExpressionDSL<R>.QueryExpressionWhereBuilder, QueryExpressionDSL<R>>
43-
implements Buildable<R>, ConfigurableStatement<QueryExpressionDSL<R>> {
42+
implements Buildable<R> {
4443

4544
private final String connector;
4645
private final SelectDSL<R> selectDSL;
@@ -332,7 +331,8 @@ public JoinSpecificationFinisher on(BasicColumn joinColumn, JoinCondition onJoin
332331
}
333332
}
334333

335-
public class JoinSpecificationFinisher extends AbstractWhereSupport<QueryExpressionWhereBuilder>
334+
public class JoinSpecificationFinisher
335+
extends AbstractWhereSupport<QueryExpressionWhereBuilder, JoinSpecificationFinisher>
336336
implements Buildable<R> {
337337
private final JoinSpecification.Builder joinSpecificationBuilder;
338338

@@ -373,6 +373,12 @@ public R build() {
373373
return QueryExpressionDSL.this.build();
374374
}
375375

376+
@Override
377+
public JoinSpecificationFinisher configureStatement(Consumer<StatementConfiguration> consumer) {
378+
consumer.accept(statementConfiguration);
379+
return this;
380+
}
381+
376382
@Override
377383
public QueryExpressionWhereBuilder where() {
378384
return QueryExpressionDSL.this.where();

src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.ArrayList;
1919
import java.util.List;
2020
import java.util.Objects;
21+
import java.util.function.Consumer;
2122
import java.util.function.Function;
2223
import java.util.function.Supplier;
2324

@@ -41,7 +42,8 @@
4142
import org.mybatis.dynamic.sql.where.AbstractWhereSupport;
4243
import org.mybatis.dynamic.sql.where.WhereModel;
4344

44-
public class UpdateDSL<R> extends AbstractWhereSupport<UpdateDSL<R>.UpdateWhereBuilder> implements Buildable<R> {
45+
public class UpdateDSL<R> extends AbstractWhereSupport<UpdateDSL<R>.UpdateWhereBuilder, UpdateDSL<R>>
46+
implements Buildable<R> {
4547

4648
private final Function<UpdateModel, R> adapterFunction;
4749
private final List<AbstractColumnMapping> columnMappings = new ArrayList<>();
@@ -89,6 +91,12 @@ public R build() {
8991
return adapterFunction.apply(updateModelBuilder.build());
9092
}
9193

94+
@Override
95+
public UpdateDSL<R> configureStatement(Consumer<StatementConfiguration> consumer) {
96+
consumer.accept(statementConfiguration);
97+
return this;
98+
}
99+
92100
public static <R> UpdateDSL<R> update(Function<UpdateModel, R> adapterFunction, SqlTable table, String tableAlias) {
93101
return new UpdateDSL<>(table, tableAlias, adapterFunction);
94102
}

src/main/java/org/mybatis/dynamic/sql/where/AbstractWhereSupport.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.mybatis.dynamic.sql.ExistsPredicate;
2525
import org.mybatis.dynamic.sql.SqlCriterion;
2626
import org.mybatis.dynamic.sql.VisitableCondition;
27+
import org.mybatis.dynamic.sql.util.ConfigurableStatement;
2728

2829
/**
2930
* Base class for DSLs that support where clauses - which is every DSL except Insert.
@@ -33,7 +34,8 @@
3334
*
3435
* @param <W> the implementation of the Where DSL customized for a particular SQL statement.
3536
*/
36-
public abstract class AbstractWhereSupport<W extends AbstractWhereDSL<?>> {
37+
public abstract class AbstractWhereSupport<W extends AbstractWhereDSL<?>, D extends AbstractWhereSupport<W, D>>
38+
implements ConfigurableStatement<D> {
3739

3840
public abstract W where();
3941

src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinBaseBuilders.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ fun WhereApplier.andThen(after: WhereApplier): WhereApplier = {
3838

3939
@MyBatisDslMarker
4040
@Suppress("TooManyFunctions")
41-
abstract class KotlinBaseBuilder<D : AbstractWhereSupport<*>> {
41+
abstract class KotlinBaseBuilder<D : AbstractWhereSupport<*,*>> {
4242

4343
fun configureStatement(c: StatementConfiguration.() -> Unit) {
44-
getDsl().where().configureStatement(c)
44+
getDsl().configureStatement(c)
4545
}
4646

4747
fun where(criteria: GroupingCriteriaReceiver): Unit =

src/test/java/examples/joins/JoinMapperTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ void testCompoundJoin2() {
163163
SelectStatementProvider selectStatement = select(orderMaster.orderId, orderDate, orderDetail.lineNumber, orderDetail.description, orderDetail.quantity)
164164
.from(orderMaster, "om")
165165
.join(orderDetail, "od").on(orderMaster.orderId, equalTo(orderDetail.orderId))
166+
.configureStatement(c -> c.setNonRenderingWhereClauseAllowed(true))
166167
.and(orderMaster.orderId, equalTo(orderDetail.orderId))
167168
.build()
168169
.render(RenderingStrategies.MYBATIS3);

src/test/kotlin/examples/kotlin/spring/canonical/InfixElementsTest.kt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,14 @@ import org.mybatis.dynamic.sql.util.kotlin.KInvalidSQLException
2828
import org.mybatis.dynamic.sql.util.kotlin.elements.isLike
2929
import org.mybatis.dynamic.sql.util.kotlin.elements.stringConstant
3030
import org.mybatis.dynamic.sql.util.kotlin.elements.upper
31+
import org.mybatis.dynamic.sql.util.kotlin.mybatis3.count
32+
import org.mybatis.dynamic.sql.util.kotlin.spring.countFrom
3133
import org.mybatis.dynamic.sql.util.kotlin.spring.delete
3234
import org.mybatis.dynamic.sql.util.kotlin.spring.deleteFrom
3335
import org.mybatis.dynamic.sql.util.kotlin.spring.select
3436
import org.mybatis.dynamic.sql.util.kotlin.spring.selectList
3537
import org.mybatis.dynamic.sql.util.kotlin.spring.selectOne
38+
import org.mybatis.dynamic.sql.util.kotlin.spring.update
3639
import org.springframework.beans.factory.annotation.Autowired
3740
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
3841
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig
@@ -1229,4 +1232,36 @@ open class InfixElementsTest {
12291232
assertThat(rows).hasSize(2)
12301233
assertThat(rows[0]).isEqualTo("Pebbles")
12311234
}
1235+
1236+
@Test
1237+
fun testUpdate() {
1238+
val updateStatement = update(person) {
1239+
set(id) equalTo 1
1240+
// following should have no impact - where clause not specified
1241+
configureStatement { isNonRenderingWhereClauseAllowed = false }
1242+
}
1243+
1244+
assertThat(updateStatement.updateStatement).isEqualTo("update Person set id = :p1")
1245+
}
1246+
1247+
@Test
1248+
fun testCount() {
1249+
val selectStatement = countFrom(person) {
1250+
// following should have no impact - where clause not specified
1251+
configureStatement { isNonRenderingWhereClauseAllowed = false }
1252+
}
1253+
1254+
assertThat(selectStatement.selectStatement).isEqualTo("select count(*) from Person")
1255+
}
1256+
1257+
@Test
1258+
fun testQueryExpression() {
1259+
val selectStatement = select(id) {
1260+
from(person)
1261+
// following should have no impact - where clause not specified
1262+
configureStatement { isNonRenderingWhereClauseAllowed = false }
1263+
}
1264+
1265+
assertThat(selectStatement.selectStatement).isEqualTo("select id from Person")
1266+
}
12321267
}

0 commit comments

Comments
 (0)