Skip to content

Commit bc4beca

Browse files
committed
Rename VisitableCondition to RenderableCondition
Conditions are no longer rendered via a Visitor, so the new name makes more sense
1 parent 0cfecd7 commit bc4beca

25 files changed

+95
-110
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ Runtime behavior changes:
100100
these concepts for different databases it simply adds known clauses to a generated SQL statement. You should always
101101
test to make sure these functions work in your target database. Currently, we support, and test, the options
102102
supported by PostgreSQL.
103+
- Rendering for all the conditions (isEqualTo, etc.) has changed. This should be transparent to most users unless you
104+
have coded a direct implementation of `VisitableCondition`. The change makes it easier to code custom conditions that
105+
are not supported by the library out of the box. The statement renderers now call methods `renderCondition` and
106+
`renderLeftColumn` that you can override to implement any rendering you need.
103107

104108
## Release 1.5.2 - June 3, 2024
105109

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import org.mybatis.dynamic.sql.render.RenderingContext;
2121
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2222

23-
public abstract class AbstractColumnComparisonCondition<T> implements VisitableCondition<T> {
23+
public abstract class AbstractColumnComparisonCondition<T> implements RenderableCondition<T> {
2424

2525
protected final BasicColumn rightColumn;
2626

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2929
import org.mybatis.dynamic.sql.util.FragmentCollector;
3030

31-
public abstract class AbstractListValueCondition<T> implements VisitableCondition<T> {
31+
public abstract class AbstractListValueCondition<T> implements RenderableCondition<T> {
3232
protected final Collection<T> values;
3333

3434
protected AbstractListValueCondition(Collection<T> values) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import org.mybatis.dynamic.sql.render.RenderingContext;
2222
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2323

24-
public abstract class AbstractNoValueCondition<T> implements VisitableCondition<T> {
24+
public abstract class AbstractNoValueCondition<T> implements RenderableCondition<T> {
2525

2626
protected <S extends AbstractNoValueCondition<?>> S filterSupport(BooleanSupplier booleanSupplier,
2727
Supplier<S> emptySupplier, S self) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import org.mybatis.dynamic.sql.render.RenderingContext;
2626
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2727

28-
public abstract class AbstractSingleValueCondition<T> implements VisitableCondition<T> {
28+
public abstract class AbstractSingleValueCondition<T> implements RenderableCondition<T> {
2929
protected final T value;
3030

3131
protected AbstractSingleValueCondition(T value) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import org.mybatis.dynamic.sql.util.Buildable;
2222
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2323

24-
public abstract class AbstractSubselectCondition<T> implements VisitableCondition<T> {
24+
public abstract class AbstractSubselectCondition<T> implements RenderableCondition<T> {
2525
private final SelectModel selectModel;
2626

2727
protected AbstractSubselectCondition(Buildable<SelectModel> selectModelBuilder) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import org.mybatis.dynamic.sql.render.RenderingContext;
2828
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2929

30-
public abstract class AbstractTwoValueCondition<T> implements VisitableCondition<T> {
30+
public abstract class AbstractTwoValueCondition<T> implements RenderableCondition<T> {
3131
protected final T value1;
3232
protected final T value2;
3333

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

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

2222
public class ColumnAndConditionCriterion<T> extends SqlCriterion {
2323
private final BindableColumn<T> column;
24-
private final VisitableCondition<T> condition;
24+
private final RenderableCondition<T> condition;
2525

2626
private ColumnAndConditionCriterion(Builder<T> builder) {
2727
super(builder);
@@ -33,7 +33,7 @@ public BindableColumn<T> column() {
3333
return column;
3434
}
3535

36-
public VisitableCondition<T> condition() {
36+
public RenderableCondition<T> condition() {
3737
return condition;
3838
}
3939

@@ -48,14 +48,14 @@ public static <T> Builder<T> withColumn(BindableColumn<T> column) {
4848

4949
public static class Builder<T> extends AbstractBuilder<Builder<T>> {
5050
private @Nullable BindableColumn<T> column;
51-
private @Nullable VisitableCondition<T> condition;
51+
private @Nullable RenderableCondition<T> condition;
5252

5353
public Builder<T> withColumn(BindableColumn<T> column) {
5454
this.column = column;
5555
return this;
5656
}
5757

58-
public Builder<T> withCondition(VisitableCondition<T> condition) {
58+
public Builder<T> withCondition(RenderableCondition<T> condition) {
5959
this.condition = condition;
6060
return this;
6161
}

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ static WhereDSL.StandaloneWhereFinisher where() {
250250
return new WhereDSL().where();
251251
}
252252

253-
static <T> WhereDSL.StandaloneWhereFinisher where(BindableColumn<T> column, VisitableCondition<T> condition,
253+
static <T> WhereDSL.StandaloneWhereFinisher where(BindableColumn<T> column, RenderableCondition<T> condition,
254254
AndOrCriteriaGroup... subCriteria) {
255255
return new WhereDSL().where(column, condition, subCriteria);
256256
}
@@ -263,7 +263,7 @@ static WhereDSL.StandaloneWhereFinisher where(ExistsPredicate existsPredicate, A
263263
return new WhereDSL().where(existsPredicate, subCriteria);
264264
}
265265

266-
static <T> HavingDSL.StandaloneHavingFinisher having(BindableColumn<T> column, VisitableCondition<T> condition,
266+
static <T> HavingDSL.StandaloneHavingFinisher having(BindableColumn<T> column, RenderableCondition<T> condition,
267267
AndOrCriteriaGroup... subCriteria) {
268268
return new HavingDSL().having(column, condition, subCriteria);
269269
}
@@ -273,12 +273,12 @@ static HavingDSL.StandaloneHavingFinisher having(SqlCriterion initialCriterion,
273273
}
274274

275275
// where condition connectors
276-
static <T> CriteriaGroup group(BindableColumn<T> column, VisitableCondition<T> condition,
276+
static <T> CriteriaGroup group(BindableColumn<T> column, RenderableCondition<T> condition,
277277
AndOrCriteriaGroup... subCriteria) {
278278
return group(column, condition, Arrays.asList(subCriteria));
279279
}
280280

281-
static <T> CriteriaGroup group(BindableColumn<T> column, VisitableCondition<T> condition,
281+
static <T> CriteriaGroup group(BindableColumn<T> column, RenderableCondition<T> condition,
282282
List<AndOrCriteriaGroup> subCriteria) {
283283
return new CriteriaGroup.Builder()
284284
.withInitialCriterion(new ColumnAndConditionCriterion.Builder<T>().withColumn(column)
@@ -316,12 +316,12 @@ static CriteriaGroup group(List<AndOrCriteriaGroup> subCriteria) {
316316
.build();
317317
}
318318

319-
static <T> NotCriterion not(BindableColumn<T> column, VisitableCondition<T> condition,
319+
static <T> NotCriterion not(BindableColumn<T> column, RenderableCondition<T> condition,
320320
AndOrCriteriaGroup... subCriteria) {
321321
return not(column, condition, Arrays.asList(subCriteria));
322322
}
323323

324-
static <T> NotCriterion not(BindableColumn<T> column, VisitableCondition<T> condition,
324+
static <T> NotCriterion not(BindableColumn<T> column, RenderableCondition<T> condition,
325325
List<AndOrCriteriaGroup> subCriteria) {
326326
return new NotCriterion.Builder()
327327
.withInitialCriterion(new ColumnAndConditionCriterion.Builder<T>().withColumn(column)
@@ -359,7 +359,7 @@ static NotCriterion not(List<AndOrCriteriaGroup> subCriteria) {
359359
.build();
360360
}
361361

362-
static <T> AndOrCriteriaGroup or(BindableColumn<T> column, VisitableCondition<T> condition,
362+
static <T> AndOrCriteriaGroup or(BindableColumn<T> column, RenderableCondition<T> condition,
363363
AndOrCriteriaGroup... subCriteria) {
364364
return new AndOrCriteriaGroup.Builder()
365365
.withInitialCriterion(ColumnAndConditionCriterion.withColumn(column)
@@ -394,7 +394,7 @@ static AndOrCriteriaGroup or(List<AndOrCriteriaGroup> subCriteria) {
394394
.build();
395395
}
396396

397-
static <T> AndOrCriteriaGroup and(BindableColumn<T> column, VisitableCondition<T> condition,
397+
static <T> AndOrCriteriaGroup and(BindableColumn<T> column, RenderableCondition<T> condition,
398398
AndOrCriteriaGroup... subCriteria) {
399399
return new AndOrCriteriaGroup.Builder()
400400
.withInitialCriterion(ColumnAndConditionCriterion.withColumn(column)
@@ -430,7 +430,7 @@ static AndOrCriteriaGroup and(List<AndOrCriteriaGroup> subCriteria) {
430430
}
431431

432432
// join support
433-
static <T> ColumnAndConditionCriterion<T> on(BindableColumn<T> joinColumn, VisitableCondition<T> joinCondition) {
433+
static <T> ColumnAndConditionCriterion<T> on(BindableColumn<T> joinColumn, RenderableCondition<T> joinCondition) {
434434
return ColumnAndConditionCriterion.withColumn(joinColumn)
435435
.withCondition(joinCondition)
436436
.build();
@@ -506,7 +506,7 @@ static Sum<Object> sum(BasicColumn column) {
506506
return Sum.of(column);
507507
}
508508

509-
static <T> Sum<T> sum(BindableColumn<T> column, VisitableCondition<T> condition) {
509+
static <T> Sum<T> sum(BindableColumn<T> column, RenderableCondition<T> condition) {
510510
return Sum.of(column, condition);
511511
}
512512

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

Lines changed: 17 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -16,41 +16,21 @@
1616
package org.mybatis.dynamic.sql;
1717

1818
import org.mybatis.dynamic.sql.render.RenderingContext;
19-
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
2019

21-
@FunctionalInterface
22-
public interface VisitableCondition<T> {
23-
FragmentAndParameters renderCondition(RenderingContext renderingContext, BindableColumn<T> leftColumn);
24-
25-
default FragmentAndParameters renderLeftColumn(RenderingContext renderingContext, BindableColumn<T> leftColumn) {
26-
return leftColumn.alias()
27-
.map(FragmentAndParameters::fromFragment)
28-
.orElseGet(() -> leftColumn.render(renderingContext));
29-
}
30-
31-
/**
32-
* Subclasses can override this to inform the renderer if the condition should not be included
33-
* in the rendered SQL. Typically, conditions will not render if they are empty.
34-
*
35-
* @return true if the condition should render.
36-
*/
37-
default boolean shouldRender(RenderingContext renderingContext) {
38-
return !isEmpty();
39-
}
40-
41-
/**
42-
* Subclasses can override this to indicate whether the condition is considered empty. This is primarily used in
43-
* map and filter operations - the map and filter functions will not be applied if the condition is empty.
44-
*
45-
* @return true if the condition is empty.
46-
*/
47-
default boolean isEmpty() {
48-
return false;
49-
}
50-
51-
/**
52-
* This method will be called during rendering when {@link VisitableCondition#shouldRender(RenderingContext)}
53-
* returns false.
54-
*/
55-
default void renderingSkipped() {}
56-
}
20+
/**
21+
* Deprecated interface.
22+
*
23+
* <p>Conditions are no longer rendered with a visitor, so the name is misleading. This change makes it far easier
24+
* to implement custom conditions for functionality not supplied out of the box by the library.
25+
*
26+
* <p>If you created any direct implementations of this interface, you will need to change the rendering functions.
27+
* The library now calls {@link RenderableCondition#renderCondition(RenderingContext, BindableColumn)} and
28+
* {@link RenderableCondition#renderLeftColumn(RenderingContext, BindableColumn)} instead of the previous methods
29+
* like <code>operator</code>, <code>value</code>, etc. Subclasses of the supplied abstract conditions should continue
30+
* to function as before.
31+
*
32+
* @param <T> the Java type related to the column this condition relates to. Used primarily for compiler type checking
33+
* @deprecated since 2.0.0. Please use {@link RenderableCondition} instead.
34+
*/
35+
@Deprecated(since = "2.0.0", forRemoval = true)
36+
public interface VisitableCondition<T> extends RenderableCondition<T> { }

src/main/java/org/mybatis/dynamic/sql/common/AbstractBooleanExpressionDSL.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,20 @@
2626
import org.mybatis.dynamic.sql.CriteriaGroup;
2727
import org.mybatis.dynamic.sql.ExistsCriterion;
2828
import org.mybatis.dynamic.sql.ExistsPredicate;
29+
import org.mybatis.dynamic.sql.RenderableCondition;
2930
import org.mybatis.dynamic.sql.SqlCriterion;
30-
import org.mybatis.dynamic.sql.VisitableCondition;
3131
import org.mybatis.dynamic.sql.util.Validator;
3232

3333
public abstract class AbstractBooleanExpressionDSL<T extends AbstractBooleanExpressionDSL<T>> {
3434
private @Nullable SqlCriterion initialCriterion;
3535
protected final List<AndOrCriteriaGroup> subCriteria = new ArrayList<>();
3636

37-
public <S> T and(BindableColumn<S> column, VisitableCondition<S> condition,
37+
public <S> T and(BindableColumn<S> column, RenderableCondition<S> condition,
3838
AndOrCriteriaGroup... subCriteria) {
3939
return and(column, condition, Arrays.asList(subCriteria));
4040
}
4141

42-
public <S> T and(BindableColumn<S> column, VisitableCondition<S> condition,
42+
public <S> T and(BindableColumn<S> column, RenderableCondition<S> condition,
4343
List<AndOrCriteriaGroup> subCriteria) {
4444
addSubCriteria("and", buildCriterion(column, condition), subCriteria); //$NON-NLS-1$
4545
return getThis();
@@ -68,12 +68,12 @@ public T and(List<AndOrCriteriaGroup> criteria) {
6868
return getThis();
6969
}
7070

71-
public <S> T or(BindableColumn<S> column, VisitableCondition<S> condition,
71+
public <S> T or(BindableColumn<S> column, RenderableCondition<S> condition,
7272
AndOrCriteriaGroup... subCriteria) {
7373
return or(column, condition, Arrays.asList(subCriteria));
7474
}
7575

76-
public <S> T or(BindableColumn<S> column, VisitableCondition<S> condition,
76+
public <S> T or(BindableColumn<S> column, RenderableCondition<S> condition,
7777
List<AndOrCriteriaGroup> subCriteria) {
7878
addSubCriteria("or", buildCriterion(column, condition), subCriteria); //$NON-NLS-1$
7979
return getThis();
@@ -102,7 +102,7 @@ public T or(List<AndOrCriteriaGroup> criteria) {
102102
return getThis();
103103
}
104104

105-
private <R> SqlCriterion buildCriterion(BindableColumn<R> column, VisitableCondition<R> condition) {
105+
private <R> SqlCriterion buildCriterion(BindableColumn<R> column, RenderableCondition<R> condition) {
106106
return ColumnAndConditionCriterion.withColumn(column).withCondition(condition).build();
107107
}
108108

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,17 @@
2222
import org.mybatis.dynamic.sql.BindableColumn;
2323
import org.mybatis.dynamic.sql.ColumnAndConditionCriterion;
2424
import org.mybatis.dynamic.sql.CriteriaGroup;
25+
import org.mybatis.dynamic.sql.RenderableCondition;
2526
import org.mybatis.dynamic.sql.SqlCriterion;
26-
import org.mybatis.dynamic.sql.VisitableCondition;
2727

2828
public interface AbstractHavingStarter<F extends AbstractHavingFinisher<?>> {
2929

30-
default <T> F having(BindableColumn<T> column, VisitableCondition<T> condition,
30+
default <T> F having(BindableColumn<T> column, RenderableCondition<T> condition,
3131
AndOrCriteriaGroup... subCriteria) {
3232
return having(column, condition, Arrays.asList(subCriteria));
3333
}
3434

35-
default <T> F having(BindableColumn<T> column, VisitableCondition<T> condition,
35+
default <T> F having(BindableColumn<T> column, RenderableCondition<T> condition,
3636
List<AndOrCriteriaGroup> subCriteria) {
3737
SqlCriterion sqlCriterion = ColumnAndConditionCriterion.withColumn(column)
3838
.withCondition(condition)

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@
2828
import org.mybatis.dynamic.sql.BindableColumn;
2929
import org.mybatis.dynamic.sql.ColumnAndConditionCriterion;
3030
import org.mybatis.dynamic.sql.CriteriaGroup;
31+
import org.mybatis.dynamic.sql.RenderableCondition;
3132
import org.mybatis.dynamic.sql.SortSpecification;
3233
import org.mybatis.dynamic.sql.SqlTable;
3334
import org.mybatis.dynamic.sql.TableExpression;
34-
import org.mybatis.dynamic.sql.VisitableCondition;
3535
import org.mybatis.dynamic.sql.common.AbstractBooleanExpressionDSL;
3636
import org.mybatis.dynamic.sql.configuration.StatementConfiguration;
3737
import org.mybatis.dynamic.sql.select.join.JoinSpecification;
@@ -324,11 +324,11 @@ public JoinSpecificationStarter(TableExpression joinTable, JoinType joinType) {
324324
this.joinType = joinType;
325325
}
326326

327-
public <T> JoinSpecificationFinisher on(BindableColumn<T> joinColumn, VisitableCondition<T> joinCondition) {
327+
public <T> JoinSpecificationFinisher on(BindableColumn<T> joinColumn, RenderableCondition<T> joinCondition) {
328328
return new JoinSpecificationFinisher(joinTable, joinColumn, joinCondition, joinType);
329329
}
330330

331-
public <T> JoinSpecificationFinisher on(BindableColumn<T> joinColumn, VisitableCondition<T> onJoinCondition,
331+
public <T> JoinSpecificationFinisher on(BindableColumn<T> joinColumn, RenderableCondition<T> onJoinCondition,
332332
AndOrCriteriaGroup... subCriteria) {
333333
return new JoinSpecificationFinisher(joinTable, joinColumn, onJoinCondition, joinType, subCriteria);
334334
}
@@ -343,7 +343,7 @@ public class JoinSpecificationFinisher
343343
private final JoinType joinType;
344344

345345
public <T> JoinSpecificationFinisher(TableExpression table, BindableColumn<T> joinColumn,
346-
VisitableCondition<T> joinCondition, JoinType joinType) {
346+
RenderableCondition<T> joinCondition, JoinType joinType) {
347347
this.table = table;
348348
this.joinType = joinType;
349349
addJoinSpecificationSupplier(this::buildJoinSpecification);
@@ -356,7 +356,8 @@ public <T> JoinSpecificationFinisher(TableExpression table, BindableColumn<T> jo
356356
}
357357

358358
public <T> JoinSpecificationFinisher(TableExpression table, BindableColumn<T> joinColumn,
359-
VisitableCondition<T> joinCondition, JoinType joinType, AndOrCriteriaGroup... subCriteria) {
359+
RenderableCondition<T> joinCondition, JoinType joinType,
360+
AndOrCriteriaGroup... subCriteria) {
360361
this.table = table;
361362
this.joinType = joinType;
362363
addJoinSpecificationSupplier(this::buildJoinSpecification);

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
import org.mybatis.dynamic.sql.BasicColumn;
2121
import org.mybatis.dynamic.sql.BindableColumn;
22-
import org.mybatis.dynamic.sql.VisitableCondition;
22+
import org.mybatis.dynamic.sql.RenderableCondition;
2323
import org.mybatis.dynamic.sql.render.RenderingContext;
2424
import org.mybatis.dynamic.sql.select.function.AbstractUniTypeFunction;
2525
import org.mybatis.dynamic.sql.util.FragmentAndParameters;
@@ -34,7 +34,7 @@ private Sum(BasicColumn column) {
3434
renderer = rc -> column.render(rc).mapFragment(this::applyAggregate);
3535
}
3636

37-
private Sum(BindableColumn<T> column, VisitableCondition<T> condition) {
37+
private Sum(BindableColumn<T> column, RenderableCondition<T> condition) {
3838
super(column);
3939
renderer = rc -> {
4040
Validator.assertTrue(condition.shouldRender(rc), "ERROR.37", "sum"); //$NON-NLS-1$ //$NON-NLS-2$
@@ -76,7 +76,7 @@ public static Sum<Object> of(BasicColumn column) {
7676
return new Sum<>(column);
7777
}
7878

79-
public static <T> Sum<T> of(BindableColumn<T> column, VisitableCondition<T> condition) {
79+
public static <T> Sum<T> of(BindableColumn<T> column, RenderableCondition<T> condition) {
8080
return new Sum<>(column, condition);
8181
}
8282
}

0 commit comments

Comments
 (0)