Skip to content

Commit 1321973

Browse files
committed
Make an explicit subquery renderer
1 parent d8f631b commit 1321973

File tree

10 files changed

+135
-67
lines changed

10 files changed

+135
-67
lines changed

src/main/java/org/mybatis/dynamic/sql/insert/render/InsertSelectRenderer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ private InsertSelectRenderer(Builder builder) {
4242
}
4343

4444
public InsertSelectStatementProvider render() {
45-
FragmentAndParameters selectStatement = model.selectModel().render(renderingContext);
45+
FragmentAndParameters selectStatement = model.selectModel().renderSubQuery(renderingContext);
4646

4747
String statementStart = InsertRenderingUtilities.calculateInsertStatementStart(model.table());
4848
Optional<String> columnsPhrase = calculateColumnsPhrase();

src/main/java/org/mybatis/dynamic/sql/render/RendererFactory.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.mybatis.dynamic.sql.select.render.MultiSelectRenderer;
3939
import org.mybatis.dynamic.sql.select.render.SelectRenderer;
4040
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
41+
import org.mybatis.dynamic.sql.select.render.SubQueryRenderer;
4142
import org.mybatis.dynamic.sql.update.UpdateModel;
4243
import org.mybatis.dynamic.sql.update.render.UpdateRenderer;
4344
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
@@ -100,8 +101,15 @@ static Renderer<RenderingStrategy, SelectStatementProvider> createMultiSelectRen
100101
.render();
101102
}
102103

103-
static Renderer<RenderingContext, FragmentAndParameters> createSelectRenderer(SelectModel selectModel) {
104-
return renderingContext -> SelectRenderer.withSelectModel(selectModel)
104+
static Renderer<RenderingStrategy, SelectStatementProvider> createSelectRenderer(SelectModel selectModel) {
105+
return renderingStrategy -> SelectRenderer.withSelectModel(selectModel)
106+
.withRenderingStrategy(renderingStrategy)
107+
.build()
108+
.render();
109+
}
110+
111+
static Renderer<RenderingContext, FragmentAndParameters> createSubQueryRenderer(SelectModel selectModel) {
112+
return renderingContext -> SubQueryRenderer.withSelectModel(selectModel)
105113
.withRenderingContext(renderingContext)
106114
.build()
107115
.render();

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

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.mybatis.dynamic.sql.render.RendererFactory;
2525
import org.mybatis.dynamic.sql.render.RenderingContext;
2626
import org.mybatis.dynamic.sql.render.RenderingStrategy;
27-
import org.mybatis.dynamic.sql.select.render.DefaultSelectStatementProvider;
2827
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
2928
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
3029
import org.mybatis.dynamic.sql.util.Validator;
@@ -44,13 +43,7 @@ public Stream<QueryExpressionModel> queryExpressions() {
4443

4544
@NotNull
4645
public SelectStatementProvider render(RenderingStrategy renderingStrategy) {
47-
RenderingContext renderingContext = RenderingContext.withRenderingStrategy(renderingStrategy)
48-
.withStatementConfiguration(statementConfiguration)
49-
.build();
50-
FragmentAndParameters fragmentAndParameters = render(renderingContext);
51-
return DefaultSelectStatementProvider.withSelectStatement(fragmentAndParameters.fragment())
52-
.withParameters(fragmentAndParameters.parameters())
53-
.build();
46+
return RendererFactory.createSelectRenderer(this).render(renderingStrategy);
5447
}
5548

5649
/**
@@ -60,8 +53,8 @@ public SelectStatementProvider render(RenderingStrategy renderingStrategy) {
6053
* @return a rendered select statement and parameters
6154
*/
6255
@NotNull
63-
public FragmentAndParameters render(RenderingContext renderingContext) {
64-
return RendererFactory.createSelectRenderer(this).render(renderingContext);
56+
public FragmentAndParameters renderSubQuery(RenderingContext renderingContext) {
57+
return RendererFactory.createSubQueryRenderer(this).render(renderingContext);
6558
}
6659

6760
public static Builder withQueryExpressions(List<QueryExpressionModel> queryExpressions) {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,12 @@ private SelectStatementProvider toSelectStatementProvider(FragmentCollector frag
6464
}
6565

6666
private FragmentAndParameters renderSelect(SelectModel selectModel) {
67-
return selectModel.render(renderingContext)
67+
return selectModel.renderSubQuery(renderingContext)
6868
.mapFragment(f -> "(" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$
6969
}
7070

7171
private FragmentAndParameters renderSelect(UnionQuery unionQuery) {
72-
return unionQuery.selectModel().render(renderingContext)
72+
return unionQuery.selectModel().renderSubQuery(renderingContext)
7373
.mapFragment(f -> unionQuery.connector() + " (" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$
7474
}
7575

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

Lines changed: 14 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -16,64 +16,30 @@
1616
package org.mybatis.dynamic.sql.select.render;
1717

1818
import java.util.Objects;
19-
import java.util.Optional;
20-
import java.util.stream.Collectors;
2119

22-
import org.mybatis.dynamic.sql.common.OrderByModel;
23-
import org.mybatis.dynamic.sql.common.OrderByRenderer;
20+
import org.mybatis.dynamic.sql.render.RendererFactory;
2421
import org.mybatis.dynamic.sql.render.RenderingContext;
25-
import org.mybatis.dynamic.sql.select.PagingModel;
26-
import org.mybatis.dynamic.sql.select.QueryExpressionModel;
22+
import org.mybatis.dynamic.sql.render.RenderingStrategy;
2723
import org.mybatis.dynamic.sql.select.SelectModel;
2824
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
29-
import org.mybatis.dynamic.sql.util.FragmentCollector;
3025

3126
public class SelectRenderer {
3227
private final SelectModel selectModel;
3328
private final RenderingContext renderingContext;
3429

3530
private SelectRenderer(Builder builder) {
3631
selectModel = Objects.requireNonNull(builder.selectModel);
37-
renderingContext = Objects.requireNonNull(builder.renderingContext);
32+
renderingContext = RenderingContext.withRenderingStrategy(builder.renderingStrategy)
33+
.withStatementConfiguration(selectModel.statementConfiguration())
34+
.build();
3835
}
3936

40-
public FragmentAndParameters render() {
41-
FragmentCollector fragmentCollector = selectModel
42-
.queryExpressions()
43-
.map(this::renderQueryExpression)
44-
.collect(FragmentCollector.collect());
45-
46-
renderOrderBy().ifPresent(fragmentCollector::add);
47-
renderPagingModel().ifPresent(fragmentCollector::add);
48-
49-
return fragmentCollector.toFragmentAndParameters(Collectors.joining(" ")); //$NON-NLS-1$
50-
}
51-
52-
private FragmentAndParameters renderQueryExpression(QueryExpressionModel queryExpressionModel) {
53-
return QueryExpressionRenderer.withQueryExpression(queryExpressionModel)
54-
.withRenderingContext(renderingContext)
55-
.build()
56-
.render();
57-
}
58-
59-
private Optional<FragmentAndParameters> renderOrderBy() {
60-
return selectModel.orderByModel().map(this::renderOrderBy);
61-
}
62-
63-
private FragmentAndParameters renderOrderBy(OrderByModel orderByModel) {
64-
return new OrderByRenderer(renderingContext).render(orderByModel);
65-
}
66-
67-
private Optional<FragmentAndParameters> renderPagingModel() {
68-
return selectModel.pagingModel().map(this::renderPagingModel);
69-
}
70-
71-
private FragmentAndParameters renderPagingModel(PagingModel pagingModel) {
72-
return new PagingModelRenderer.Builder()
73-
.withPagingModel(pagingModel)
74-
.withRenderingContext(renderingContext)
75-
.build()
76-
.render();
37+
public SelectStatementProvider render() {
38+
FragmentAndParameters fragmentAndParameters = RendererFactory.createSubQueryRenderer(selectModel)
39+
.render(renderingContext);
40+
return DefaultSelectStatementProvider.withSelectStatement(fragmentAndParameters.fragment())
41+
.withParameters(fragmentAndParameters.parameters())
42+
.build();
7743
}
7844

7945
public static Builder withSelectModel(SelectModel selectModel) {
@@ -82,10 +48,10 @@ public static Builder withSelectModel(SelectModel selectModel) {
8248

8349
public static class Builder {
8450
private SelectModel selectModel;
85-
private RenderingContext renderingContext;
51+
private RenderingStrategy renderingStrategy;
8652

87-
public Builder withRenderingContext(RenderingContext renderingContext) {
88-
this.renderingContext = renderingContext;
53+
public Builder withRenderingStrategy(RenderingStrategy renderingStrategy) {
54+
this.renderingStrategy = renderingStrategy;
8955
return this;
9056
}
9157

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
/*
2+
* Copyright 2016-2024 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.select.render;
17+
18+
import org.mybatis.dynamic.sql.common.OrderByModel;
19+
import org.mybatis.dynamic.sql.common.OrderByRenderer;
20+
import org.mybatis.dynamic.sql.render.RenderingContext;
21+
import org.mybatis.dynamic.sql.select.PagingModel;
22+
import org.mybatis.dynamic.sql.select.QueryExpressionModel;
23+
import org.mybatis.dynamic.sql.select.SelectModel;
24+
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
25+
import org.mybatis.dynamic.sql.util.FragmentCollector;
26+
27+
import java.util.Objects;
28+
import java.util.Optional;
29+
import java.util.stream.Collectors;
30+
31+
public class SubQueryRenderer {
32+
private final SelectModel selectModel;
33+
private final RenderingContext renderingContext;
34+
35+
private SubQueryRenderer(Builder builder) {
36+
selectModel = Objects.requireNonNull(builder.selectModel);
37+
renderingContext = Objects.requireNonNull(builder.renderingContext);
38+
}
39+
40+
public FragmentAndParameters render() {
41+
FragmentCollector fragmentCollector = selectModel
42+
.queryExpressions()
43+
.map(this::renderQueryExpression)
44+
.collect(FragmentCollector.collect());
45+
46+
renderOrderBy().ifPresent(fragmentCollector::add);
47+
renderPagingModel().ifPresent(fragmentCollector::add);
48+
49+
return fragmentCollector.toFragmentAndParameters(Collectors.joining(" ")); //$NON-NLS-1$
50+
}
51+
52+
private FragmentAndParameters renderQueryExpression(QueryExpressionModel queryExpressionModel) {
53+
return QueryExpressionRenderer.withQueryExpression(queryExpressionModel)
54+
.withRenderingContext(renderingContext)
55+
.build()
56+
.render();
57+
}
58+
59+
private Optional<FragmentAndParameters> renderOrderBy() {
60+
return selectModel.orderByModel().map(this::renderOrderBy);
61+
}
62+
63+
private FragmentAndParameters renderOrderBy(OrderByModel orderByModel) {
64+
return new OrderByRenderer(renderingContext).render(orderByModel);
65+
}
66+
67+
private Optional<FragmentAndParameters> renderPagingModel() {
68+
return selectModel.pagingModel().map(this::renderPagingModel);
69+
}
70+
71+
private FragmentAndParameters renderPagingModel(PagingModel pagingModel) {
72+
return new PagingModelRenderer.Builder()
73+
.withPagingModel(pagingModel)
74+
.withRenderingContext(renderingContext)
75+
.build()
76+
.render();
77+
}
78+
79+
public static Builder withSelectModel(SelectModel selectModel) {
80+
return new Builder().withSelectModel(selectModel);
81+
}
82+
83+
public static class Builder {
84+
private SelectModel selectModel;
85+
private RenderingContext renderingContext;
86+
87+
public Builder withRenderingContext(RenderingContext renderingContext) {
88+
this.renderingContext = renderingContext;
89+
return this;
90+
}
91+
92+
public Builder withSelectModel(SelectModel selectModel) {
93+
this.selectModel = selectModel;
94+
return this;
95+
}
96+
97+
public SubQueryRenderer build() {
98+
return new SubQueryRenderer(this);
99+
}
100+
}
101+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public FragmentAndParameters visit(SqlTable table) {
3939

4040
@Override
4141
public FragmentAndParameters visit(SubQuery subQuery) {
42-
return subQuery.selectModel().render(renderingContext)
42+
return subQuery.selectModel().renderSubQuery(renderingContext)
4343
.mapFragment(f -> applyAlias("(" + f + ")", subQuery)); //$NON-NLS-1$ //$NON-NLS-2$
4444
}
4545

src/main/java/org/mybatis/dynamic/sql/update/render/SetPhraseVisitor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public <T> Optional<FragmentAndParameters> visit(ValueWhenPresentMapping<T> mapp
8383

8484
@Override
8585
public Optional<FragmentAndParameters> visit(SelectMapping mapping) {
86-
return Optional.of(mapping.selectModel().render(renderingContext)
86+
return Optional.of(mapping.selectModel().renderSubQuery(renderingContext)
8787
.mapFragment(f -> renderingContext.aliasedColumnName(mapping.column())
8888
+ " = (" + f + ")")); //$NON-NLS-1$ //$NON-NLS-2$
8989
}

src/main/java/org/mybatis/dynamic/sql/where/render/CriterionRenderer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ private <T> Optional<FragmentAndParameters> renderColumnAndCondition(ColumnAndCo
119119
private FragmentAndParameters renderExists(ExistsCriterion criterion) {
120120
ExistsPredicate existsPredicate = criterion.existsPredicate();
121121

122-
return existsPredicate.selectModelBuilder().build().render(renderingContext)
122+
return existsPredicate.selectModelBuilder().build().renderSubQuery(renderingContext)
123123
.mapFragment(f -> existsPredicate.operator() + " (" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$
124124
}
125125

src/main/java/org/mybatis/dynamic/sql/where/render/DefaultConditionVisitor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public FragmentAndParameters visit(AbstractTwoValueCondition<T> condition) {
9494

9595
@Override
9696
public FragmentAndParameters visit(AbstractSubselectCondition<T> condition) {
97-
return condition.selectModel().render(renderingContext)
97+
return condition.selectModel().renderSubQuery(renderingContext)
9898
.mapFragment(f -> condition.operator() + " (" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$
9999
}
100100

0 commit comments

Comments
 (0)