Skip to content

Commit e403019

Browse files
committed
Polishing.
Fix nullability annotations for isEqual(…) parameters. Fix generics. Reformat code. Add tests. See #3414 Original pull request: #3615.
1 parent 2885c35 commit e403019

File tree

2 files changed

+59
-13
lines changed

2 files changed

+59
-13
lines changed

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

+19-13
Original file line numberDiff line numberDiff line change
@@ -973,7 +973,7 @@ private boolean simpleCriteriaEquals(Criteria left, Criteria right) {
973973
* @param right
974974
* @return
975975
*/
976-
private boolean isEqual(Object left, Object right) {
976+
private boolean isEqual(@Nullable Object left, @Nullable Object right) {
977977

978978
if (left == null) {
979979
return right == null;
@@ -993,42 +993,48 @@ private boolean isEqual(Object left, Object right) {
993993
}
994994

995995
if (left instanceof Document) {
996+
996997
if (!(right instanceof Document)) {
997998
return false;
998999
}
1000+
9991001
Document leftDocument = (Document) left;
10001002
Document rightDocument = (Document) right;
1001-
Iterator leftIterator = leftDocument.entrySet().iterator();
1002-
Iterator rightIterator = rightDocument.entrySet().iterator();
1003+
Iterator<Entry<String, Object>> leftIterator = leftDocument.entrySet().iterator();
1004+
Iterator<Entry<String, Object>> rightIterator = rightDocument.entrySet().iterator();
10031005

10041006
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())) {
1007+
1008+
Map.Entry<String, Object> leftEntry = leftIterator.next();
1009+
Map.Entry<String, Object> rightEntry = rightIterator.next();
1010+
1011+
if (!isEqual(leftEntry.getKey(), rightEntry.getKey())
1012+
|| !isEqual(leftEntry.getValue(), rightEntry.getValue())) {
10111013
return false;
10121014
}
10131015
}
1016+
10141017
return !leftIterator.hasNext() && !rightIterator.hasNext();
10151018
}
10161019

10171020
if (Collection.class.isAssignableFrom(left.getClass())) {
1021+
10181022
if (!Collection.class.isAssignableFrom(right.getClass())) {
10191023
return false;
10201024
}
10211025

1022-
Collection leftCollection = (Collection) left;
1023-
Collection rightCollection = (Collection) right;
1024-
Iterator leftIterator = leftCollection.iterator();
1025-
Iterator rightIterator = rightCollection.iterator();
1026+
Collection<?> leftCollection = (Collection<?>) left;
1027+
Collection<?> rightCollection = (Collection<?>) right;
1028+
Iterator<?> leftIterator = leftCollection.iterator();
1029+
Iterator<?> rightIterator = rightCollection.iterator();
10261030

10271031
while (leftIterator.hasNext() && rightIterator.hasNext()) {
1032+
10281033
if (!isEqual(leftIterator.next(), rightIterator.next())) {
10291034
return false;
10301035
}
10311036
}
1037+
10321038
return !leftIterator.hasNext() && !rightIterator.hasNext();
10331039
}
10341040

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

+40
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
* @author Andreas Zink
4040
* @author Ziemowit Stolarczyk
4141
* @author Clément Petit
42+
* @author Mark Paluch
4243
*/
4344
public class CriteriaUnitTests {
4445

@@ -361,6 +362,45 @@ public void shouldEqualForSamePattern() {
361362
}
362363

363364
@Test // DATAMONGO-2002
365+
public void shouldEqualForDocument() {
366+
367+
assertThat(new Criteria("field").is(new Document("one", 1).append("two", "two").append("null", null)))
368+
.isEqualTo(new Criteria("field").is(new Document("one", 1).append("two", "two").append("null", null)));
369+
370+
assertThat(new Criteria("field").is(new Document("one", 1).append("two", "two").append("null", null)))
371+
.isNotEqualTo(new Criteria("field").is(new Document("one", 1).append("two", "two")));
372+
373+
assertThat(new Criteria("field").is(new Document("one", 1).append("two", "two")))
374+
.isNotEqualTo(new Criteria("field").is(new Document("one", 1).append("two", "two").append("null", null)));
375+
376+
assertThat(new Criteria("field").is(new Document("one", 1).append("null", null).append("two", "two")))
377+
.isNotEqualTo(new Criteria("field").is(new Document("one", 1).append("two", "two").append("null", null)));
378+
379+
assertThat(new Criteria("field").is(new Document())).isNotEqualTo(new Criteria("field").is("foo"));
380+
assertThat(new Criteria("field").is("foo")).isNotEqualTo(new Criteria("field").is(new Document()));
381+
}
382+
383+
@Test // DATAMONGO-2002
384+
public void shouldEqualForCollection() {
385+
386+
assertThat(new Criteria("field").is(Arrays.asList("foo", "bar")))
387+
.isEqualTo(new Criteria("field").is(Arrays.asList("foo", "bar")));
388+
389+
assertThat(new Criteria("field").is(Arrays.asList("foo", 1)))
390+
.isNotEqualTo(new Criteria("field").is(Arrays.asList("foo", "bar")));
391+
392+
assertThat(new Criteria("field").is(Collections.singletonList("foo")))
393+
.isNotEqualTo(new Criteria("field").is(Arrays.asList("foo", "bar")));
394+
395+
assertThat(new Criteria("field").is(Arrays.asList("foo", "bar")))
396+
.isNotEqualTo(new Criteria("field").is(Collections.singletonList("foo")));
397+
398+
assertThat(new Criteria("field").is(Arrays.asList("foo", "bar"))).isNotEqualTo(new Criteria("field").is("foo"));
399+
400+
assertThat(new Criteria("field").is("foo")).isNotEqualTo(new Criteria("field").is(Arrays.asList("foo", "bar")));
401+
}
402+
403+
@Test // GH-3414
364404
public void shouldEqualForSamePatternAndFlags() {
365405

366406
Criteria left = new Criteria("field").regex("foo", "iu");

0 commit comments

Comments
 (0)