Skip to content

Commit 7c2a1f5

Browse files
committed
Update the visitor to be more functional
Also, create a better class for intermediate results
1 parent 0bdc565 commit 7c2a1f5

13 files changed

+142
-130
lines changed

src/main/java/org/mybatis/dynamic/sql/AbstractListValueCondition.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ public T transformValue(T value) {
4646
}
4747

4848
@Override
49-
public void accept(ConditionVisitor<T> visitor) {
50-
visitor.visit(this);
49+
public <R> R accept(ConditionVisitor<T, R> visitor) {
50+
return visitor.visit(this);
5151
}
5252

5353
@Override

src/main/java/org/mybatis/dynamic/sql/AbstractNoValueCondition.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
public abstract class AbstractNoValueCondition <T> implements Condition<T> {
1919

2020
@Override
21-
public void accept(ConditionVisitor<T> visitor) {
22-
visitor.visit(this);
21+
public <R> R accept(ConditionVisitor<T, R> visitor) {
22+
return visitor.visit(this);
2323
}
2424

2525
@Override

src/main/java/org/mybatis/dynamic/sql/AbstractSingleValueCondition.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ public T value() {
2727
}
2828

2929
@Override
30-
public void accept(ConditionVisitor<T> visitor) {
31-
visitor.visit(this);
30+
public <R> R accept(ConditionVisitor<T, R> visitor) {
31+
return visitor.visit(this);
3232
}
3333

3434
@Override

src/main/java/org/mybatis/dynamic/sql/AbstractTwoValueCondition.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ public T value2() {
3333
}
3434

3535
@Override
36-
public void accept(ConditionVisitor<T> visitor) {
37-
visitor.visit(this);
36+
public <R> R accept(ConditionVisitor<T, R> visitor) {
37+
return visitor.visit(this);
3838
}
3939

4040
@Override

src/main/java/org/mybatis/dynamic/sql/Condition.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@
1616
package org.mybatis.dynamic.sql;
1717

1818
public interface Condition<T> {
19-
void accept(ConditionVisitor<T> visitor);
19+
<R> R accept(ConditionVisitor<T, R> visitor);
2020
int valueCount();
2121
}

src/main/java/org/mybatis/dynamic/sql/ConditionVisitor.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
*/
1616
package org.mybatis.dynamic.sql;
1717

18-
public interface ConditionVisitor<T> {
19-
void visit(AbstractNoValueCondition<T> condition);
20-
void visit(AbstractSingleValueCondition<T> condition);
21-
void visit(AbstractTwoValueCondition<T> condition);
22-
void visit(AbstractListValueCondition<T> condition);
18+
public interface ConditionVisitor<T, R> {
19+
R visit(AbstractNoValueCondition<T> condition);
20+
R visit(AbstractSingleValueCondition<T> condition);
21+
R visit(AbstractTwoValueCondition<T> condition);
22+
R visit(AbstractListValueCondition<T> condition);
2323
}

src/main/java/org/mybatis/dynamic/sql/where/AbstractWhereBuilder.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import org.mybatis.dynamic.sql.SqlColumn;
2929
import org.mybatis.dynamic.sql.SqlCriterion;
3030
import org.mybatis.dynamic.sql.where.render.CriterionRenderer;
31-
import org.mybatis.dynamic.sql.where.render.RenderedCriterion;
31+
import org.mybatis.dynamic.sql.where.render.FragmentAndParameters;
3232

3333
public abstract class AbstractWhereBuilder<T extends AbstractWhereBuilder<T>> {
3434
private List<CriterionWrapper> criteria = new ArrayList<>();
@@ -88,10 +88,10 @@ static class WhereCollectorSupport {
8888
}
8989

9090
void add(CriterionWrapper criterionWrapper) {
91-
RenderedCriterion rc = CriterionRenderer.of(criterionWrapper.criterion, criterionWrapper.sequence, nameFunction)
91+
FragmentAndParameters rc = CriterionRenderer.of(criterionWrapper.criterion, criterionWrapper.sequence, nameFunction)
9292
.render();
93-
phrases.add(rc.whereClauseFragment());
94-
parameters.putAll(rc.fragmentParameters());
93+
phrases.add(rc.fragment());
94+
parameters.putAll(rc.parameters());
9595
}
9696

9797
WhereCollectorSupport merge(WhereCollectorSupport other) {

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

+20-24
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package org.mybatis.dynamic.sql.where.render;
1717

1818
import java.util.ArrayList;
19-
import java.util.Collections;
2019
import java.util.HashMap;
2120
import java.util.List;
2221
import java.util.Map;
@@ -30,12 +29,10 @@
3029
import org.mybatis.dynamic.sql.ConditionVisitor;
3130
import org.mybatis.dynamic.sql.SqlColumn;
3231

33-
public class ConditionRenderer<T> implements ConditionVisitor<T> {
32+
public class ConditionRenderer<T> implements ConditionVisitor<T, FragmentAndParameters> {
3433

3534
private static final String PARAMETERS_PREFIX = "parameters"; //$NON-NLS-1$
3635

37-
private StringBuilder buffer = new StringBuilder();
38-
private Map<String, Object> parameters = new HashMap<>();
3936
private AtomicInteger sequence;
4037
private SqlColumn<?> column;
4138
private Function<SqlColumn<?>, String> nameFunction;
@@ -46,48 +43,47 @@ private ConditionRenderer(AtomicInteger sequence, SqlColumn<?> column, Function<
4643
this.nameFunction = nameFunction;
4744
}
4845

49-
public String fragment() {
50-
return buffer.toString();
51-
}
52-
53-
public Map<String, Object> parameters() {
54-
return Collections.unmodifiableMap(parameters);
55-
}
56-
5746
@Override
58-
public void visit(AbstractNoValueCondition<T> condition) {
59-
buffer.append(condition.render(calculateColumnName()));
47+
public FragmentAndParameters visit(AbstractNoValueCondition<T> condition) {
48+
return new FragmentAndParameters.Builder(condition.render(calculateColumnName())).build();
6049
}
6150

6251
@Override
63-
public void visit(AbstractSingleValueCondition<T> condition) {
52+
public FragmentAndParameters visit(AbstractSingleValueCondition<T> condition) {
6453
String mapKey = formatParameterMapKey(sequence.getAndIncrement());
65-
buffer.append(condition.render(calculateColumnName(), column.getFormattedJdbcPlaceholder(PARAMETERS_PREFIX, mapKey)));
66-
parameters.put(mapKey, condition.value());
54+
return new FragmentAndParameters.Builder(condition.render(calculateColumnName(), column.getFormattedJdbcPlaceholder(PARAMETERS_PREFIX, mapKey)))
55+
.withParameter(mapKey, condition.value())
56+
.build();
6757
}
6858

6959
@Override
70-
public void visit(AbstractTwoValueCondition<T> condition) {
60+
public FragmentAndParameters visit(AbstractTwoValueCondition<T> condition) {
7161
String mapKey1 = formatParameterMapKey(sequence.getAndIncrement());
7262
String mapKey2 = formatParameterMapKey(sequence.getAndIncrement());
73-
buffer.append(condition.render(calculateColumnName(),
63+
String fragment = condition.render(calculateColumnName(),
7464
column.getFormattedJdbcPlaceholder(PARAMETERS_PREFIX, mapKey1),
75-
column.getFormattedJdbcPlaceholder(PARAMETERS_PREFIX, mapKey2)));
76-
parameters.put(mapKey1, condition.value1());
77-
parameters.put(mapKey2, condition.value2());
65+
column.getFormattedJdbcPlaceholder(PARAMETERS_PREFIX, mapKey2));
66+
67+
return new FragmentAndParameters.Builder(fragment)
68+
.withParameter(mapKey1, condition.value1())
69+
.withParameter(mapKey2, condition.value2())
70+
.build();
7871
}
7972

8073
@Override
81-
public void visit(AbstractListValueCondition<T> condition) {
74+
public FragmentAndParameters visit(AbstractListValueCondition<T> condition) {
8275
List<String> placeholders = new ArrayList<>();
76+
Map<String, Object> parameters = new HashMap<>();
8377

8478
condition.values().forEach(v -> {
8579
String mapKey = formatParameterMapKey(sequence.getAndIncrement());
8680
placeholders.add(column.getFormattedJdbcPlaceholder(PARAMETERS_PREFIX, mapKey));
8781
parameters.put(mapKey, v);
8882
});
8983

90-
buffer.append(condition.render(calculateColumnName(), placeholders.stream()));
84+
return new FragmentAndParameters.Builder(condition.render(calculateColumnName(), placeholders.stream()))
85+
.withParameters(parameters)
86+
.build();
9187
}
9288

9389
private String formatParameterMapKey(int number) {

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

+10-8
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ protected CriterionRenderer(SqlCriterion<T> criterion, AtomicInteger sequence, F
3636
this.nameFunction = nameFunction;
3737
}
3838

39-
public RenderedCriterion render() {
39+
public FragmentAndParameters render() {
4040
buffer.append(' ');
4141

4242
renderConnector();
@@ -49,7 +49,9 @@ public RenderedCriterion render() {
4949
renderCriteria();
5050
}
5151

52-
return RenderedCriterion.of(buffer.toString(), parameters);
52+
return new FragmentAndParameters.Builder(buffer.toString())
53+
.withParameters(parameters)
54+
.build();
5355
}
5456

5557
private void renderConnector() {
@@ -66,15 +68,15 @@ private void renderCriteria() {
6668

6769
private void renderCondition() {
6870
ConditionRenderer<T> visitor = ConditionRenderer.of(sequence, criterion.column(), nameFunction);
69-
criterion.condition().accept(visitor);
70-
buffer.append(visitor.fragment());
71-
parameters.putAll(visitor.parameters());
71+
FragmentAndParameters fp = criterion.condition().accept(visitor);
72+
buffer.append(fp.fragment());
73+
parameters.putAll(fp.parameters());
7274
}
7375

7476
private void handleSubCriterion(SqlCriterion<?> subCriterion) {
75-
RenderedCriterion rc = new CriterionRenderer<>(subCriterion, sequence, nameFunction).render();
76-
buffer.append(rc.whereClauseFragment());
77-
parameters.putAll(rc.fragmentParameters());
77+
FragmentAndParameters rc = new CriterionRenderer<>(subCriterion, sequence, nameFunction).render();
78+
buffer.append(rc.fragment());
79+
parameters.putAll(rc.parameters());
7880
}
7981

8082
public static <T> CriterionRenderer<T> of(SqlCriterion<T> criterion, AtomicInteger sequence, Function<SqlColumn<?>, String> nameFunction) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/**
2+
* Copyright 2016-2017 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+
* http://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 java.util.HashMap;
19+
import java.util.Map;
20+
21+
public class FragmentAndParameters {
22+
23+
private String fragment;
24+
private Map<String, Object> parameters = new HashMap<>();
25+
26+
private FragmentAndParameters() {
27+
super();
28+
}
29+
30+
public String fragment() {
31+
return fragment;
32+
}
33+
34+
public Map<String, Object> parameters() {
35+
return parameters;
36+
}
37+
38+
public static class Builder {
39+
private FragmentAndParameters fragmentAndParameters = new FragmentAndParameters();
40+
41+
public Builder(String fragment) {
42+
fragmentAndParameters.fragment = fragment;
43+
}
44+
45+
public Builder withParameter(String key, Object value) {
46+
fragmentAndParameters.parameters.put(key, value);
47+
return this;
48+
}
49+
50+
public Builder withParameters(Map<String, Object> parameters) {
51+
fragmentAndParameters.parameters.putAll(parameters);
52+
return this;
53+
}
54+
55+
public FragmentAndParameters build() {
56+
return fragmentAndParameters;
57+
}
58+
}
59+
}

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

-43
This file was deleted.

0 commit comments

Comments
 (0)