Skip to content

Commit 99669ab

Browse files
committed
Back to explicit subquery renderer
1 parent 63223f3 commit 99669ab

File tree

3 files changed

+122
-62
lines changed

3 files changed

+122
-62
lines changed

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

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@
3535
import org.mybatis.dynamic.sql.insert.render.MultiRowInsertStatementProvider;
3636
import org.mybatis.dynamic.sql.select.MultiSelectModel;
3737
import org.mybatis.dynamic.sql.select.SelectModel;
38-
import org.mybatis.dynamic.sql.select.render.DefaultSelectStatementProvider;
3938
import org.mybatis.dynamic.sql.select.render.MultiSelectRenderer;
4039
import org.mybatis.dynamic.sql.select.render.SelectRenderer;
4140
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
41+
import org.mybatis.dynamic.sql.select.render.SubQueryRenderer;
4242
import org.mybatis.dynamic.sql.update.UpdateModel;
4343
import org.mybatis.dynamic.sql.update.render.UpdateRenderer;
4444
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
@@ -102,24 +102,15 @@ static Renderer<RenderingStrategy, SelectStatementProvider> createMultiSelectRen
102102
}
103103

104104
static Renderer<RenderingStrategy, SelectStatementProvider> createSelectRenderer(SelectModel selectModel) {
105-
return renderingStrategy -> {
106-
RenderingContext renderingContext = RenderingContext.withRenderingStrategy(renderingStrategy)
107-
.withStatementConfiguration(selectModel.statementConfiguration())
108-
.build();
109-
110-
FragmentAndParameters fragmentAndParameters = createSubQueryRenderer(selectModel,
111-
"", "") //$NON-NLS-1$ //$NON-NLS-2$
112-
.render(renderingContext);
113-
114-
return DefaultSelectStatementProvider.withSelectStatement(fragmentAndParameters.fragment())
115-
.withParameters(fragmentAndParameters.parameters())
116-
.build();
117-
};
105+
return renderingStrategy -> SelectRenderer.withSelectModel(selectModel)
106+
.withRenderingStrategy(renderingStrategy)
107+
.build()
108+
.render();
118109
}
119110

120111
static Renderer<RenderingContext, FragmentAndParameters> createSubQueryRenderer(SelectModel selectModel,
121112
String prefix, String suffix) {
122-
return renderingContext -> SelectRenderer.withSelectModel(selectModel)
113+
return renderingContext -> SubQueryRenderer.withSelectModel(selectModel)
123114
.withRenderingContext(renderingContext)
124115
.build()
125116
.render(prefix, suffix);

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

Lines changed: 15 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -16,64 +16,32 @@
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(String prefix, String suffix) {
41-
FragmentCollector fragmentCollector = selectModel
42-
.queryExpressions()
43-
.map(this::renderQueryExpression)
44-
.collect(FragmentCollector.collect());
37+
public SelectStatementProvider render() {
38+
FragmentAndParameters fragmentAndParameters = RendererFactory.createSubQueryRenderer(selectModel,
39+
"", "") //$NON-NLS-1$ //$NON-NLS-2$
40+
.render(renderingContext);
4541

46-
renderOrderBy().ifPresent(fragmentCollector::add);
47-
renderPagingModel().ifPresent(fragmentCollector::add);
48-
49-
return fragmentCollector.toFragmentAndParameters(Collectors.joining(" ", prefix, suffix)); //$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();
42+
return DefaultSelectStatementProvider.withSelectStatement(fragmentAndParameters.fragment())
43+
.withParameters(fragmentAndParameters.parameters())
44+
.build();
7745
}
7846

7947
public static Builder withSelectModel(SelectModel selectModel) {
@@ -82,10 +50,10 @@ public static Builder withSelectModel(SelectModel selectModel) {
8250

8351
public static class Builder {
8452
private SelectModel selectModel;
85-
private RenderingContext renderingContext;
53+
private RenderingStrategy renderingStrategy;
8654

87-
public Builder withRenderingContext(RenderingContext renderingContext) {
88-
this.renderingContext = renderingContext;
55+
public Builder withRenderingStrategy(RenderingStrategy renderingStrategy) {
56+
this.renderingStrategy = renderingStrategy;
8957
return this;
9058
}
9159

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 java.util.Objects;
19+
import java.util.Optional;
20+
import java.util.stream.Collectors;
21+
22+
import org.mybatis.dynamic.sql.common.OrderByModel;
23+
import org.mybatis.dynamic.sql.common.OrderByRenderer;
24+
import org.mybatis.dynamic.sql.render.RenderingContext;
25+
import org.mybatis.dynamic.sql.select.PagingModel;
26+
import org.mybatis.dynamic.sql.select.QueryExpressionModel;
27+
import org.mybatis.dynamic.sql.select.SelectModel;
28+
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
29+
import org.mybatis.dynamic.sql.util.FragmentCollector;
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(String prefix, String suffix) {
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(" ", prefix, suffix)); //$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+
}

0 commit comments

Comments
 (0)