Skip to content

Commit f429484

Browse files
committed
Handle nested Pattern in Criteria equals
Closes spring-projects#3414
1 parent 9d74734 commit f429484

File tree

2 files changed

+57
-2
lines changed

2 files changed

+57
-2
lines changed

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

+32-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
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;
2526
import java.util.Map.Entry;
@@ -59,6 +60,7 @@
5960
* @author Mark Paluch
6061
* @author Andreas Zink
6162
* @author Ziemowit Stolarczyk
63+
* @author Clément Petit
6264
*/
6365
public class Criteria implements CriteriaDefinition {
6466

@@ -976,9 +978,9 @@ private boolean isEqual(Object left, Object right) {
976978
return right == null;
977979
}
978980

979-
if (Pattern.class.isInstance(left)) {
981+
if (left instanceof Pattern) {
980982

981-
if (!Pattern.class.isInstance(right)) {
983+
if (!(right instanceof Pattern)) {
982984
return false;
983985
}
984986

@@ -989,6 +991,34 @@ private boolean isEqual(Object left, Object right) {
989991
&& leftPattern.flags() == rightPattern.flags();
990992
}
991993

994+
if (left instanceof Document) {
995+
if (!(right instanceof Document)) {
996+
return false;
997+
}
998+
Document leftDocument = (Document) left;
999+
Document rightDocument = (Document) right;
1000+
1001+
return isEqual(leftDocument.values(), rightDocument.values());
1002+
}
1003+
1004+
if (Collection.class.isAssignableFrom(left.getClass())) {
1005+
if (!Collection.class.isAssignableFrom(right.getClass())) {
1006+
return false;
1007+
}
1008+
1009+
Collection leftCollection = (Collection) left;
1010+
Collection rightCollection = (Collection) right;
1011+
Iterator leftIterator = leftCollection.iterator();
1012+
Iterator rightIterator = rightCollection.iterator();
1013+
1014+
while (leftIterator.hasNext() && rightIterator.hasNext()) {
1015+
if (!isEqual(leftIterator.next(), rightIterator.next())) {
1016+
return false;
1017+
}
1018+
}
1019+
return !leftIterator.hasNext() && !rightIterator.hasNext();
1020+
}
1021+
9921022
return ObjectUtils.nullSafeEquals(left, right);
9931023
}
9941024

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)