Skip to content

Commit caa2dd4

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

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;
@@ -58,6 +60,7 @@
5860
* @author Christoph Strobl
5961
* @author Mark Paluch
6062
* @author Andreas Zink
63+
* @author Clément Petit
6164
*/
6265
public class Criteria implements CriteriaDefinition {
6366

@@ -901,9 +904,9 @@ private boolean isEqual(Object left, Object right) {
901904
return right == null;
902905
}
903906

904-
if (Pattern.class.isInstance(left)) {
907+
if (left instanceof Pattern) {
905908

906-
if (!Pattern.class.isInstance(right)) {
909+
if (!(right instanceof Pattern)) {
907910
return false;
908911
}
909912

@@ -914,6 +917,46 @@ private boolean isEqual(Object left, Object right) {
914917
&& leftPattern.flags() == rightPattern.flags();
915918
}
916919

920+
if (left instanceof Document) {
921+
if (!(right instanceof Document)) {
922+
return false;
923+
}
924+
Document leftDocument = (Document) left;
925+
Document rightDocument = (Document) right;
926+
Iterator leftIterator = leftDocument.entrySet().iterator();
927+
Iterator rightIterator = rightDocument.entrySet().iterator();
928+
929+
while (leftIterator.hasNext() && rightIterator.hasNext()) {
930+
Map.Entry leftEntry = (Map.Entry)leftIterator.next();
931+
Map.Entry rightEntry = (Map.Entry)rightIterator.next();
932+
if (!isEqual(leftEntry.getKey(), rightEntry.getKey())) {
933+
return false;
934+
}
935+
if (!isEqual(leftEntry.getValue(), rightEntry.getValue())) {
936+
return false;
937+
}
938+
}
939+
return !leftIterator.hasNext() && !rightIterator.hasNext();
940+
}
941+
942+
if (Collection.class.isAssignableFrom(left.getClass())) {
943+
if (!Collection.class.isAssignableFrom(right.getClass())) {
944+
return false;
945+
}
946+
947+
Collection leftCollection = (Collection) left;
948+
Collection rightCollection = (Collection) right;
949+
Iterator leftIterator = leftCollection.iterator();
950+
Iterator rightIterator = rightCollection.iterator();
951+
952+
while (leftIterator.hasNext() && rightIterator.hasNext()) {
953+
if (!isEqual(leftIterator.next(), rightIterator.next())) {
954+
return false;
955+
}
956+
}
957+
return !leftIterator.hasNext() && !rightIterator.hasNext();
958+
}
959+
917960
return ObjectUtils.nullSafeEquals(left, right);
918961
}
919962

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

+25
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
* @author Thomas Darimont
3535
* @author Christoph Strobl
3636
* @author Andreas Zink
37+
* @author Clément Petit
3738
*/
3839
public class CriteriaUnitTests {
3940

@@ -310,9 +311,33 @@ public void shouldAppendBitsAnySetWithPositionListCorrectly() {
310311
@Test // DATAMONGO-2002
311312
public void shouldEqualForSamePattern() {
312313

314+
Criteria left = new Criteria("field").regex("foo");
315+
Criteria right = new Criteria("field").regex("foo");
316+
317+
assertThat(left).isEqualTo(right);
318+
}
319+
320+
@Test // DATAMONGO-2002
321+
public void shouldEqualForSamePatternAndFlags() {
322+
313323
Criteria left = new Criteria("field").regex("foo", "iu");
314324
Criteria right = new Criteria("field").regex("foo");
315325

316326
assertThat(left).isNotEqualTo(right);
317327
}
328+
329+
@Test // GH-3414
330+
public void shouldEqualForNestedPattern() {
331+
332+
Criteria left = new Criteria("a").orOperator(
333+
new Criteria("foo").regex("value", "i"),
334+
new Criteria("bar").regex("value")
335+
);
336+
Criteria right = new Criteria("a").orOperator(
337+
new Criteria("foo").regex("value", "i"),
338+
new Criteria("bar").regex("value")
339+
);
340+
341+
assertThat(left).isEqualTo(right);
342+
}
318343
}

0 commit comments

Comments
 (0)