Skip to content

Commit 2885c35

Browse files
petitclmp911de
authored andcommitted
Handle nested Pattern and Document in Criteria.equals(…).
Closes #3414 Original pull request: #3615.
1 parent a2a3339 commit 2885c35

File tree

2 files changed

+70
-2
lines changed

2 files changed

+70
-2
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java

+45-2
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020
import java.util.ArrayList;
2121
import java.util.Arrays;
2222
import java.util.Collection;
23+
import java.util.Iterator;
2324
import java.util.LinkedHashMap;
2425
import java.util.List;
26+
import java.util.Map;
2527
import java.util.Map.Entry;
2628
import java.util.regex.Pattern;
2729
import java.util.stream.Collectors;
@@ -59,6 +61,7 @@
5961
* @author Mark Paluch
6062
* @author Andreas Zink
6163
* @author Ziemowit Stolarczyk
64+
* @author Clément Petit
6265
*/
6366
public class Criteria implements CriteriaDefinition {
6467

@@ -976,9 +979,9 @@ private boolean isEqual(Object left, Object right) {
976979
return right == null;
977980
}
978981

979-
if (Pattern.class.isInstance(left)) {
982+
if (left instanceof Pattern) {
980983

981-
if (!Pattern.class.isInstance(right)) {
984+
if (!(right instanceof Pattern)) {
982985
return false;
983986
}
984987

@@ -989,6 +992,46 @@ private boolean isEqual(Object left, Object right) {
989992
&& leftPattern.flags() == rightPattern.flags();
990993
}
991994

995+
if (left instanceof Document) {
996+
if (!(right instanceof Document)) {
997+
return false;
998+
}
999+
Document leftDocument = (Document) left;
1000+
Document rightDocument = (Document) right;
1001+
Iterator leftIterator = leftDocument.entrySet().iterator();
1002+
Iterator rightIterator = rightDocument.entrySet().iterator();
1003+
1004+
while (leftIterator.hasNext() && rightIterator.hasNext()) {
1005+
Map.Entry leftEntry = (Map.Entry)leftIterator.next();
1006+
Map.Entry rightEntry = (Map.Entry)rightIterator.next();
1007+
if (!isEqual(leftEntry.getKey(), rightEntry.getKey())) {
1008+
return false;
1009+
}
1010+
if (!isEqual(leftEntry.getValue(), rightEntry.getValue())) {
1011+
return false;
1012+
}
1013+
}
1014+
return !leftIterator.hasNext() && !rightIterator.hasNext();
1015+
}
1016+
1017+
if (Collection.class.isAssignableFrom(left.getClass())) {
1018+
if (!Collection.class.isAssignableFrom(right.getClass())) {
1019+
return false;
1020+
}
1021+
1022+
Collection leftCollection = (Collection) left;
1023+
Collection rightCollection = (Collection) right;
1024+
Iterator leftIterator = leftCollection.iterator();
1025+
Iterator rightIterator = rightCollection.iterator();
1026+
1027+
while (leftIterator.hasNext() && rightIterator.hasNext()) {
1028+
if (!isEqual(leftIterator.next(), rightIterator.next())) {
1029+
return false;
1030+
}
1031+
}
1032+
return !leftIterator.hasNext() && !rightIterator.hasNext();
1033+
}
1034+
9921035
return ObjectUtils.nullSafeEquals(left, right);
9931036
}
9941037

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaUnitTests.java

+25
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
* @author Christoph Strobl
3939
* @author Andreas Zink
4040
* @author Ziemowit Stolarczyk
41+
* @author Clément Petit
4142
*/
4243
public class CriteriaUnitTests {
4344

@@ -353,9 +354,33 @@ public void shouldAppendBitsAnySetWithPositionListCorrectly() {
353354
@Test // DATAMONGO-2002
354355
public void shouldEqualForSamePattern() {
355356

357+
Criteria left = new Criteria("field").regex("foo");
358+
Criteria right = new Criteria("field").regex("foo");
359+
360+
assertThat(left).isEqualTo(right);
361+
}
362+
363+
@Test // DATAMONGO-2002
364+
public void shouldEqualForSamePatternAndFlags() {
365+
356366
Criteria left = new Criteria("field").regex("foo", "iu");
357367
Criteria right = new Criteria("field").regex("foo");
358368

359369
assertThat(left).isNotEqualTo(right);
360370
}
371+
372+
@Test // GH-3414
373+
public void shouldEqualForNestedPattern() {
374+
375+
Criteria left = new Criteria("a").orOperator(
376+
new Criteria("foo").regex("value", "i"),
377+
new Criteria("bar").regex("value")
378+
);
379+
Criteria right = new Criteria("a").orOperator(
380+
new Criteria("foo").regex("value", "i"),
381+
new Criteria("bar").regex("value")
382+
);
383+
384+
assertThat(left).isEqualTo(right);
385+
}
361386
}

0 commit comments

Comments
 (0)