Skip to content

Commit 9812701

Browse files
committed
ConditionVisitor should render only the condition
Previously the visitor rendered both the column and the condition, but this won't work for simple case statements. We need to be able to render only the condition for simple case statements.
1 parent 3109ed6 commit 9812701

File tree

4 files changed

+97
-34
lines changed

4 files changed

+97
-34
lines changed

src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import org.mybatis.dynamic.sql.select.function.AbstractUniTypeFunction;
2424
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2525
import org.mybatis.dynamic.sql.util.Validator;
26-
import org.mybatis.dynamic.sql.where.render.DefaultConditionVisitor;
26+
import org.mybatis.dynamic.sql.where.render.ColumnAndConditionRenderer;
2727

2828
public class Sum<T> extends AbstractUniTypeFunction<T, Sum<T>> {
2929
private final Function<RenderingContext, FragmentAndParameters> renderer;
@@ -38,12 +38,13 @@ private Sum(BindableColumn<T> column, VisitableCondition<T> condition) {
3838
renderer = rc -> {
3939
Validator.assertTrue(condition.shouldRender(rc), "ERROR.37", "sum"); //$NON-NLS-1$ //$NON-NLS-2$
4040

41-
DefaultConditionVisitor<T> visitor = new DefaultConditionVisitor.Builder<T>()
41+
return new ColumnAndConditionRenderer.Builder<T>()
4242
.withColumn(column)
43+
.withCondition(condition)
4344
.withRenderingContext(rc)
44-
.build();
45-
46-
return condition.accept(visitor).mapFragment(this::applyAggregate);
45+
.build()
46+
.render()
47+
.mapFragment(this::applyAggregate);
4748
};
4849
}
4950

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
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.where.render;
17+
18+
import static org.mybatis.dynamic.sql.util.StringUtilities.spaceBefore;
19+
20+
import java.util.Objects;
21+
22+
import org.mybatis.dynamic.sql.BindableColumn;
23+
import org.mybatis.dynamic.sql.VisitableCondition;
24+
import org.mybatis.dynamic.sql.render.RenderingContext;
25+
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
26+
27+
public class ColumnAndConditionRenderer<T> {
28+
private final BindableColumn<T> column;
29+
private final VisitableCondition<T> condition;
30+
private final RenderingContext renderingContext;
31+
32+
private ColumnAndConditionRenderer(Builder<T> builder) {
33+
column = Objects.requireNonNull(builder.column);
34+
condition = Objects.requireNonNull(builder.condition);
35+
renderingContext = Objects.requireNonNull(builder.renderingContext);
36+
}
37+
38+
public FragmentAndParameters render() {
39+
FragmentAndParameters renderedLeftColumn = column.render(renderingContext);
40+
41+
DefaultConditionVisitor<T> visitor = DefaultConditionVisitor.withColumn(column)
42+
.withRenderingContext(renderingContext)
43+
.build();
44+
45+
FragmentAndParameters renderedCondition = condition.accept(visitor);
46+
47+
String finalFragment = condition.overrideRenderedLeftColumn(renderedLeftColumn.fragment())
48+
+ spaceBefore(renderedCondition.fragment());
49+
50+
return FragmentAndParameters.withFragment(finalFragment)
51+
.withParameters(renderedLeftColumn.parameters())
52+
.withParameters(renderedCondition.parameters())
53+
.build();
54+
}
55+
56+
public static class Builder<T> {
57+
private BindableColumn<T> column;
58+
private VisitableCondition<T> condition;
59+
private RenderingContext renderingContext;
60+
61+
public Builder<T> withColumn(BindableColumn<T> column) {
62+
this.column = column;
63+
return this;
64+
}
65+
66+
public Builder<T> withCondition(VisitableCondition<T> condition) {
67+
this.condition = condition;
68+
return this;
69+
}
70+
71+
public Builder<T> withRenderingContext(RenderingContext renderingContext) {
72+
this.renderingContext = renderingContext;
73+
return this;
74+
}
75+
76+
public ColumnAndConditionRenderer<T> build() {
77+
return new ColumnAndConditionRenderer<>(this);
78+
}
79+
}
80+
}

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
@@ -175,10 +175,12 @@ private Optional<RenderedCriterion> calculateRenderedCriterion(List<RenderedCrit
175175
}
176176

177177
private <T> FragmentAndParameters renderCondition(ColumnAndConditionCriterion<T> criterion) {
178-
DefaultConditionVisitor<T> visitor = DefaultConditionVisitor.withColumn(criterion.column())
178+
return new ColumnAndConditionRenderer.Builder<T>()
179+
.withColumn(criterion.column())
180+
.withCondition(criterion.condition())
179181
.withRenderingContext(renderingContext)
180-
.build();
181-
return criterion.condition().accept(visitor);
182+
.build()
183+
.render();
182184
}
183185

184186
/**

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

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -47,94 +47,74 @@ private DefaultConditionVisitor(Builder<T> builder) {
4747

4848
@Override
4949
public FragmentAndParameters visit(AbstractListValueCondition<T> condition) {
50-
FragmentAndParameters renderedLeftColumn = column.render(renderingContext);
5150
FragmentCollector fc = condition.mapValues(this::toFragmentAndParameters).collect(FragmentCollector.collect());
5251

5352
String joinedFragments =
5453
fc.collectFragments(Collectors.joining(",", "(", ")")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
55-
String finalFragment = condition.overrideRenderedLeftColumn(renderedLeftColumn.fragment())
56-
+ spaceBefore(condition.operator())
54+
String finalFragment = condition.operator()
5755
+ spaceBefore(joinedFragments);
5856

5957
return FragmentAndParameters
6058
.withFragment(finalFragment)
6159
.withParameters(fc.parameters())
62-
.withParameters(renderedLeftColumn.parameters())
6360
.build();
6461
}
6562

6663
@Override
6764
public FragmentAndParameters visit(AbstractNoValueCondition<T> condition) {
68-
FragmentAndParameters renderedLeftColumn = column.render(renderingContext);
69-
String finalFragment = condition.overrideRenderedLeftColumn(renderedLeftColumn.fragment())
70-
+ spaceBefore(condition.operator());
71-
return FragmentAndParameters.withFragment(finalFragment)
72-
.withParameters(renderedLeftColumn.parameters())
73-
.build();
65+
return FragmentAndParameters.fromFragment(condition.operator());
7466
}
7567

7668
@Override
7769
public FragmentAndParameters visit(AbstractSingleValueCondition<T> condition) {
78-
FragmentAndParameters renderedLeftColumn = column.render(renderingContext);
7970
RenderedParameterInfo parameterInfo = renderingContext.calculateParameterInfo(column);
80-
String finalFragment = condition.overrideRenderedLeftColumn(renderedLeftColumn.fragment())
81-
+ spaceBefore(condition.operator())
71+
String finalFragment = condition.operator()
8272
+ spaceBefore(parameterInfo.renderedPlaceHolder());
8373

8474
return FragmentAndParameters.withFragment(finalFragment)
8575
.withParameter(parameterInfo.parameterMapKey(), convertValue(condition.value()))
86-
.withParameters(renderedLeftColumn.parameters())
8776
.build();
8877
}
8978

9079
@Override
9180
public FragmentAndParameters visit(AbstractTwoValueCondition<T> condition) {
92-
FragmentAndParameters renderedLeftColumn = column.render(renderingContext);
9381
RenderedParameterInfo parameterInfo1 = renderingContext.calculateParameterInfo(column);
9482
RenderedParameterInfo parameterInfo2 = renderingContext.calculateParameterInfo(column);
9583

96-
String finalFragment = condition.overrideRenderedLeftColumn(renderedLeftColumn.fragment())
97-
+ spaceBefore(condition.operator1())
84+
String finalFragment = condition.operator1()
9885
+ spaceBefore(parameterInfo1.renderedPlaceHolder())
9986
+ spaceBefore(condition.operator2())
10087
+ spaceBefore(parameterInfo2.renderedPlaceHolder());
10188

10289
return FragmentAndParameters.withFragment(finalFragment)
10390
.withParameter(parameterInfo1.parameterMapKey(), convertValue(condition.value1()))
10491
.withParameter(parameterInfo2.parameterMapKey(), convertValue(condition.value2()))
105-
.withParameters(renderedLeftColumn.parameters())
10692
.build();
10793
}
10894

10995
@Override
11096
public FragmentAndParameters visit(AbstractSubselectCondition<T> condition) {
111-
FragmentAndParameters renderedLeftColumn = column.render(renderingContext);
11297
SelectStatementProvider selectStatement = SelectRenderer.withSelectModel(condition.selectModel())
11398
.withRenderingContext(renderingContext)
11499
.build()
115100
.render();
116101

117-
String finalFragment = condition.overrideRenderedLeftColumn(renderedLeftColumn.fragment())
118-
+ spaceBefore(condition.operator())
102+
String finalFragment = condition.operator()
119103
+ " (" //$NON-NLS-1$
120104
+ selectStatement.getSelectStatement()
121105
+ ")"; //$NON-NLS-1$
122106

123107
return FragmentAndParameters.withFragment(finalFragment)
124108
.withParameters(selectStatement.getParameters())
125-
.withParameters(renderedLeftColumn.parameters())
126109
.build();
127110
}
128111

129112
@Override
130113
public FragmentAndParameters visit(AbstractColumnComparisonCondition<T> condition) {
131-
FragmentAndParameters renderedLeftColumn = column.render(renderingContext);
132114
FragmentAndParameters renderedRightColumn = condition.rightColumn().render(renderingContext);
133-
String finalFragment = condition.overrideRenderedLeftColumn(renderedLeftColumn.fragment())
134-
+ spaceBefore(condition.operator())
115+
String finalFragment = condition.operator()
135116
+ spaceBefore(renderedRightColumn.fragment());
136117
return FragmentAndParameters.withFragment(finalFragment)
137-
.withParameters(renderedLeftColumn.parameters())
138118
.withParameters(renderedRightColumn.parameters())
139119
.build();
140120
}

0 commit comments

Comments
 (0)