Skip to content

Commit 6b67cc7

Browse files
committed
GH-1953 code review polishing, squash me later
Signed-off-by: mipo256 <[email protected]>
1 parent 0529b33 commit 6b67cc7

File tree

5 files changed

+99
-32
lines changed

5 files changed

+99
-32
lines changed

Diff for: spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Criteria.java

+44-25
Original file line numberDiff line numberDiff line change
@@ -66,26 +66,32 @@ public class Criteria implements CriteriaDefinition {
6666

6767
private final @Nullable SqlIdentifier column;
6868
private final @Nullable Comparator comparator;
69+
private final @Nullable ExtendedComparator extendedComparator;
6970
private final @Nullable Object value;
7071
private final boolean ignoreCase;
7172

72-
public Criteria(SqlIdentifier column, @Nullable Comparator comparator, @Nullable Object value) {
73-
this(null, Combinator.INITIAL, Collections.emptyList(), column, comparator, value, false);
73+
Criteria(SqlIdentifier column, @Nullable Comparator comparator, @Nullable Object value) {
74+
this(null, Combinator.INITIAL, Collections.emptyList(), column, comparator, null, value, false);
75+
}
76+
77+
Criteria(SqlIdentifier column, ExtendedComparator extendedComparator, @Nullable Object value) {
78+
this(null, Combinator.INITIAL, Collections.emptyList(), column, null, extendedComparator, value, false);
7479
}
7580

7681
private Criteria(@Nullable Criteria previous, Combinator combinator, List<CriteriaDefinition> group,
7782
@Nullable SqlIdentifier column, @Nullable Comparator comparator, @Nullable Object value) {
78-
this(previous, combinator, group, column, comparator, value, false);
83+
this(previous, combinator, group, column, comparator, null, value, false);
7984
}
8085

8186
private Criteria(@Nullable Criteria previous, Combinator combinator, List<CriteriaDefinition> group,
82-
@Nullable SqlIdentifier column, @Nullable Comparator comparator, @Nullable Object value, boolean ignoreCase) {
87+
@Nullable SqlIdentifier column, @Nullable Comparator comparator, @Nullable ExtendedComparator extendedComparator, @Nullable Object value, boolean ignoreCase) {
8388

8489
this.previous = previous;
8590
this.combinator = previous != null && previous.isEmpty() ? Combinator.INITIAL : combinator;
8691
this.group = group;
8792
this.column = column;
8893
this.comparator = comparator;
94+
this.extendedComparator = extendedComparator;
8995
this.value = value;
9096
this.ignoreCase = ignoreCase;
9197
}
@@ -97,6 +103,7 @@ private Criteria(@Nullable Criteria previous, Combinator combinator, List<Criter
97103
this.group = group;
98104
this.column = null;
99105
this.comparator = null;
106+
this.extendedComparator = null;
100107
this.value = null;
101108
this.ignoreCase = false;
102109
}
@@ -260,7 +267,7 @@ public Criteria or(List<? extends CriteriaDefinition> criteria) {
260267
*/
261268
public Criteria ignoreCase(boolean ignoreCase) {
262269
if (this.ignoreCase != ignoreCase) {
263-
return new Criteria(previous, combinator, group, column, comparator, value, ignoreCase);
270+
return new Criteria(previous, combinator, group, column, comparator, extendedComparator, value, ignoreCase);
264271
}
265272
return this;
266273
}
@@ -363,6 +370,11 @@ public Comparator getComparator() {
363370
return comparator;
364371
}
365372

373+
@Override
374+
public ExtendedComparator getExtendedComparator() {
375+
return extendedComparator;
376+
}
377+
366378
/**
367379
* @return the comparison value. Can be {@literal null}.
368380
*/
@@ -408,12 +420,13 @@ public boolean equals(Object o) {
408420
&& Objects.equals(group, criteria.group) //
409421
&& Objects.equals(column, criteria.column) //
410422
&& comparator == criteria.comparator //
423+
&& extendedComparator == criteria.extendedComparator //
411424
&& Objects.equals(value, criteria.value);
412425
}
413426

414427
@Override
415428
public int hashCode() {
416-
return Objects.hash(previous, combinator, group, column, comparator, value, ignoreCase);
429+
return Objects.hash(previous, combinator, group, column, comparator, extendedComparator, value, ignoreCase);
417430
}
418431

419432
private void unroll(CriteriaDefinition criteria, StringBuilder stringBuilder) {
@@ -479,29 +492,35 @@ private void render(CriteriaDefinition criteria, StringBuilder stringBuilder) {
479492
return;
480493
}
481494

482-
stringBuilder.append(criteria.getColumn().toSql(IdentifierProcessing.NONE)).append(' ')
483-
.append(criteria.getComparator().getComparator());
495+
stringBuilder.append(criteria.getColumn().toSql(IdentifierProcessing.NONE)).append(' ');
496+
497+
if (criteria.getExtendedComparator() != null) {
498+
stringBuilder.append(criteria.getExtendedComparator().operator()).append(' ').append(renderValue(criteria.getValue()));
499+
} else {
484500

485-
switch (criteria.getComparator()) {
486-
case BETWEEN:
487-
case NOT_BETWEEN:
488-
Pair<Object, Object> pair = (Pair<Object, Object>) criteria.getValue();
489-
stringBuilder.append(' ').append(pair.getFirst()).append(" AND ").append(pair.getSecond());
490-
break;
501+
stringBuilder.append(criteria.getComparator().getComparator());
491502

492-
case IS_NULL:
493-
case IS_NOT_NULL:
494-
case IS_TRUE:
495-
case IS_FALSE:
496-
break;
503+
switch (criteria.getComparator()) {
504+
case BETWEEN:
505+
case NOT_BETWEEN:
506+
Pair<Object, Object> pair = (Pair<Object, Object>) criteria.getValue();
507+
stringBuilder.append(' ').append(pair.getFirst()).append(" AND ").append(pair.getSecond());
508+
break;
497509

498-
case IN:
499-
case NOT_IN:
500-
stringBuilder.append(" (").append(renderValue(criteria.getValue())).append(')');
501-
break;
510+
case IS_NULL:
511+
case IS_NOT_NULL:
512+
case IS_TRUE:
513+
case IS_FALSE:
514+
break;
502515

503-
default:
504-
stringBuilder.append(' ').append(renderValue(criteria.getValue()));
516+
case IN:
517+
case NOT_IN:
518+
stringBuilder.append(" (").append(renderValue(criteria.getValue())).append(')');
519+
break;
520+
521+
default:
522+
stringBuilder.append(' ').append(renderValue(criteria.getValue()));
523+
}
505524
}
506525
}
507526

Diff for: spring-data-relational/src/main/java/org/springframework/data/relational/core/query/CriteriaDefinition.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,12 @@ static CriteriaDefinition from(List<? extends CriteriaDefinition> criteria) {
9898
@Nullable
9999
Comparator getComparator();
100100

101+
/**
102+
* @return {@link ExtendedComparator}.
103+
*/
104+
@Nullable
105+
ExtendedComparator getExtendedComparator();
106+
101107
/**
102108
* @return the comparison value. Can be {@literal null}.
103109
*/
@@ -141,7 +147,7 @@ enum Combinator {
141147
enum Comparator {
142148
INITIAL(""), EQ("="), NEQ("!="), BETWEEN("BETWEEN"), NOT_BETWEEN("NOT BETWEEN"), LT("<"), LTE("<="), GT(">"), GTE(
143149
">="), IS_NULL("IS NULL"), IS_NOT_NULL("IS NOT NULL"), LIKE(
144-
"LIKE"), NOT_LIKE("NOT LIKE"), NOT_IN("NOT IN"), IN("IN"), IS_TRUE("IS TRUE"), IS_FALSE("IS FALSE"), ARRAY_CONTAINS("@>");
150+
"LIKE"), NOT_LIKE("NOT LIKE"), NOT_IN("NOT IN"), IN("IN"), IS_TRUE("IS TRUE"), IS_FALSE("IS FALSE");
145151

146152
private final String comparator;
147153

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright 2020-2025 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+
17+
package org.springframework.data.relational.core.query;
18+
19+
/**
20+
* Analog of {@link org.springframework.data.relational.core.query.CriteriaDefinition.Comparator} for the extended operators,
21+
* that are not commonly supported by RDBMS vendors.
22+
*
23+
* @author Mikhail Polivakha
24+
*/
25+
interface ExtendedComparator {
26+
27+
String operator();
28+
29+
/**
30+
* PostgreSQL specific operator for checking if the SQL ARRAY contains the given sub-array.
31+
*
32+
* @author Mikhail Polivakha
33+
*/
34+
enum PostgresExtendedContains implements ExtendedComparator {
35+
36+
INSTANCE;
37+
38+
@Override
39+
public String operator() {
40+
return "@>";
41+
}
42+
}
43+
}

Diff for: spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Postgres.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,13 @@
1616

1717
package org.springframework.data.relational.core.query;
1818

19-
import static org.springframework.data.relational.core.query.Criteria.*;
19+
import static org.springframework.data.relational.core.query.Criteria.CriteriaLiteral;
2020

2121
import java.sql.JDBCType;
2222
import java.util.StringJoiner;
2323

2424
import org.jetbrains.annotations.NotNull;
25-
import org.springframework.core.ResolvableType;
2625
import org.springframework.data.relational.core.sql.SqlIdentifier;
27-
import org.springframework.data.util.TypeInformation;
2826
import org.springframework.util.Assert;
2927

3028
/**
@@ -64,10 +62,11 @@ public PostgresCriteriaArray(String arrayColumnName) {
6462

6563
@NotNull
6664
@Override
67-
public Criteria contains(Object... values) {
65+
public Criteria
66+
contains(Object... values) {
6867
Assert.notNull(values, "values array cannot be null");
6968

70-
return new Criteria(SqlIdentifier.quoted(arrayColumnName), CriteriaDefinition.Comparator.ARRAY_CONTAINS, new CriteriaLiteral() {
69+
return new Criteria(SqlIdentifier.quoted(arrayColumnName), ExtendedComparator.PostgresExtendedContains.INSTANCE, new CriteriaLiteral() {
7170

7271
@Override
7372
public String getLiteral() {

Diff for: spring-data-relational/src/test/java/org/springframework/data/relational/core/query/CriteriaUnitTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ void shouldBuildSimplePredefinedDialectCriteriaCondition() {
230230

231231
assertSoftly(softAssertions -> {
232232
softAssertions.assertThat(criteria.getColumn()).isEqualTo(SqlIdentifier.quoted("foo"));
233-
softAssertions.assertThat(criteria.getComparator()).isEqualTo(Comparator.ARRAY_CONTAINS);
233+
softAssertions.assertThat(criteria.getComparator()).isNull();
234234
softAssertions.assertThat(criteria.getValue()).isInstanceOf(CriteriaLiteral.class);
235235
softAssertions
236236
.assertThat(criteria.getValue())

0 commit comments

Comments
 (0)