Skip to content

Commit 09a583d

Browse files
committed
Move query expression rendering fully into Query Expression Renderer
1 parent ca34ebe commit 09a583d

File tree

5 files changed

+46
-157
lines changed

5 files changed

+46
-157
lines changed

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

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

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Copyright 2016-2017 the original author or authors.
2+
* Copyright 2016-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -22,6 +22,8 @@
2222
import java.util.stream.Collector;
2323
import java.util.stream.Collectors;
2424

25+
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
26+
2527
public class QueryExpressionCollector {
2628
private List<String> queryExpressions = new ArrayList<>();
2729
private Map<String, Object> parameters = new HashMap<>();
@@ -30,9 +32,9 @@ private QueryExpressionCollector() {
3032
super();
3133
}
3234

33-
private void add(QueryExpression queryExpression) {
34-
queryExpressions.add(queryExpression.queryExpression());
35-
parameters.putAll(queryExpression.parameters());
35+
private void add(FragmentAndParameters fragmentAndParameters) {
36+
queryExpressions.add(fragmentAndParameters.fragment());
37+
parameters.putAll(fragmentAndParameters.parameters());
3638
}
3739

3840
private QueryExpressionCollector merge(QueryExpressionCollector other) {
@@ -49,7 +51,7 @@ public Map<String, Object> parameters() {
4951
return parameters;
5052
}
5153

52-
public static Collector<QueryExpression, QueryExpressionCollector, QueryExpressionCollector> collect() {
54+
public static Collector<FragmentAndParameters, QueryExpressionCollector, QueryExpressionCollector> collect() {
5355
return Collector.of(QueryExpressionCollector::new,
5456
QueryExpressionCollector::add,
5557
QueryExpressionCollector::merge);

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

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Copyright 2016-2018 the original author or authors.
2+
* Copyright 2016-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -15,6 +15,11 @@
1515
*/
1616
package org.mybatis.dynamic.sql.select.render;
1717

18+
import static org.mybatis.dynamic.sql.util.StringUtilities.spaceAfter;
19+
import static org.mybatis.dynamic.sql.util.StringUtilities.spaceBefore;
20+
21+
import java.util.Collections;
22+
import java.util.Map;
1823
import java.util.Objects;
1924
import java.util.Optional;
2025
import java.util.concurrent.atomic.AtomicInteger;
@@ -27,6 +32,7 @@
2732
import org.mybatis.dynamic.sql.select.QueryExpressionModel;
2833
import org.mybatis.dynamic.sql.select.join.JoinModel;
2934
import org.mybatis.dynamic.sql.util.CustomCollectors;
35+
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
3036
import org.mybatis.dynamic.sql.where.WhereModel;
3137
import org.mybatis.dynamic.sql.where.render.WhereClauseProvider;
3238
import org.mybatis.dynamic.sql.where.render.WhereRenderer;
@@ -42,16 +48,31 @@ private QueryExpressionRenderer(Builder builder) {
4248
sequence = Objects.requireNonNull(builder.sequence);
4349
}
4450

45-
public QueryExpression render() {
46-
return QueryExpression.withColumnList(calculateColumnList())
47-
.withConnector(queryExpression.connector())
48-
.isDistinct(queryExpression.isDistinct())
49-
.withTableName(calculateTableName(queryExpression.table()))
50-
.withJoinClause(queryExpression.joinModel().map(this::renderJoin))
51-
.withWhereClause(queryExpression.whereModel().flatMap(this::renderWhereClause))
52-
.withGroupByClause(queryExpression.groupByModel().map(this::renderGroupBy))
51+
public FragmentAndParameters render() {
52+
Optional<WhereClauseProvider> whereClause = queryExpression.whereModel().flatMap(this::renderWhereClause);
53+
54+
return FragmentAndParameters.withFragment(calculateQueryExpression(whereClause))
55+
.withParameters(calculateParameters(whereClause))
5356
.build();
5457
}
58+
59+
private String calculateQueryExpression(Optional<WhereClauseProvider> whereClause) {
60+
return spaceAfter(queryExpression.connector())
61+
+ "select " //$NON-NLS-1$
62+
+ (queryExpression.isDistinct() ? "distinct " : "") //$NON-NLS-1$ //$NON-NLS-2$
63+
+ calculateColumnList()
64+
+ " from " //$NON-NLS-1$
65+
+ calculateTableName(queryExpression.table())
66+
+ spaceBefore(queryExpression.joinModel().map(this::renderJoin))
67+
+ spaceBefore(whereClause.map(WhereClauseProvider::getWhereClause))
68+
+ spaceBefore(queryExpression.groupByModel().map(this::renderGroupBy));
69+
}
70+
71+
private Map<String, Object> calculateParameters(Optional<WhereClauseProvider> whereClause) {
72+
return whereClause
73+
.map(WhereClauseProvider::getParameters)
74+
.orElse(Collections.emptyMap());
75+
}
5576

5677
private String calculateColumnList() {
5778
return queryExpression.mapColumns(this::applyTableAndColumnAlias)

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.mybatis.dynamic.sql.select.QueryExpressionModel;
2929
import org.mybatis.dynamic.sql.select.SelectModel;
3030
import org.mybatis.dynamic.sql.util.CustomCollectors;
31+
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
3132

3233
public class SelectRenderer {
3334
private static final String LIMIT_PARAMETER = "_limit"; //$NON-NLS-1$
@@ -59,7 +60,7 @@ public SelectStatementProvider render() {
5960
.build();
6061
}
6162

62-
private QueryExpression renderQueryExpression(QueryExpressionModel queryExpressionModel) {
63+
private FragmentAndParameters renderQueryExpression(QueryExpressionModel queryExpressionModel) {
6364
return QueryExpressionRenderer.withQueryExpression(queryExpressionModel)
6465
.withRenderingStrategy(renderingStrategy)
6566
.withSequence(sequence)

src/test/java/org/mybatis/dynamic/sql/select/render/QueryExpressionCollectorTest.java

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Copyright 2016-2018 the original author or authors.
2+
* Copyright 2016-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -21,44 +21,31 @@
2121
import java.util.HashMap;
2222
import java.util.List;
2323
import java.util.Map;
24-
import java.util.Optional;
2524

2625
import org.junit.jupiter.api.Test;
27-
import org.mybatis.dynamic.sql.where.render.WhereClauseProvider;
26+
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2827

2928
public class QueryExpressionCollectorTest {
3029

3130
@Test
3231
public void testQueryExpressionCollectorMerge() {
33-
List<QueryExpression> queryExpressions = new ArrayList<>();
32+
List<FragmentAndParameters> queryExpressions = new ArrayList<>();
3433

3534
Map<String, Object> parms1 = new HashMap<>();
3635
parms1.put("p1", 1);
3736

38-
WhereClauseProvider wcp1 = WhereClauseProvider.withWhereClause("where fred = ?")
37+
FragmentAndParameters fp1 = FragmentAndParameters.withFragment("select foo from bar where fred = ?")
3938
.withParameters(parms1)
4039
.build();
41-
42-
QueryExpression qe1 = QueryExpression.withColumnList("foo")
43-
.withConnector(Optional.empty())
44-
.withTableName("bar")
45-
.withWhereClause(Optional.of(wcp1))
46-
.build();
47-
queryExpressions.add(qe1);
40+
queryExpressions.add(fp1);
4841

4942
Map<String, Object> parms2 = new HashMap<>();
5043
parms2.put("p2", 2);
5144

52-
WhereClauseProvider wcp2 = WhereClauseProvider.withWhereClause("where betty = ?")
45+
FragmentAndParameters fp2 = FragmentAndParameters.withFragment("union select bar from foo where betty = ?")
5346
.withParameters(parms2)
5447
.build();
55-
56-
QueryExpression qe2 = QueryExpression.withColumnList("bar")
57-
.withConnector(Optional.of("union"))
58-
.withTableName("foo")
59-
.withWhereClause(Optional.of(wcp2))
60-
.build();
61-
queryExpressions.add(qe2);
48+
queryExpressions.add(fp2);
6249

6350
// parallelStream should trigger the merge
6451
QueryExpressionCollector collector = queryExpressions.parallelStream()

0 commit comments

Comments
 (0)