Skip to content

Commit e554be6

Browse files
committed
Move list rendering decision fully withing the list condition
This also removes some Optional silliness from the visitor
1 parent 55dbed9 commit e554be6

File tree

4 files changed

+21
-29
lines changed

4 files changed

+21
-29
lines changed

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
public abstract class AbstractListValueCondition<T> implements VisitableCondition<T> {
2626
protected Collection<T> values;
2727
protected UnaryOperator<Stream<T>> valueStreamTransformer;
28-
protected boolean skipRenderingWhenEmpty = true;
28+
protected boolean renderWhenEmpty = false;
2929

3030
protected AbstractListValueCondition(Collection<T> values) {
3131
this(values, UnaryOperator.identity());
@@ -40,15 +40,16 @@ public final <R> Stream<R> mapValues(Function<T, R> mapper) {
4040
return valueStreamTransformer.apply(values.stream()).map(mapper);
4141
}
4242

43-
public boolean skipRenderingWhenEmpty() {
44-
return skipRenderingWhenEmpty;
43+
@Override
44+
public boolean shouldRender() {
45+
return !values.isEmpty() || renderWhenEmpty;
4546
}
46-
47+
4748
/**
4849
* Use with caution - this could cause the library to render invalid SQL like "where column in ()".
4950
*/
5051
protected void forceRenderingWhenEmpty() {
51-
skipRenderingWhenEmpty = false;
52+
renderWhenEmpty = true;
5253
}
5354

5455
@Override

src/main/java/org/mybatis/dynamic/sql/util/FragmentCollector.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,6 @@ public boolean hasMultipleFragments() {
5757
return fragments.size() > 1;
5858
}
5959

60-
public boolean isEmpty() {
61-
return fragments.isEmpty();
62-
}
63-
6460
public static Collector<FragmentAndParameters, FragmentCollector, FragmentCollector> collect() {
6561
return Collector.of(FragmentCollector::new,
6662
FragmentCollector::add,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Copyright 2016-2018 the original author or authors.
2+
* Copyright 2016-2020 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -77,7 +77,7 @@ private Optional<FragmentAndParameters> renderCondition() {
7777
.withTableAliasCalculator(tableAliasCalculator)
7878
.withParameterName(parameterName)
7979
.build();
80-
return sqlCriterion.condition().accept(visitor);
80+
return Optional.of(sqlCriterion.condition().accept(visitor));
8181
}
8282

8383
public static <T> Builder<T> withCriterion(SqlCriterion<T> sqlCriterion) {

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

Lines changed: 13 additions & 18 deletions
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.Objects;
19-
import java.util.Optional;
2019
import java.util.concurrent.atomic.AtomicInteger;
2120

2221
import org.mybatis.dynamic.sql.AbstractColumnComparisonCondition;
@@ -34,7 +33,7 @@
3433
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
3534
import org.mybatis.dynamic.sql.util.FragmentCollector;
3635

37-
public class WhereConditionVisitor<T> implements ConditionVisitor<T, Optional<FragmentAndParameters>> {
36+
public class WhereConditionVisitor<T> implements ConditionVisitor<T, FragmentAndParameters> {
3837

3938
private RenderingStrategy renderingStrategy;
4039
private AtomicInteger sequence;
@@ -51,38 +50,34 @@ private WhereConditionVisitor(Builder<T> builder) {
5150
}
5251

5352
@Override
54-
public Optional<FragmentAndParameters> visit(AbstractListValueCondition<T> condition) {
53+
public FragmentAndParameters visit(AbstractListValueCondition<T> condition) {
5554
FragmentCollector fc = condition.mapValues(this::toFragmentAndParameters)
5655
.collect(FragmentCollector.collect());
5756

58-
if (fc.isEmpty() && condition.skipRenderingWhenEmpty()) {
59-
return Optional.empty();
60-
}
61-
6257
return FragmentAndParameters.withFragment(condition.renderCondition(columnName(), fc.fragments()))
6358
.withParameters(fc.parameters())
64-
.buildOptional();
59+
.build();
6560
}
6661

6762
@Override
68-
public Optional<FragmentAndParameters> visit(AbstractNoValueCondition<T> condition) {
63+
public FragmentAndParameters visit(AbstractNoValueCondition<T> condition) {
6964
return FragmentAndParameters.withFragment(condition.renderCondition(columnName()))
70-
.buildOptional();
65+
.build();
7166
}
7267

7368
@Override
74-
public Optional<FragmentAndParameters> visit(AbstractSingleValueCondition<T> condition) {
69+
public FragmentAndParameters visit(AbstractSingleValueCondition<T> condition) {
7570
String mapKey = RenderingStrategy.formatParameterMapKey(sequence);
7671
String fragment = condition.renderCondition(columnName(),
7772
getFormattedJdbcPlaceholder(mapKey));
7873

7974
return FragmentAndParameters.withFragment(fragment)
8075
.withParameter(mapKey, convertValue(condition.value()))
81-
.buildOptional();
76+
.build();
8277
}
8378

8479
@Override
85-
public Optional<FragmentAndParameters> visit(AbstractTwoValueCondition<T> condition) {
80+
public FragmentAndParameters visit(AbstractTwoValueCondition<T> condition) {
8681
String mapKey1 = RenderingStrategy.formatParameterMapKey(sequence);
8782
String mapKey2 = RenderingStrategy.formatParameterMapKey(sequence);
8883
String fragment = condition.renderCondition(columnName(),
@@ -92,12 +87,12 @@ public Optional<FragmentAndParameters> visit(AbstractTwoValueCondition<T> condit
9287
return FragmentAndParameters.withFragment(fragment)
9388
.withParameter(mapKey1, convertValue(condition.value1()))
9489
.withParameter(mapKey2, convertValue(condition.value2()))
95-
.buildOptional();
90+
.build();
9691
}
9792

9893

9994
@Override
100-
public Optional<FragmentAndParameters> visit(AbstractSubselectCondition<T> condition) {
95+
public FragmentAndParameters visit(AbstractSubselectCondition<T> condition) {
10196
SelectStatementProvider selectStatement = SelectRenderer.withSelectModel(condition.selectModel())
10297
.withRenderingStrategy(renderingStrategy)
10398
.withSequence(sequence)
@@ -108,13 +103,13 @@ public Optional<FragmentAndParameters> visit(AbstractSubselectCondition<T> condi
108103

109104
return FragmentAndParameters.withFragment(fragment)
110105
.withParameters(selectStatement.getParameters())
111-
.buildOptional();
106+
.build();
112107
}
113108

114109
@Override
115-
public Optional<FragmentAndParameters> visit(AbstractColumnComparisonCondition<T> condition) {
110+
public FragmentAndParameters visit(AbstractColumnComparisonCondition<T> condition) {
116111
String fragment = condition.renderCondition(columnName(), tableAliasCalculator);
117-
return FragmentAndParameters.withFragment(fragment).buildOptional();
112+
return FragmentAndParameters.withFragment(fragment).build();
118113
}
119114

120115
private Object convertValue(T value) {

0 commit comments

Comments
 (0)