Browse Source

Polishing.

Fix nullability annotations for isEqual(…) parameters. Fix generics. Reformat code.

Add tests.

See #3414
Original pull request: #3615.
pull/3632/head
Mark Paluch 5 years ago
parent
commit
e4030197e8
No known key found for this signature in database
GPG Key ID: 4406B84C1661DCD1
  1. 32
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java
  2. 40
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaUnitTests.java

32
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 * @param right
* @return * @return
*/ */
private boolean isEqual(Object left, Object right) { private boolean isEqual(@Nullable Object left, @Nullable Object right) {
if (left == null) { if (left == null) {
return right == null; return right == null;
@ -993,42 +993,48 @@ public class Criteria implements CriteriaDefinition {
} }
if (left instanceof Document) { if (left instanceof Document) {
if (!(right instanceof Document)) { if (!(right instanceof Document)) {
return false; return false;
} }
Document leftDocument = (Document) left; Document leftDocument = (Document) left;
Document rightDocument = (Document) right; Document rightDocument = (Document) right;
Iterator leftIterator = leftDocument.entrySet().iterator(); Iterator<Entry<String, Object>> leftIterator = leftDocument.entrySet().iterator();
Iterator rightIterator = rightDocument.entrySet().iterator(); Iterator<Entry<String, Object>> rightIterator = rightDocument.entrySet().iterator();
while (leftIterator.hasNext() && rightIterator.hasNext()) { while (leftIterator.hasNext() && rightIterator.hasNext()) {
Map.Entry leftEntry = (Map.Entry)leftIterator.next();
Map.Entry rightEntry = (Map.Entry)rightIterator.next(); Map.Entry<String, Object> leftEntry = leftIterator.next();
if (!isEqual(leftEntry.getKey(), rightEntry.getKey())) { Map.Entry<String, Object> rightEntry = rightIterator.next();
return false;
} if (!isEqual(leftEntry.getKey(), rightEntry.getKey())
if (!isEqual(leftEntry.getValue(), rightEntry.getValue())) { || !isEqual(leftEntry.getValue(), rightEntry.getValue())) {
return false; return false;
} }
} }
return !leftIterator.hasNext() && !rightIterator.hasNext(); return !leftIterator.hasNext() && !rightIterator.hasNext();
} }
if (Collection.class.isAssignableFrom(left.getClass())) { if (Collection.class.isAssignableFrom(left.getClass())) {
if (!Collection.class.isAssignableFrom(right.getClass())) { if (!Collection.class.isAssignableFrom(right.getClass())) {
return false; return false;
} }
Collection leftCollection = (Collection) left; Collection<?> leftCollection = (Collection<?>) left;
Collection rightCollection = (Collection) right; Collection<?> rightCollection = (Collection<?>) right;
Iterator leftIterator = leftCollection.iterator(); Iterator<?> leftIterator = leftCollection.iterator();
Iterator rightIterator = rightCollection.iterator(); Iterator<?> rightIterator = rightCollection.iterator();
while (leftIterator.hasNext() && rightIterator.hasNext()) { while (leftIterator.hasNext() && rightIterator.hasNext()) {
if (!isEqual(leftIterator.next(), rightIterator.next())) { if (!isEqual(leftIterator.next(), rightIterator.next())) {
return false; return false;
} }
} }
return !leftIterator.hasNext() && !rightIterator.hasNext(); return !leftIterator.hasNext() && !rightIterator.hasNext();
} }

40
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 Andreas Zink
* @author Ziemowit Stolarczyk * @author Ziemowit Stolarczyk
* @author Clément Petit * @author Clément Petit
* @author Mark Paluch
*/ */
public class CriteriaUnitTests { public class CriteriaUnitTests {
@ -361,6 +362,45 @@ public class CriteriaUnitTests {
} }
@Test // DATAMONGO-2002 @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() { public void shouldEqualForSamePatternAndFlags() {
Criteria left = new Criteria("field").regex("foo", "iu"); Criteria left = new Criteria("field").regex("foo", "iu");

Loading…
Cancel
Save