Skip to content

Commit 000be1f

Browse files
committed
Add Update Renderer Visitor
1 parent e2c79fe commit 000be1f

File tree

4 files changed

+92
-7
lines changed

4 files changed

+92
-7
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
4343
import org.mybatis.dynamic.sql.update.UpdateModel;
4444
import org.mybatis.dynamic.sql.update.render.UpdateRenderer;
45+
import org.mybatis.dynamic.sql.update.render.UpdateRendererVisitor;
4546
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
4647

4748
public interface RendererFactory {
@@ -116,10 +117,11 @@ static Renderer<RenderingContext, SelectStatementProvider> createSelectRenderer(
116117
}
117118

118119
static Renderer<RenderingStrategy, UpdateStatementProvider> createUpdateRenderer(
119-
UpdateModel updateModel, StatementConfiguration statementConfiguration) {
120+
UpdateModel updateModel, StatementConfiguration statementConfiguration, UpdateRendererVisitor visitor) {
120121
return renderingStrategy -> UpdateRenderer.withUpdateModel(updateModel)
121122
.withStatementConfiguration(statementConfiguration)
122123
.withRenderingStrategy(renderingStrategy)
124+
.withVisitor(visitor)
123125
.build()
124126
.render();
125127
}

src/main/java/org/mybatis/dynamic/sql/update/UpdateModel.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.mybatis.dynamic.sql.configuration.StatementConfiguration;
2929
import org.mybatis.dynamic.sql.render.RendererFactory;
3030
import org.mybatis.dynamic.sql.render.RenderingStrategy;
31+
import org.mybatis.dynamic.sql.update.render.UpdateRendererVisitor;
3132
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
3233
import org.mybatis.dynamic.sql.util.AbstractColumnMapping;
3334
import org.mybatis.dynamic.sql.util.Validator;
@@ -79,7 +80,12 @@ public Optional<OrderByModel> orderByModel() {
7980

8081
@NotNull
8182
public UpdateStatementProvider render(RenderingStrategy renderingStrategy) {
82-
return RendererFactory.createUpdateRenderer(this, statementConfiguration)
83+
return render(renderingStrategy, UpdateRendererVisitor.NOOP);
84+
}
85+
86+
@NotNull
87+
public UpdateStatementProvider render(RenderingStrategy renderingStrategy, UpdateRendererVisitor visitor) {
88+
return RendererFactory.createUpdateRenderer(this, statementConfiguration, visitor)
8389
.render(renderingStrategy);
8490
}
8591

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

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public class UpdateRenderer {
3838
private final UpdateModel updateModel;
3939
private final RenderingContext renderingContext;
4040
private final SetPhraseVisitor visitor;
41+
private final UpdateRendererVisitor updateRendererVisitor;
4142

4243
private UpdateRenderer(Builder builder) {
4344
updateModel = Objects.requireNonNull(builder.updateModel);
@@ -50,16 +51,19 @@ private UpdateRenderer(Builder builder) {
5051
.withStatementConfiguration(builder.statementConfiguration)
5152
.build();
5253
visitor = new SetPhraseVisitor(renderingContext);
54+
updateRendererVisitor = Objects.requireNonNull(builder.visitor);
5355
}
5456

5557
public UpdateStatementProvider render() {
5658
FragmentCollector fragmentCollector = new FragmentCollector();
5759

5860
fragmentCollector.add(calculateUpdateStatementStart());
61+
fragmentCollector.add(calculateTableName());
5962
fragmentCollector.add(calculateSetPhrase());
6063
calculateWhereClause().ifPresent(fragmentCollector::add);
6164
calculateOrderByClause().ifPresent(fragmentCollector::add);
6265
calculateLimitClause().ifPresent(fragmentCollector::add);
66+
updateRendererVisitor.visitStatementEnd(renderingContext).ifPresent(fragmentCollector::add);
6367

6468
return toUpdateStatementProvider(fragmentCollector);
6569
}
@@ -72,8 +76,13 @@ private UpdateStatementProvider toUpdateStatementProvider(FragmentCollector frag
7276
}
7377

7478
private FragmentAndParameters calculateUpdateStatementStart() {
79+
return updateRendererVisitor.visitStatementStart(FragmentAndParameters.fromFragment("update"), //$NON-NLS-1$
80+
renderingContext);
81+
}
82+
83+
private FragmentAndParameters calculateTableName() {
7584
String aliasedTableName = renderingContext.aliasedTableName(updateModel.table());
76-
return FragmentAndParameters.fromFragment("update " + aliasedTableName); //$NON-NLS-1$
85+
return updateRendererVisitor.visitTable(FragmentAndParameters.fromFragment(aliasedTableName), renderingContext);
7786
}
7887

7988
private FragmentAndParameters calculateSetPhrase() {
@@ -88,7 +97,7 @@ private FragmentAndParameters calculateSetPhrase() {
8897
.flatMap(Optional::stream)
8998
.collect(FragmentCollector.collect());
9099

91-
return toSetPhrase(fragmentCollector);
100+
return updateRendererVisitor.visitSetClause(toSetPhrase(fragmentCollector), renderingContext);
92101
}
93102

94103
private FragmentAndParameters toSetPhrase(FragmentCollector fragmentCollector) {
@@ -97,15 +106,17 @@ private FragmentAndParameters toSetPhrase(FragmentCollector fragmentCollector) {
97106
}
98107

99108
private Optional<FragmentAndParameters> calculateWhereClause() {
100-
return updateModel.whereModel().flatMap(this::renderWhereClause);
109+
return updateModel.whereModel().flatMap(this::renderWhereClause)
110+
.map(fp -> updateRendererVisitor.visitWhereClause(fp, renderingContext));
101111
}
102112

103113
private Optional<FragmentAndParameters> renderWhereClause(EmbeddedWhereModel whereModel) {
104114
return whereModel.render(renderingContext);
105115
}
106116

107117
private Optional<FragmentAndParameters> calculateLimitClause() {
108-
return updateModel.limit().map(this::renderLimitClause);
118+
return updateModel.limit().map(this::renderLimitClause)
119+
.map(fp -> updateRendererVisitor.visitLimitClause(fp, renderingContext));
109120
}
110121

111122
private FragmentAndParameters renderLimitClause(Long limit) {
@@ -117,7 +128,8 @@ private FragmentAndParameters renderLimitClause(Long limit) {
117128
}
118129

119130
private Optional<FragmentAndParameters> calculateOrderByClause() {
120-
return updateModel.orderByModel().map(this::renderOrderByClause);
131+
return updateModel.orderByModel().map(this::renderOrderByClause)
132+
.map(fp -> updateRendererVisitor.visitOrderByClause(fp, renderingContext));
121133
}
122134

123135
private FragmentAndParameters renderOrderByClause(OrderByModel orderByModel) {
@@ -132,6 +144,7 @@ public static class Builder {
132144
private UpdateModel updateModel;
133145
private RenderingStrategy renderingStrategy;
134146
private StatementConfiguration statementConfiguration;
147+
private UpdateRendererVisitor visitor;
135148

136149
public Builder withUpdateModel(UpdateModel updateModel) {
137150
this.updateModel = updateModel;
@@ -148,6 +161,11 @@ public Builder withStatementConfiguration(StatementConfiguration statementConfig
148161
return this;
149162
}
150163

164+
public Builder withVisitor(UpdateRendererVisitor visitor) {
165+
this.visitor = visitor;
166+
return this;
167+
}
168+
151169
public UpdateRenderer build() {
152170
return new UpdateRenderer(this);
153171
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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.update.render;
17+
18+
import org.mybatis.dynamic.sql.render.RenderingContext;
19+
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
20+
21+
import java.util.Optional;
22+
23+
public interface UpdateRendererVisitor {
24+
UpdateRendererVisitor NOOP = new UpdateRendererVisitor() {};
25+
26+
default FragmentAndParameters visitStatementStart(FragmentAndParameters fragmentAndParameters,
27+
RenderingContext renderingContext) {
28+
return fragmentAndParameters;
29+
}
30+
31+
default FragmentAndParameters visitTable(FragmentAndParameters fragmentAndParameters,
32+
RenderingContext renderingContext) {
33+
return fragmentAndParameters;
34+
}
35+
36+
default FragmentAndParameters visitSetClause(FragmentAndParameters fragmentAndParameters,
37+
RenderingContext renderingContext) {
38+
return fragmentAndParameters;
39+
}
40+
41+
default FragmentAndParameters visitWhereClause(FragmentAndParameters fragmentAndParameters,
42+
RenderingContext renderingContext) {
43+
return fragmentAndParameters;
44+
}
45+
46+
default FragmentAndParameters visitOrderByClause(FragmentAndParameters fragmentAndParameters,
47+
RenderingContext renderingContext) {
48+
return fragmentAndParameters;
49+
}
50+
51+
default FragmentAndParameters visitLimitClause(FragmentAndParameters fragmentAndParameters,
52+
RenderingContext renderingContext) {
53+
return fragmentAndParameters;
54+
}
55+
56+
default Optional<FragmentAndParameters> visitStatementEnd(RenderingContext renderingContext) {
57+
return Optional.empty();
58+
}
59+
}

0 commit comments

Comments
 (0)