Skip to content

Commit f09e604

Browse files
committed
Add order by on delete statement
1 parent 4d45cf7 commit f09e604

File tree

12 files changed

+177
-62
lines changed

12 files changed

+177
-62
lines changed

src/main/java/org/mybatis/dynamic/sql/select/OrderByModel.java renamed to src/main/java/org/mybatis/dynamic/sql/common/OrderByModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package org.mybatis.dynamic.sql.select;
16+
package org.mybatis.dynamic.sql.common;
1717

1818
import java.util.ArrayList;
1919
import java.util.Collection;
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright 2016-2022 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.mybatis.dynamic.sql.common;
17+
18+
import java.util.stream.Collectors;
19+
20+
import org.mybatis.dynamic.sql.SortSpecification;
21+
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
22+
23+
public class OrderByRenderer {
24+
public FragmentAndParameters render(OrderByModel orderByModel) {
25+
String phrase = orderByModel.mapColumns(this::calculateOrderByPhrase)
26+
.collect(Collectors.joining(", ", "order by ", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
27+
return FragmentAndParameters.withFragment(phrase).build();
28+
}
29+
30+
private String calculateOrderByPhrase(SortSpecification column) {
31+
String phrase = column.orderByName();
32+
if (column.isDescending()) {
33+
phrase = phrase + " DESC"; //$NON-NLS-1$
34+
}
35+
return phrase;
36+
}
37+
}

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,17 @@
1515
*/
1616
package org.mybatis.dynamic.sql.delete;
1717

18+
import java.util.Arrays;
19+
import java.util.Collection;
1820
import java.util.Objects;
1921
import java.util.function.Consumer;
2022
import java.util.function.Function;
2123

2224
import org.jetbrains.annotations.NotNull;
25+
import org.mybatis.dynamic.sql.SortSpecification;
2326
import org.mybatis.dynamic.sql.SqlTable;
2427
import org.mybatis.dynamic.sql.configuration.StatementConfiguration;
28+
import org.mybatis.dynamic.sql.common.OrderByModel;
2529
import org.mybatis.dynamic.sql.util.Buildable;
2630
import org.mybatis.dynamic.sql.where.AbstractWhereDSL;
2731
import org.mybatis.dynamic.sql.where.AbstractWhereSupport;
@@ -36,6 +40,7 @@ public class DeleteDSL<R> extends AbstractWhereSupport<DeleteDSL<R>.DeleteWhereB
3640
private DeleteWhereBuilder whereBuilder;
3741
private final StatementConfiguration statementConfiguration = new StatementConfiguration();
3842
private Long limit;
43+
private OrderByModel orderByModel;
3944

4045
private DeleteDSL(SqlTable table, String tableAlias, Function<DeleteModel, R> adapterFunction) {
4146
this.table = Objects.requireNonNull(table);
@@ -56,6 +61,15 @@ public DeleteDSL<R> limit(long limit) {
5661
return this;
5762
}
5863

64+
public DeleteDSL<R> orderBy(SortSpecification... columns) {
65+
return orderBy(Arrays.asList(columns));
66+
}
67+
68+
public DeleteDSL<R> orderBy(Collection<SortSpecification> columns) {
69+
orderByModel = OrderByModel.of(columns);
70+
return this;
71+
}
72+
5973
/**
6074
* WARNING! Calling this method could result in a delete statement that deletes
6175
* all rows in a table.
@@ -67,7 +81,8 @@ public DeleteDSL<R> limit(long limit) {
6781
public R build() {
6882
DeleteModel.Builder deleteModelBuilder = DeleteModel.withTable(table)
6983
.withTableAlias(tableAlias)
70-
.withLimit(limit);
84+
.withLimit(limit)
85+
.withOrderByModel(orderByModel);
7186
if (whereBuilder != null) {
7287
deleteModelBuilder.withWhereModel(whereBuilder.buildWhereModel());
7388
}
@@ -104,6 +119,15 @@ public DeleteDSL<R> limit(long limit) {
104119
return DeleteDSL.this.limit(limit);
105120
}
106121

122+
public DeleteDSL<R> orderBy(SortSpecification... columns) {
123+
return orderBy(Arrays.asList(columns));
124+
}
125+
126+
public DeleteDSL<R> orderBy(Collection<SortSpecification> columns) {
127+
orderByModel = OrderByModel.of(columns);
128+
return DeleteDSL.this;
129+
}
130+
107131
@NotNull
108132
@Override
109133
public R build() {

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,22 @@
2323
import org.mybatis.dynamic.sql.delete.render.DeleteRenderer;
2424
import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider;
2525
import org.mybatis.dynamic.sql.render.RenderingStrategy;
26+
import org.mybatis.dynamic.sql.common.OrderByModel;
2627
import org.mybatis.dynamic.sql.where.WhereModel;
2728

2829
public class DeleteModel {
2930
private final SqlTable table;
3031
private final String tableAlias;
3132
private final WhereModel whereModel;
3233
private final Long limit;
34+
private final OrderByModel orderByModel;
3335

3436
private DeleteModel(Builder builder) {
3537
table = Objects.requireNonNull(builder.table);
3638
whereModel = builder.whereModel;
3739
tableAlias = builder.tableAlias;
3840
limit = builder.limit;
41+
orderByModel = builder.orderByModel;
3942
}
4043

4144
public SqlTable table() {
@@ -54,6 +57,10 @@ public Optional<Long> limit() {
5457
return Optional.ofNullable(limit);
5558
}
5659

60+
public Optional<OrderByModel> orderByModel() {
61+
return Optional.ofNullable(orderByModel);
62+
}
63+
5764
@NotNull
5865
public DeleteStatementProvider render(RenderingStrategy renderingStrategy) {
5966
return DeleteRenderer.withDeleteModel(this)
@@ -71,6 +78,7 @@ public static class Builder {
7178
private String tableAlias;
7279
private WhereModel whereModel;
7380
private Long limit;
81+
private OrderByModel orderByModel;
7482

7583
public Builder withTable(SqlTable table) {
7684
this.table = table;
@@ -92,6 +100,11 @@ public Builder withLimit(Long limit) {
92100
return this;
93101
}
94102

103+
public Builder withOrderByModel(OrderByModel orderByModel) {
104+
this.orderByModel = orderByModel;
105+
return this;
106+
}
107+
95108
public DeleteModel build() {
96109
return new DeleteModel(this);
97110
}

src/main/java/org/mybatis/dynamic/sql/delete/render/DeleteRenderer.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@
2121
import java.util.stream.Collectors;
2222

2323
import org.mybatis.dynamic.sql.SqlTable;
24+
import org.mybatis.dynamic.sql.common.OrderByRenderer;
2425
import org.mybatis.dynamic.sql.delete.DeleteModel;
2526
import org.mybatis.dynamic.sql.render.ExplicitTableAliasCalculator;
2627
import org.mybatis.dynamic.sql.render.RenderingStrategy;
2728
import org.mybatis.dynamic.sql.render.TableAliasCalculator;
29+
import org.mybatis.dynamic.sql.common.OrderByModel;
2830
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2931
import org.mybatis.dynamic.sql.util.FragmentCollector;
3032
import org.mybatis.dynamic.sql.where.WhereModel;
@@ -49,6 +51,7 @@ public DeleteStatementProvider render() {
4951

5052
fragmentCollector.add(calculateDeleteStatementStart());
5153
calculateWhereClause().ifPresent(fragmentCollector::add);
54+
calculateOrderByClause().ifPresent(fragmentCollector::add);
5255
calculateLimitClause().ifPresent(fragmentCollector::add);
5356

5457
return toDeleteStatementProvider(fragmentCollector);
@@ -98,6 +101,15 @@ private FragmentAndParameters renderLimitClause(Long limit) {
98101
.build();
99102
}
100103

104+
private Optional<FragmentAndParameters> calculateOrderByClause() {
105+
return deleteModel.orderByModel().map(this::renderOrderByClause);
106+
}
107+
108+
private FragmentAndParameters renderOrderByClause(OrderByModel orderByModel) {
109+
OrderByRenderer renderer = new OrderByRenderer();
110+
return renderer.render(orderByModel);
111+
}
112+
101113
public static Builder withDeleteModel(DeleteModel deleteModel) {
102114
return new Builder().withDeleteModel(deleteModel);
103115
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.mybatis.dynamic.sql.SortSpecification;
3030
import org.mybatis.dynamic.sql.SqlTable;
3131
import org.mybatis.dynamic.sql.TableExpression;
32+
import org.mybatis.dynamic.sql.common.OrderByModel;
3233
import org.mybatis.dynamic.sql.configuration.StatementConfiguration;
3334
import org.mybatis.dynamic.sql.select.QueryExpressionDSL.FromGatherer;
3435
import org.mybatis.dynamic.sql.util.Buildable;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.stream.Stream;
2424

2525
import org.jetbrains.annotations.NotNull;
26+
import org.mybatis.dynamic.sql.common.OrderByModel;
2627
import org.mybatis.dynamic.sql.exception.InvalidSqlException;
2728
import org.mybatis.dynamic.sql.render.RenderingStrategy;
2829
import org.mybatis.dynamic.sql.select.render.SelectRenderer;

src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import org.mybatis.dynamic.sql.select.GroupByModel;
3333
import org.mybatis.dynamic.sql.select.QueryExpressionModel;
3434
import org.mybatis.dynamic.sql.select.join.JoinModel;
35-
import org.mybatis.dynamic.sql.util.CustomCollectors;
3635
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
3736
import org.mybatis.dynamic.sql.util.FragmentCollector;
3837
import org.mybatis.dynamic.sql.where.WhereModel;
@@ -194,7 +193,7 @@ private Optional<FragmentAndParameters> calculateGroupByClause() {
194193

195194
private FragmentAndParameters renderGroupBy(GroupByModel groupByModel) {
196195
String groupBy = groupByModel.mapColumns(this::applyTableAlias)
197-
.collect(CustomCollectors.joining(", ", "group by ", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
196+
.collect(Collectors.joining(", ", "group by ", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
198197
return FragmentAndParameters.withFragment(groupBy).build();
199198
}
200199

src/main/java/org/mybatis/dynamic/sql/select/render/SelectRenderer.java

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,13 @@
2020
import java.util.concurrent.atomic.AtomicInteger;
2121
import java.util.stream.Collectors;
2222

23-
import org.mybatis.dynamic.sql.SortSpecification;
23+
import org.mybatis.dynamic.sql.common.OrderByRenderer;
2424
import org.mybatis.dynamic.sql.render.RenderingStrategy;
2525
import org.mybatis.dynamic.sql.render.TableAliasCalculator;
26-
import org.mybatis.dynamic.sql.select.OrderByModel;
26+
import org.mybatis.dynamic.sql.common.OrderByModel;
2727
import org.mybatis.dynamic.sql.select.PagingModel;
2828
import org.mybatis.dynamic.sql.select.QueryExpressionModel;
2929
import org.mybatis.dynamic.sql.select.SelectModel;
30-
import org.mybatis.dynamic.sql.util.CustomCollectors;
3130
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
3231
import org.mybatis.dynamic.sql.util.FragmentCollector;
3332

@@ -80,17 +79,8 @@ private Optional<FragmentAndParameters> renderOrderBy() {
8079
}
8180

8281
private FragmentAndParameters renderOrderBy(OrderByModel orderByModel) {
83-
String phrase = orderByModel.mapColumns(this::calculateOrderByPhrase)
84-
.collect(CustomCollectors.joining(", ", "order by ", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
85-
return FragmentAndParameters.withFragment(phrase).build();
86-
}
87-
88-
private String calculateOrderByPhrase(SortSpecification column) {
89-
String phrase = column.orderByName();
90-
if (column.isDescending()) {
91-
phrase = phrase + " DESC"; //$NON-NLS-1$
92-
}
93-
return phrase;
82+
OrderByRenderer renderer = new OrderByRenderer();
83+
return renderer.render(orderByModel);
9484
}
9585

9686
private Optional<FragmentAndParameters> renderPagingModel() {

src/main/java/org/mybatis/dynamic/sql/util/CustomCollectors.java

Lines changed: 0 additions & 43 deletions
This file was deleted.

0 commit comments

Comments
 (0)