Skip to content

Commit 7dd88a3

Browse files
committed
Make the SelectRenderer work for sub-queries
1 parent de7d595 commit 7dd88a3

File tree

3 files changed

+64
-140
lines changed

3 files changed

+64
-140
lines changed

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

Lines changed: 14 additions & 12 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;
3839
import org.mybatis.dynamic.sql.select.render.MultiSelectRenderer;
3940
import org.mybatis.dynamic.sql.select.render.SelectRenderer;
4041
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,22 +102,24 @@ static Renderer<RenderingStrategy, SelectStatementProvider> createMultiSelectRen
102102
}
103103

104104
static Renderer<RenderingStrategy, SelectStatementProvider> createSelectRenderer(SelectModel selectModel) {
105-
return renderingStrategy -> SelectRenderer.withSelectModel(selectModel)
106-
.withRenderingStrategy(renderingStrategy)
107-
.build()
108-
.render();
109-
}
105+
return renderingStrategy -> {
106+
RenderingContext renderingContext = RenderingContext.withRenderingStrategy(renderingStrategy)
107+
.withStatementConfiguration(selectModel.statementConfiguration())
108+
.build();
110109

111-
static Renderer<RenderingContext, FragmentAndParameters> createSubQueryRenderer(SelectModel selectModel) {
112-
return renderingContext -> SubQueryRenderer.withSelectModel(selectModel)
113-
.withRenderingContext(renderingContext)
114-
.build()
115-
.render();
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+
};
116118
}
117119

118120
static Renderer<RenderingContext, FragmentAndParameters> createSubQueryRenderer(SelectModel selectModel,
119121
String prefix, String suffix) {
120-
return renderingContext -> SubQueryRenderer.withSelectModel(selectModel)
122+
return renderingContext -> SelectRenderer.withSelectModel(selectModel)
121123
.withRenderingContext(renderingContext)
122124
.build()
123125
.render(prefix, suffix);

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

Lines changed: 50 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,65 @@
1515
*/
1616
package org.mybatis.dynamic.sql.select.render;
1717

18-
import java.util.Objects;
19-
20-
import org.mybatis.dynamic.sql.render.RendererFactory;
18+
import org.mybatis.dynamic.sql.common.OrderByModel;
19+
import org.mybatis.dynamic.sql.common.OrderByRenderer;
2120
import org.mybatis.dynamic.sql.render.RenderingContext;
22-
import org.mybatis.dynamic.sql.render.RenderingStrategy;
21+
import org.mybatis.dynamic.sql.select.PagingModel;
22+
import org.mybatis.dynamic.sql.select.QueryExpressionModel;
2323
import org.mybatis.dynamic.sql.select.SelectModel;
2424
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;
2530

2631
public class SelectRenderer {
2732
private final SelectModel selectModel;
2833
private final RenderingContext renderingContext;
2934

3035
private SelectRenderer(Builder builder) {
3136
selectModel = Objects.requireNonNull(builder.selectModel);
32-
renderingContext = RenderingContext.withRenderingStrategy(builder.renderingStrategy)
33-
.withStatementConfiguration(selectModel.statementConfiguration())
34-
.build();
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);
3569
}
3670

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();
71+
private FragmentAndParameters renderPagingModel(PagingModel pagingModel) {
72+
return new PagingModelRenderer.Builder()
73+
.withPagingModel(pagingModel)
74+
.withRenderingContext(renderingContext)
75+
.build()
76+
.render();
4377
}
4478

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

4983
public static class Builder {
5084
private SelectModel selectModel;
51-
private RenderingStrategy renderingStrategy;
85+
private RenderingContext renderingContext;
5286

53-
public Builder withRenderingStrategy(RenderingStrategy renderingStrategy) {
54-
this.renderingStrategy = renderingStrategy;
87+
public Builder withRenderingContext(RenderingContext renderingContext) {
88+
this.renderingContext = renderingContext;
5589
return this;
5690
}
5791

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

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

0 commit comments

Comments
 (0)