Skip to content

Commit 1e3edab

Browse files
committed
Step 2 - Define sort specification interface for ORDER BY
1 parent 78a416a commit 1e3edab

File tree

5 files changed

+65
-18
lines changed

5 files changed

+65
-18
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/**
2+
* Copyright 2016-2017 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+
* http://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;
17+
18+
/**
19+
* Defines attributes of columns that are necessary for rendering an order by expression.
20+
*
21+
* @author Jeff Butler
22+
*
23+
*/
24+
public interface SortSpecification {
25+
SortSpecification as(String alias);
26+
String aliasOrName();
27+
boolean isDescending();
28+
}

src/main/java/org/mybatis/dynamic/sql/SqlColumn.java

+24-5
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
import org.mybatis.dynamic.sql.render.TableAliasCalculator;
2323

24-
public class SqlColumn<T> implements BindableColumn<T> {
24+
public class SqlColumn<T> implements BindableColumn<T>, SortSpecification {
2525

2626
protected String name;
2727
protected SqlTable table;
@@ -65,10 +65,23 @@ public Optional<String> typeHandler() {
6565
return typeHandler;
6666
}
6767

68-
public SqlColumn<T> descending() {
69-
SqlColumn<T> column = new SqlColumn<>(this);
70-
column.isDescending = true;
71-
return column;
68+
public SortSpecification descending() {
69+
return new SortSpecification() {
70+
@Override
71+
public SortSpecification as(String alias) {
72+
return SqlColumn.this.as(alias);
73+
}
74+
75+
@Override
76+
public boolean isDescending() {
77+
return true;
78+
}
79+
80+
@Override
81+
public String aliasOrName() {
82+
return SqlColumn.this.aliasOrName();
83+
}
84+
};
7285
}
7386

7487
@Override
@@ -78,10 +91,16 @@ public SqlColumn<T> as(String alias) {
7891
return column;
7992
}
8093

94+
@Override
8195
public boolean isDescending() {
8296
return isDescending;
8397
}
8498

99+
@Override
100+
public String aliasOrName() {
101+
return alias.orElse(name);
102+
}
103+
85104
@Override
86105
public String applyTableAliasToName(TableAliasCalculator tableAliasCalculator) {
87106
return tableAliasCalculator.aliasForColumn(table)

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,20 @@
2121
import java.util.function.Function;
2222
import java.util.stream.Stream;
2323

24-
import org.mybatis.dynamic.sql.SqlColumn;
24+
import org.mybatis.dynamic.sql.SortSpecification;
2525

2626
public class OrderByModel {
27-
private List<SqlColumn<?>> columns = new ArrayList<>();
27+
private List<SortSpecification> columns = new ArrayList<>();
2828

29-
private OrderByModel(List<SqlColumn<?>> columns) {
29+
private OrderByModel(List<SortSpecification> columns) {
3030
this.columns.addAll(columns);
3131
}
3232

33-
public <R> Stream<R> mapColumns(Function<SqlColumn<?>, R> mapper) {
33+
public <R> Stream<R> mapColumns(Function<SortSpecification, R> mapper) {
3434
return columns.stream().map(mapper);
3535
}
3636

37-
public static OrderByModel of(SqlColumn<?>...columns) {
37+
public static OrderByModel of(SortSpecification...columns) {
3838
return new OrderByModel(Arrays.asList(columns));
3939
}
4040
}

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
import java.util.Objects;
2424

2525
import org.mybatis.dynamic.sql.BindableColumn;
26+
import org.mybatis.dynamic.sql.SortSpecification;
2627
import org.mybatis.dynamic.sql.BasicColumn;
27-
import org.mybatis.dynamic.sql.SqlColumn;
2828
import org.mybatis.dynamic.sql.SqlCriterion;
2929
import org.mybatis.dynamic.sql.SqlTable;
3030
import org.mybatis.dynamic.sql.VisitableCondition;
@@ -174,7 +174,7 @@ public GroupByFinisher groupBy(BasicColumn...columns) {
174174
return new GroupByFinisher();
175175
}
176176

177-
public SelectDSL orderBy(SqlColumn<?>...columns) {
177+
public SelectDSL orderBy(SortSpecification...columns) {
178178
selectModelBuilder.addQueryExpression(buildModel());
179179
selectModelBuilder.setOrderByModel(OrderByModel.of(columns));
180180
return selectModelBuilder;
@@ -203,7 +203,7 @@ public UnionBuilder union() {
203203
return new UnionBuilder();
204204
}
205205

206-
public SelectDSL orderBy(SqlColumn<?>...columns) {
206+
public SelectDSL orderBy(SortSpecification...columns) {
207207
whereModel = buildWhereModel();
208208
selectModelBuilder.addQueryExpression(buildModel());
209209
selectModelBuilder.setOrderByModel(OrderByModel.of(columns));
@@ -358,7 +358,7 @@ public JoinSpecificationStarter fullJoin(SqlTable joinTable, String tableAlias)
358358
return fullJoin(joinTable);
359359
}
360360

361-
public SelectDSL orderBy(SqlColumn<?>...columns) {
361+
public SelectDSL orderBy(SortSpecification...columns) {
362362
joinModel = buildJoinModel();
363363
selectModelBuilder.addQueryExpression(buildModel());
364364
selectModelBuilder.setOrderByModel(OrderByModel.of(columns));
@@ -367,7 +367,7 @@ public SelectDSL orderBy(SqlColumn<?>...columns) {
367367
}
368368

369369
public class GroupByFinisher implements Buildable<SelectModel> {
370-
public SelectDSL orderBy(SqlColumn<?>...columns) {
370+
public SelectDSL orderBy(SortSpecification...columns) {
371371
selectModelBuilder.setOrderByModel(OrderByModel.of(columns));
372372
return selectModelBuilder;
373373
}

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import java.util.Optional;
2020
import java.util.concurrent.atomic.AtomicInteger;
2121

22-
import org.mybatis.dynamic.sql.SqlColumn;
22+
import org.mybatis.dynamic.sql.SortSpecification;
2323
import org.mybatis.dynamic.sql.render.RenderingStrategy;
2424
import org.mybatis.dynamic.sql.select.OrderByModel;
2525
import org.mybatis.dynamic.sql.select.QueryExpressionModel;
@@ -63,8 +63,8 @@ private String renderOrderBy(OrderByModel orderByModel) {
6363
.collect(CustomCollectors.joining(", ", "order by ", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
6464
}
6565

66-
private String orderByPhrase(SqlColumn<?> column) {
67-
String phrase = column.alias().orElse(column.name());
66+
private String orderByPhrase(SortSpecification column) {
67+
String phrase = column.aliasOrName();
6868
if (column.isDescending()) {
6969
phrase = phrase + " DESC"; //$NON-NLS-1$
7070
}

0 commit comments

Comments
 (0)