Browse Source

Handle nested Pattern and Document in Criteria.equals(…).

Closes #3414
Original pull request: #3615.
pull/3632/head
Clement Petit 5 years ago committed by Mark Paluch
parent
commit
2885c35511
No known key found for this signature in database
GPG Key ID: 4406B84C1661DCD1
  1. 47
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java
  2. 25
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaUnitTests.java

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

@ -20,8 +20,10 @@ import static org.springframework.util.ObjectUtils.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -59,6 +61,7 @@ import com.mongodb.BasicDBList;
* @author Mark Paluch * @author Mark Paluch
* @author Andreas Zink * @author Andreas Zink
* @author Ziemowit Stolarczyk * @author Ziemowit Stolarczyk
* @author Clément Petit
*/ */
public class Criteria implements CriteriaDefinition { public class Criteria implements CriteriaDefinition {
@ -976,9 +979,9 @@ public class Criteria implements CriteriaDefinition {
return right == null; return right == null;
} }
if (Pattern.class.isInstance(left)) { if (left instanceof Pattern) {
if (!Pattern.class.isInstance(right)) { if (!(right instanceof Pattern)) {
return false; return false;
} }
@ -989,6 +992,46 @@ public class Criteria implements CriteriaDefinition {
&& leftPattern.flags() == rightPattern.flags(); && leftPattern.flags() == rightPattern.flags();
} }
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();
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())) {
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();
while (leftIterator.hasNext() && rightIterator.hasNext()) {
if (!isEqual(leftIterator.next(), rightIterator.next())) {
return false;
}
}
return !leftIterator.hasNext() && !rightIterator.hasNext();
}
return ObjectUtils.nullSafeEquals(left, right); return ObjectUtils.nullSafeEquals(left, right);
} }

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

@ -38,6 +38,7 @@ import org.springframework.data.mongodb.core.schema.MongoJsonSchema;
* @author Christoph Strobl * @author Christoph Strobl
* @author Andreas Zink * @author Andreas Zink
* @author Ziemowit Stolarczyk * @author Ziemowit Stolarczyk
* @author Clément Petit
*/ */
public class CriteriaUnitTests { public class CriteriaUnitTests {
@ -353,9 +354,33 @@ public class CriteriaUnitTests {
@Test // DATAMONGO-2002 @Test // DATAMONGO-2002
public void shouldEqualForSamePattern() { public void shouldEqualForSamePattern() {
Criteria left = new Criteria("field").regex("foo");
Criteria right = new Criteria("field").regex("foo");
assertThat(left).isEqualTo(right);
}
@Test // DATAMONGO-2002
public void shouldEqualForSamePatternAndFlags() {
Criteria left = new Criteria("field").regex("foo", "iu"); Criteria left = new Criteria("field").regex("foo", "iu");
Criteria right = new Criteria("field").regex("foo"); Criteria right = new Criteria("field").regex("foo");
assertThat(left).isNotEqualTo(right); assertThat(left).isNotEqualTo(right);
} }
@Test // GH-3414
public void shouldEqualForNestedPattern() {
Criteria left = new Criteria("a").orOperator(
new Criteria("foo").regex("value", "i"),
new Criteria("bar").regex("value")
);
Criteria right = new Criteria("a").orOperator(
new Criteria("foo").regex("value", "i"),
new Criteria("bar").regex("value")
);
assertThat(left).isEqualTo(right);
}
} }

Loading…
Cancel
Save