Skip to content

Commit be87845

Browse files
committed
DATAJDBC-309 - Add support for comparison conditions and LIKE.
We now support LIKE and equal/not equal/less with equals to/greater with equals to conditions.
1 parent 221773b commit be87845

File tree

8 files changed

+306
-40
lines changed

8 files changed

+306
-40
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
/*
2+
* Copyright 2019 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.springframework.data.relational.core.sql;
17+
18+
import org.springframework.util.Assert;
19+
20+
/**
21+
* Comparing {@link Condition} comparing two {@link Expression}s.
22+
* <p/>
23+
* Results in a rendered condition: {@code <left> <comparator> <right>} (e.g. {@code col = 'predicate'}.
24+
*
25+
* @author Mark Paluch
26+
*/
27+
public class Comparison extends AbstractSegment implements Condition {
28+
29+
private final Expression left;
30+
private final String comparator;
31+
private final Expression right;
32+
33+
private Comparison(Expression left, String comparator, Expression right) {
34+
35+
super(left, right);
36+
37+
this.left = left;
38+
this.comparator = comparator;
39+
this.right = right;
40+
}
41+
42+
/**
43+
* Creates a new {@link Comparison} {@link Condition} given two {@link Expression}s.
44+
*
45+
* @param leftColumnOrExpression the left {@link Expression}.
46+
* @param comparator the comparator.
47+
* @param rightColumnOrExpression the right {@link Expression}.
48+
* @return the {@link Comparison} condition.
49+
*/
50+
public static Comparison create(Expression leftColumnOrExpression, String comparator,
51+
Expression rightColumnOrExpression) {
52+
53+
Assert.notNull(leftColumnOrExpression, "Left expression must not be null!");
54+
Assert.notNull(comparator, "Comparator must not be null!");
55+
Assert.notNull(rightColumnOrExpression, "Right expression must not be null!");
56+
57+
return new Comparison(leftColumnOrExpression, comparator, rightColumnOrExpression);
58+
}
59+
60+
@Override
61+
public Condition not() {
62+
63+
if ("=".equals(comparator)) {
64+
return new Comparison(left, "!=", right);
65+
}
66+
67+
if ("!=".equals(comparator)) {
68+
return new Comparison(left, "=", right);
69+
}
70+
71+
return new Not(this);
72+
}
73+
74+
/**
75+
* @return the left {@link Expression}.
76+
*/
77+
public Expression getLeft() {
78+
return left;
79+
}
80+
81+
/**
82+
* @return the comparator.
83+
*/
84+
public String getComparator() {
85+
return comparator;
86+
}
87+
88+
/**
89+
* @return the right {@link Expression}.
90+
*/
91+
public Expression getRight() {
92+
return right;
93+
}
94+
95+
@Override
96+
public String toString() {
97+
return left.toString() + " " + comparator + " " + right.toString();
98+
}
99+
}

spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Conditions.java

Lines changed: 74 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public static Condition just(String sql) {
4848
* @param expression the expression to check for nullability, must not be {@literal null}.
4949
* @return the {@code IS NULL} condition.
5050
*/
51-
public static Condition isNull(Expression expression) {
51+
public static IsNull isNull(Expression expression) {
5252
return IsNull.create(expression);
5353
}
5454

@@ -57,10 +57,78 @@ public static Condition isNull(Expression expression) {
5757
*
5858
* @param leftColumnOrExpression left side of the comparison.
5959
* @param rightColumnOrExpression right side of the comparison.
60-
* @return the {@link Equals} condition.
60+
* @return the {@link Comparison} condition.
6161
*/
62-
public static Equals isEqual(Expression leftColumnOrExpression, Expression rightColumnOrExpression) {
63-
return Equals.create(leftColumnOrExpression, rightColumnOrExpression);
62+
public static Comparison isEqual(Expression leftColumnOrExpression, Expression rightColumnOrExpression) {
63+
return Comparison.create(leftColumnOrExpression, "=", rightColumnOrExpression);
64+
}
65+
66+
/**
67+
* Creates a {@code !=} (not equals) {@link Condition}.
68+
*
69+
* @param leftColumnOrExpression left side of the comparison.
70+
* @param rightColumnOrExpression right side of the comparison.
71+
* @return the {@link Comparison} condition.
72+
*/
73+
public static Comparison isNotEqual(Expression leftColumnOrExpression, Expression rightColumnOrExpression) {
74+
return Comparison.create(leftColumnOrExpression, "!=", rightColumnOrExpression);
75+
}
76+
77+
/**
78+
* Creates a {@code <} (less) {@link Condition} comparing {@code left} is less than {@code right}.
79+
*
80+
* @param leftColumnOrExpression left side of the comparison.
81+
* @param rightColumnOrExpression right side of the comparison.
82+
* @return the {@link Comparison} condition.
83+
*/
84+
public static Comparison isLess(Expression leftColumnOrExpression, Expression rightColumnOrExpression) {
85+
return Comparison.create(leftColumnOrExpression, "<", rightColumnOrExpression);
86+
}
87+
88+
/**
89+
* Creates a {@code <=} (less or equal to) {@link Condition} comparing {@code left} is less than or equal to
90+
* {@code right}.
91+
*
92+
* @param leftColumnOrExpression left side of the comparison.
93+
* @param rightColumnOrExpression right side of the comparison.
94+
* @return the {@link Comparison} condition.
95+
*/
96+
public static Comparison isLessOrEqualTo(Expression leftColumnOrExpression, Expression rightColumnOrExpression) {
97+
return Comparison.create(leftColumnOrExpression, "<=", rightColumnOrExpression);
98+
}
99+
100+
/**
101+
* Creates a {@code <=} (greater ) {@link Condition} comparing {@code left} is greater than {@code right}.
102+
*
103+
* @param leftColumnOrExpression left side of the comparison.
104+
* @param rightColumnOrExpression right side of the comparison.
105+
* @return the {@link Comparison} condition.
106+
*/
107+
public static Comparison isGreater(Expression leftColumnOrExpression, Expression rightColumnOrExpression) {
108+
return Comparison.create(leftColumnOrExpression, ">", rightColumnOrExpression);
109+
}
110+
111+
/**
112+
* Creates a {@code <=} (greater or equal to) {@link Condition} comparing {@code left} is greater than or equal to
113+
* {@code right}.
114+
*
115+
* @param leftColumnOrExpression left side of the comparison.
116+
* @param rightColumnOrExpression right side of the comparison.
117+
* @return the {@link Comparison} condition.
118+
*/
119+
public static Comparison isGreaterOrEqualTo(Expression leftColumnOrExpression, Expression rightColumnOrExpression) {
120+
return Comparison.create(leftColumnOrExpression, ">=", rightColumnOrExpression);
121+
}
122+
123+
/**
124+
* Creates a {@code LIKE} {@link Condition}.
125+
*
126+
* @param leftColumnOrExpression left side of the comparison.
127+
* @param rightColumnOrExpression right side of the comparison.
128+
* @return the {@link Comparison} condition.
129+
*/
130+
public static Like like(Expression leftColumnOrExpression, Expression rightColumnOrExpression) {
131+
return Like.create(leftColumnOrExpression, rightColumnOrExpression);
64132
}
65133

66134
/**
@@ -100,7 +168,7 @@ public static Condition in(Expression columnOrExpression, Collection<? extends E
100168
* @param expressions right hand side (collection {@link Expression}) must not be {@literal null}.
101169
* @return the {@link In} {@link Condition}.
102170
*/
103-
public static Condition in(Expression columnOrExpression, Expression... expressions) {
171+
public static In in(Expression columnOrExpression, Expression... expressions) {
104172

105173
Assert.notNull(columnOrExpression, "Comparison column or expression must not be null");
106174
Assert.notNull(expressions, "Expression argument must not be null");
@@ -138,10 +206,5 @@ public String toString() {
138206
}
139207

140208
// Utility constructor.
141-
private Conditions() {
142-
}
209+
private Conditions() {}
143210
}
144-
145-
146-
147-

spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultSelectBuilder.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.data.relational.core.sql.SelectBuilder.SelectAndFrom;
2525
import org.springframework.data.relational.core.sql.SelectBuilder.SelectFromAndJoin;
2626
import org.springframework.data.relational.core.sql.SelectBuilder.SelectWhereAndOr;
27+
import org.springframework.lang.Nullable;
2728

2829
/**
2930
* Default {@link SelectBuilder} implementation.
@@ -273,7 +274,7 @@ static class JoinBuilder implements SelectOn, SelectOnConditionComparison, Selec
273274
private final DefaultSelectBuilder selectBuilder;
274275
private Expression from;
275276
private Expression to;
276-
private Condition condition;
277+
private @Nullable Condition condition;
277278

278279
JoinBuilder(Table table, DefaultSelectBuilder selectBuilder) {
279280
this.table = table;
@@ -314,12 +315,12 @@ public SelectOnConditionComparison and(Expression column) {
314315
}
315316

316317
private void finishCondition() {
317-
Equals equals = Equals.create(from, to);
318+
Comparison comparison = Comparison.create(from, "=", to);
318319

319320
if (condition == null) {
320-
condition = equals;
321+
condition = comparison;
321322
} else {
322-
condition = condition.and(equals);
323+
condition = condition.and(comparison);
323324
}
324325
}
325326

spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/In.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ private static Segment[] toArray(Expression expression, Collection<Expression> e
6363
* @param arg right hand side (collection {@link Expression}) must not be {@literal null}.
6464
* @return the {@link In} {@link Condition}.
6565
*/
66-
public static Condition create(Expression columnOrExpression, Expression arg) {
66+
public static In create(Expression columnOrExpression, Expression arg) {
6767

6868
Assert.notNull(columnOrExpression, "Comparison column or expression must not be null");
6969
Assert.notNull(arg, "Expression argument must not be null");
@@ -78,7 +78,7 @@ public static Condition create(Expression columnOrExpression, Expression arg) {
7878
* @param expressions right hand side (collection {@link Expression}) must not be {@literal null}.
7979
* @return the {@link In} {@link Condition}.
8080
*/
81-
public static Condition create(Expression columnOrExpression, Collection<? extends Expression> expressions) {
81+
public static In create(Expression columnOrExpression, Collection<? extends Expression> expressions) {
8282

8383
Assert.notNull(columnOrExpression, "Comparison column or expression must not be null");
8484
Assert.notNull(expressions, "Expression argument must not be null");
@@ -93,7 +93,7 @@ public static Condition create(Expression columnOrExpression, Collection<? exten
9393
* @param expressions right hand side (collection {@link Expression}) must not be {@literal null}.
9494
* @return the {@link In} {@link Condition}.
9595
*/
96-
public static Condition create(Expression columnOrExpression, Expression... expressions) {
96+
public static In create(Expression columnOrExpression, Expression... expressions) {
9797

9898
Assert.notNull(columnOrExpression, "Comparison column or expression must not be null");
9999
Assert.notNull(expressions, "Expression argument must not be null");

spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Equals.java renamed to spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Like.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,18 @@
1818
import org.springframework.util.Assert;
1919

2020
/**
21-
* Equals to {@link Condition} comparing two {@link Expression}s.
21+
* LIKE {@link Condition} comparing two {@link Expression}s.
2222
* <p/>
23-
* Results in a rendered condition: {@code <left> = <right>}.
23+
* Results in a rendered condition: {@code <left> LIKE <right>}.
2424
*
2525
* @author Mark Paluch
2626
*/
27-
public class Equals extends AbstractSegment implements Condition {
27+
public class Like extends AbstractSegment implements Condition {
2828

2929
private final Expression left;
3030
private final Expression right;
3131

32-
private Equals(Expression left, Expression right) {
32+
private Like(Expression left, Expression right) {
3333

3434
super(left, right);
3535

@@ -38,18 +38,18 @@ private Equals(Expression left, Expression right) {
3838
}
3939

4040
/**
41-
* Creates a new {@link Equals} {@link Condition} given two {@link Expression}s.
41+
* Creates a new {@link Like} {@link Condition} given two {@link Expression}s.
4242
*
43-
* @param left the left {@link Expression}.
44-
* @param right the right {@link Expression}.
45-
* @return the {@link Equals} condition.
43+
* @param leftColumnOrExpression the left {@link Expression}.
44+
* @param rightColumnOrExpression the right {@link Expression}.
45+
* @return the {@link Like} condition.
4646
*/
47-
public static Equals create(Expression leftColumnOrExpression, Expression rightColumnOrExpression) {
47+
public static Like create(Expression leftColumnOrExpression, Expression rightColumnOrExpression) {
4848

4949
Assert.notNull(leftColumnOrExpression, "Left expression must not be null!");
5050
Assert.notNull(rightColumnOrExpression, "Right expression must not be null!");
5151

52-
return new Equals(leftColumnOrExpression, rightColumnOrExpression);
52+
return new Like(leftColumnOrExpression, rightColumnOrExpression);
5353
}
5454

5555
/**
@@ -68,6 +68,6 @@ public Expression getRight() {
6868

6969
@Override
7070
public String toString() {
71-
return left.toString() + " = " + right.toString();
71+
return left.toString() + " LIKE " + right.toString();
7272
}
7373
}

spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ComparisonVisitor.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,30 +15,31 @@
1515
*/
1616
package org.springframework.data.relational.core.sql.render;
1717

18+
import org.springframework.data.relational.core.sql.Comparison;
1819
import org.springframework.data.relational.core.sql.Condition;
19-
import org.springframework.data.relational.core.sql.Equals;
2020
import org.springframework.data.relational.core.sql.Expression;
2121
import org.springframework.data.relational.core.sql.Visitable;
22+
import org.springframework.lang.Nullable;
2223

2324
/**
2425
* {@link org.springframework.data.relational.core.sql.Visitor} rendering comparison {@link Condition}. Uses a
2526
* {@link RenderTarget} to call back for render results.
2627
*
2728
* @author Mark Paluch
2829
* @author Jens Schauder
29-
* @see Equals
30+
* @see Comparison
3031
*/
3132
class ComparisonVisitor extends FilteredSubtreeVisitor {
3233

34+
private final Comparison condition;
3335
private final RenderTarget target;
34-
private final String comparator;
3536
private final StringBuilder part = new StringBuilder();
36-
private PartRenderer current;
37+
private @Nullable PartRenderer current;
3738

38-
ComparisonVisitor(Equals condition, RenderTarget target) {
39+
ComparisonVisitor(Comparison condition, RenderTarget target) {
3940
super(it -> it == condition);
41+
this.condition = condition;
4042
this.target = target;
41-
this.comparator = " = ";
4243
}
4344

4445
/*
@@ -72,7 +73,7 @@ Delegation leaveNested(Visitable segment) {
7273

7374
if (current != null) {
7475
if (part.length() != 0) {
75-
part.append(comparator);
76+
part.append(' ').append(condition.getComparator()).append(' ');
7677
}
7778

7879
part.append(current.getRenderedPart());

0 commit comments

Comments
 (0)