Skip to content

Commit de7d595

Browse files
committed
Use the subquery renderer directly - less garbage
1 parent 1321973 commit de7d595

File tree

9 files changed

+63
-50
lines changed

9 files changed

+63
-50
lines changed

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

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,18 @@
1515
*/
1616
package org.mybatis.dynamic.sql.insert.render;
1717

18-
import static org.mybatis.dynamic.sql.util.StringUtilities.spaceBefore;
18+
import static org.mybatis.dynamic.sql.util.StringUtilities.spaceAfter;
1919

2020
import java.util.Objects;
21-
import java.util.Optional;
2221
import java.util.stream.Collectors;
2322

2423
import org.mybatis.dynamic.sql.SqlColumn;
2524
import org.mybatis.dynamic.sql.insert.InsertColumnListModel;
2625
import org.mybatis.dynamic.sql.insert.InsertSelectModel;
26+
import org.mybatis.dynamic.sql.render.RendererFactory;
2727
import org.mybatis.dynamic.sql.render.RenderingContext;
2828
import org.mybatis.dynamic.sql.render.RenderingStrategy;
2929
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
30-
import org.mybatis.dynamic.sql.util.StringUtilities;
3130

3231
public class InsertSelectRenderer {
3332

@@ -42,29 +41,27 @@ private InsertSelectRenderer(Builder builder) {
4241
}
4342

4443
public InsertSelectStatementProvider render() {
45-
FragmentAndParameters selectStatement = model.selectModel().renderSubQuery(renderingContext);
46-
4744
String statementStart = InsertRenderingUtilities.calculateInsertStatementStart(model.table());
48-
Optional<String> columnsPhrase = calculateColumnsPhrase();
49-
String renderedSelectStatement = selectStatement.fragment();
45+
String columnsPhrase = calculateColumnsPhrase();
46+
String prefix = statementStart + spaceAfter(columnsPhrase);
5047

51-
String insertStatement = statementStart
52-
+ columnsPhrase.map(StringUtilities::spaceBefore).orElse("") //$NON-NLS-1$
53-
+ spaceBefore(renderedSelectStatement);
48+
FragmentAndParameters fragmentAndParameters = RendererFactory.createSubQueryRenderer(model.selectModel(),
49+
prefix, "") //$NON-NLS-1$
50+
.render(renderingContext);
5451

55-
return DefaultGeneralInsertStatementProvider.withInsertStatement(insertStatement)
56-
.withParameters(selectStatement.parameters())
52+
return DefaultGeneralInsertStatementProvider.withInsertStatement(fragmentAndParameters.fragment())
53+
.withParameters(fragmentAndParameters.parameters())
5754
.build();
5855
}
5956

60-
private Optional<String> calculateColumnsPhrase() {
61-
return model.columnList().map(this::calculateColumnsPhrase);
57+
private String calculateColumnsPhrase() {
58+
return model.columnList().map(this::calculateColumnsPhrase).orElse(""); //$NON-NLS-1$
6259
}
6360

6461
private String calculateColumnsPhrase(InsertColumnListModel columnList) {
6562
return columnList.columns()
6663
.map(SqlColumn::name)
67-
.collect(Collectors.joining(", ", "(", ")")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
64+
.collect(Collectors.joining(", ", " (", ")")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
6865
}
6966

7067
public static Builder withInsertSelectModel(InsertSelectModel model) {

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,14 @@ static Renderer<RenderingContext, FragmentAndParameters> createSubQueryRenderer(
115115
.render();
116116
}
117117

118+
static Renderer<RenderingContext, FragmentAndParameters> createSubQueryRenderer(SelectModel selectModel,
119+
String prefix, String suffix) {
120+
return renderingContext -> SubQueryRenderer.withSelectModel(selectModel)
121+
.withRenderingContext(renderingContext)
122+
.build()
123+
.render(prefix, suffix);
124+
}
125+
118126
static Renderer<RenderingStrategy, UpdateStatementProvider> createUpdateRenderer(UpdateModel updateModel) {
119127
return renderingStrategy -> UpdateRenderer.withUpdateModel(updateModel)
120128
.withRenderingStrategy(renderingStrategy)

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

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,8 @@
2222

2323
import org.jetbrains.annotations.NotNull;
2424
import org.mybatis.dynamic.sql.render.RendererFactory;
25-
import org.mybatis.dynamic.sql.render.RenderingContext;
2625
import org.mybatis.dynamic.sql.render.RenderingStrategy;
2726
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
28-
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2927
import org.mybatis.dynamic.sql.util.Validator;
3028

3129
public class SelectModel extends AbstractSelectModel {
@@ -46,17 +44,6 @@ public SelectStatementProvider render(RenderingStrategy renderingStrategy) {
4644
return RendererFactory.createSelectRenderer(this).render(renderingStrategy);
4745
}
4846

49-
/**
50-
* This version is for rendering sub-queries, union queries, etc.
51-
*
52-
* @param renderingContext the rendering context
53-
* @return a rendered select statement and parameters
54-
*/
55-
@NotNull
56-
public FragmentAndParameters renderSubQuery(RenderingContext renderingContext) {
57-
return RendererFactory.createSubQueryRenderer(this).render(renderingContext);
58-
}
59-
6047
public static Builder withQueryExpressions(List<QueryExpressionModel> queryExpressions) {
6148
return new Builder().withQueryExpressions(queryExpressions);
6249
}

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.mybatis.dynamic.sql.common.OrderByModel;
2323
import org.mybatis.dynamic.sql.common.OrderByRenderer;
24+
import org.mybatis.dynamic.sql.render.RendererFactory;
2425
import org.mybatis.dynamic.sql.render.RenderingContext;
2526
import org.mybatis.dynamic.sql.render.RenderingStrategy;
2627
import org.mybatis.dynamic.sql.select.MultiSelectModel;
@@ -64,13 +65,17 @@ private SelectStatementProvider toSelectStatementProvider(FragmentCollector frag
6465
}
6566

6667
private FragmentAndParameters renderSelect(SelectModel selectModel) {
67-
return selectModel.renderSubQuery(renderingContext)
68-
.mapFragment(f -> "(" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$
68+
return RendererFactory.createSubQueryRenderer(selectModel,
69+
"(", //$NON-NLS-1$
70+
")") //$NON-NLS-1$
71+
.render(renderingContext);
6972
}
7073

7174
private FragmentAndParameters renderSelect(UnionQuery unionQuery) {
72-
return unionQuery.selectModel().renderSubQuery(renderingContext)
73-
.mapFragment(f -> unionQuery.connector() + " (" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$
75+
return RendererFactory.createSubQueryRenderer(unionQuery.selectModel(),
76+
unionQuery.connector() + " (", //$NON-NLS-1$
77+
")") //$NON-NLS-1$
78+
.render(renderingContext);
7479
}
7580

7681
private Optional<FragmentAndParameters> renderOrderBy() {

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import java.util.Objects;
2828
import java.util.Optional;
29+
import java.util.stream.Collector;
2930
import java.util.stream.Collectors;
3031

3132
public class SubQueryRenderer {
@@ -38,6 +39,16 @@ private SubQueryRenderer(Builder builder) {
3839
}
3940

4041
public FragmentAndParameters render() {
42+
var collector = Collectors.joining(" "); //$NON-NLS-1$
43+
return render(collector);
44+
}
45+
46+
public FragmentAndParameters render(String prefix, String suffix) {
47+
var collector = Collectors.joining(" ", prefix, suffix); //$NON-NLS-1$
48+
return render(collector);
49+
}
50+
51+
private FragmentAndParameters render(Collector<CharSequence, ?, String> collector) {
4152
FragmentCollector fragmentCollector = selectModel
4253
.queryExpressions()
4354
.map(this::renderQueryExpression)
@@ -46,7 +57,7 @@ public FragmentAndParameters render() {
4657
renderOrderBy().ifPresent(fragmentCollector::add);
4758
renderPagingModel().ifPresent(fragmentCollector::add);
4859

49-
return fragmentCollector.toFragmentAndParameters(Collectors.joining(" ")); //$NON-NLS-1$
60+
return fragmentCollector.toFragmentAndParameters(collector);
5061
}
5162

5263
private FragmentAndParameters renderQueryExpression(QueryExpressionModel queryExpressionModel) {

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

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@
1515
*/
1616
package org.mybatis.dynamic.sql.select.render;
1717

18-
import static org.mybatis.dynamic.sql.util.StringUtilities.spaceBefore;
19-
2018
import java.util.Objects;
2119

2220
import org.mybatis.dynamic.sql.SqlTable;
2321
import org.mybatis.dynamic.sql.TableExpressionVisitor;
22+
import org.mybatis.dynamic.sql.render.RendererFactory;
2423
import org.mybatis.dynamic.sql.render.RenderingContext;
2524
import org.mybatis.dynamic.sql.select.SubQuery;
2625
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
@@ -39,14 +38,11 @@ public FragmentAndParameters visit(SqlTable table) {
3938

4039
@Override
4140
public FragmentAndParameters visit(SubQuery subQuery) {
42-
return subQuery.selectModel().renderSubQuery(renderingContext)
43-
.mapFragment(f -> applyAlias("(" + f + ")", subQuery)); //$NON-NLS-1$ //$NON-NLS-2$
44-
}
41+
String suffix = subQuery.alias().map(a -> ") " + a) //$NON-NLS-1$
42+
.orElse(")"); //$NON-NLS-1$
4543

46-
private String applyAlias(String fragment, SubQuery subQuery) {
47-
return subQuery.alias()
48-
.map(a -> fragment + spaceBefore(a))
49-
.orElse(fragment);
44+
return RendererFactory.createSubQueryRenderer(subQuery.selectModel(), "(", suffix) //$NON-NLS-1$
45+
.render(renderingContext);
5046
}
5147

5248
public static class Builder {

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.Optional;
2020

2121
import org.mybatis.dynamic.sql.render.RenderedParameterInfo;
22+
import org.mybatis.dynamic.sql.render.RendererFactory;
2223
import org.mybatis.dynamic.sql.render.RenderingContext;
2324
import org.mybatis.dynamic.sql.util.AbstractColumnMapping;
2425
import org.mybatis.dynamic.sql.util.ColumnToColumnMapping;
@@ -83,9 +84,12 @@ public <T> Optional<FragmentAndParameters> visit(ValueWhenPresentMapping<T> mapp
8384

8485
@Override
8586
public Optional<FragmentAndParameters> visit(SelectMapping mapping) {
86-
return Optional.of(mapping.selectModel().renderSubQuery(renderingContext)
87-
.mapFragment(f -> renderingContext.aliasedColumnName(mapping.column())
88-
+ " = (" + f + ")")); //$NON-NLS-1$ //$NON-NLS-2$
87+
FragmentAndParameters fragmentAndParameters = RendererFactory.createSubQueryRenderer(mapping.selectModel(),
88+
renderingContext.aliasedColumnName(mapping.column()) + " = (", //$NON-NLS-1$
89+
")") //$NON-NLS-1$
90+
.render(renderingContext);
91+
92+
return Optional.of(fragmentAndParameters);
8993
}
9094

9195
@Override

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.mybatis.dynamic.sql.NotCriterion;
3030
import org.mybatis.dynamic.sql.SqlCriterion;
3131
import org.mybatis.dynamic.sql.SqlCriterionVisitor;
32+
import org.mybatis.dynamic.sql.render.RendererFactory;
3233
import org.mybatis.dynamic.sql.render.RenderingContext;
3334
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
3435
import org.mybatis.dynamic.sql.util.FragmentCollector;
@@ -118,9 +119,10 @@ private <T> Optional<FragmentAndParameters> renderColumnAndCondition(ColumnAndCo
118119

119120
private FragmentAndParameters renderExists(ExistsCriterion criterion) {
120121
ExistsPredicate existsPredicate = criterion.existsPredicate();
121-
122-
return existsPredicate.selectModelBuilder().build().renderSubQuery(renderingContext)
123-
.mapFragment(f -> existsPredicate.operator() + " (" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$
122+
return RendererFactory.createSubQueryRenderer(existsPredicate.selectModelBuilder().build(),
123+
existsPredicate.operator() + " (", //$NON-NLS-1$
124+
")") //$NON-NLS-1$
125+
.render(renderingContext);
124126
}
125127

126128
private List<RenderedCriterion> renderSubCriteria(List<AndOrCriteriaGroup> subCriteria) {

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.mybatis.dynamic.sql.BindableColumn;
3030
import org.mybatis.dynamic.sql.ConditionVisitor;
3131
import org.mybatis.dynamic.sql.render.RenderedParameterInfo;
32+
import org.mybatis.dynamic.sql.render.RendererFactory;
3233
import org.mybatis.dynamic.sql.render.RenderingContext;
3334
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
3435
import org.mybatis.dynamic.sql.util.FragmentCollector;
@@ -94,8 +95,10 @@ public FragmentAndParameters visit(AbstractTwoValueCondition<T> condition) {
9495

9596
@Override
9697
public FragmentAndParameters visit(AbstractSubselectCondition<T> condition) {
97-
return condition.selectModel().renderSubQuery(renderingContext)
98-
.mapFragment(f -> condition.operator() + " (" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$
98+
return RendererFactory.createSubQueryRenderer(condition.selectModel(),
99+
condition.operator() + " (", //$NON-NLS-1$
100+
")") //$NON-NLS-1$
101+
.render(renderingContext);
99102
}
100103

101104
@Override

0 commit comments

Comments
 (0)