diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java index c637f54c4..b0a1b4989 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java @@ -973,7 +973,7 @@ public class Criteria implements CriteriaDefinition { * @param right * @return */ - private boolean isEqual(Object left, Object right) { + private boolean isEqual(@Nullable Object left, @Nullable Object right) { if (left == null) { return right == null; @@ -993,42 +993,48 @@ public class Criteria implements CriteriaDefinition { } if (left instanceof Document) { + if (!(right instanceof Document)) { return false; } + Document leftDocument = (Document) left; Document rightDocument = (Document) right; - Iterator leftIterator = leftDocument.entrySet().iterator(); - Iterator rightIterator = rightDocument.entrySet().iterator(); + Iterator> leftIterator = leftDocument.entrySet().iterator(); + Iterator> rightIterator = rightDocument.entrySet().iterator(); while (leftIterator.hasNext() && rightIterator.hasNext()) { - Map.Entry leftEntry = (Map.Entry)leftIterator.next(); - Map.Entry rightEntry = (Map.Entry)rightIterator.next(); - if (!isEqual(leftEntry.getKey(), rightEntry.getKey())) { - return false; - } - if (!isEqual(leftEntry.getValue(), rightEntry.getValue())) { + + Map.Entry leftEntry = leftIterator.next(); + Map.Entry rightEntry = rightIterator.next(); + + if (!isEqual(leftEntry.getKey(), rightEntry.getKey()) + || !isEqual(leftEntry.getValue(), rightEntry.getValue())) { return false; } } + return !leftIterator.hasNext() && !rightIterator.hasNext(); } if (Collection.class.isAssignableFrom(left.getClass())) { + if (!Collection.class.isAssignableFrom(right.getClass())) { return false; } - Collection leftCollection = (Collection) left; - Collection rightCollection = (Collection) right; - Iterator leftIterator = leftCollection.iterator(); - Iterator rightIterator = rightCollection.iterator(); + Collection leftCollection = (Collection) left; + Collection rightCollection = (Collection) right; + Iterator leftIterator = leftCollection.iterator(); + Iterator rightIterator = rightCollection.iterator(); while (leftIterator.hasNext() && rightIterator.hasNext()) { + if (!isEqual(leftIterator.next(), rightIterator.next())) { return false; } } + return !leftIterator.hasNext() && !rightIterator.hasNext(); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaUnitTests.java index 6d0c3a167..9edf3c43f 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaUnitTests.java @@ -39,6 +39,7 @@ import org.springframework.data.mongodb.core.schema.MongoJsonSchema; * @author Andreas Zink * @author Ziemowit Stolarczyk * @author Clément Petit + * @author Mark Paluch */ public class CriteriaUnitTests { @@ -361,6 +362,45 @@ public class CriteriaUnitTests { } @Test // DATAMONGO-2002 + public void shouldEqualForDocument() { + + assertThat(new Criteria("field").is(new Document("one", 1).append("two", "two").append("null", null))) + .isEqualTo(new Criteria("field").is(new Document("one", 1).append("two", "two").append("null", null))); + + assertThat(new Criteria("field").is(new Document("one", 1).append("two", "two").append("null", null))) + .isNotEqualTo(new Criteria("field").is(new Document("one", 1).append("two", "two"))); + + assertThat(new Criteria("field").is(new Document("one", 1).append("two", "two"))) + .isNotEqualTo(new Criteria("field").is(new Document("one", 1).append("two", "two").append("null", null))); + + assertThat(new Criteria("field").is(new Document("one", 1).append("null", null).append("two", "two"))) + .isNotEqualTo(new Criteria("field").is(new Document("one", 1).append("two", "two").append("null", null))); + + assertThat(new Criteria("field").is(new Document())).isNotEqualTo(new Criteria("field").is("foo")); + assertThat(new Criteria("field").is("foo")).isNotEqualTo(new Criteria("field").is(new Document())); + } + + @Test // DATAMONGO-2002 + public void shouldEqualForCollection() { + + assertThat(new Criteria("field").is(Arrays.asList("foo", "bar"))) + .isEqualTo(new Criteria("field").is(Arrays.asList("foo", "bar"))); + + assertThat(new Criteria("field").is(Arrays.asList("foo", 1))) + .isNotEqualTo(new Criteria("field").is(Arrays.asList("foo", "bar"))); + + assertThat(new Criteria("field").is(Collections.singletonList("foo"))) + .isNotEqualTo(new Criteria("field").is(Arrays.asList("foo", "bar"))); + + assertThat(new Criteria("field").is(Arrays.asList("foo", "bar"))) + .isNotEqualTo(new Criteria("field").is(Collections.singletonList("foo"))); + + assertThat(new Criteria("field").is(Arrays.asList("foo", "bar"))).isNotEqualTo(new Criteria("field").is("foo")); + + assertThat(new Criteria("field").is("foo")).isNotEqualTo(new Criteria("field").is(Arrays.asList("foo", "bar"))); + } + + @Test // GH-3414 public void shouldEqualForSamePatternAndFlags() { Criteria left = new Criteria("field").regex("foo", "iu");