Skip to content

Commit 5517198

Browse files
MikhailKaduchkachristophstrobl
authored andcommitted
DATAMONGO-2228 - Fixed loosing branches in AND expressions in MongodbDocumentSerializer.
Original Pull Request: #661
1 parent 819a04f commit 5517198

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongodbDocumentSerializer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import java.util.LinkedHashSet;
2121
import java.util.List;
2222
import java.util.Map;
23-
import java.util.Map.Entry;
2423
import java.util.regex.Pattern;
2524

2625
import org.bson.BsonJavaScript;
@@ -49,6 +48,7 @@
4948
* @author laimw
5049
* @author Mark Paluch
5150
* @author Christoph Strobl
51+
* @author Mikhail Kaduchka
5252
* @since 2.1
5353
*/
5454
abstract class MongodbDocumentSerializer implements Visitor<Object, Void> {
@@ -184,8 +184,8 @@ public Object visit(Operation<?> expr, Void context) {
184184
Map<Object, Object> lhs = (Map<Object, Object>) handle(expr.getArg(0));
185185
Map<Object, Object> rhs = (Map<Object, Object>) handle(expr.getArg(1));
186186

187-
LinkedHashSet<Entry<Object, Object>> lhs2 = new LinkedHashSet<>(lhs.entrySet());
188-
lhs2.retainAll(rhs.entrySet());
187+
LinkedHashSet<Object> lhs2 = new LinkedHashSet<>(lhs.keySet());
188+
lhs2.retainAll(rhs.keySet());
189189

190190
if (lhs2.isEmpty()) {
191191
lhs.putAll(rhs);

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,16 @@
1515
*/
1616
package org.springframework.data.mongodb.repository.support;
1717

18+
import static com.querydsl.core.types.ExpressionUtils.path;
19+
import static com.querydsl.core.types.ExpressionUtils.predicate;
20+
import static com.querydsl.core.types.dsl.Expressions.*;
1821
import static org.hamcrest.Matchers.*;
1922
import static org.junit.Assert.*;
20-
import static org.springframework.data.mongodb.core.DocumentTestUtils.*;
2123

22-
import java.util.ArrayList;
2324
import java.util.Collections;
24-
import java.util.List;
2525

2626
import org.bson.Document;
2727
import org.bson.types.ObjectId;
28-
import org.hamcrest.collection.IsIterableContainingInOrder;
2928
import org.junit.Before;
3029
import org.junit.Test;
3130
import org.junit.runner.RunWith;
@@ -43,6 +42,8 @@
4342
import org.springframework.data.mongodb.repository.QAddress;
4443
import org.springframework.data.mongodb.repository.QPerson;
4544

45+
import com.querydsl.core.types.Ops;
46+
import com.querydsl.core.types.PredicateOperation;
4647
import com.querydsl.core.types.dsl.BooleanExpression;
4748
import com.querydsl.core.types.dsl.BooleanOperation;
4849
import com.querydsl.core.types.dsl.PathBuilder;
@@ -55,6 +56,7 @@
5556
* @author Oliver Gierke
5657
* @author Christoph Strobl
5758
* @author Mark Paluch
59+
* @author Mikhail Kaduchka
5860
*/
5961
@RunWith(MockitoJUnitRunner.class)
6062
public class SpringDataMongodbSerializerUnitTests {
@@ -192,6 +194,21 @@ public void shouldRemarshallListsAndDocuments() {
192194
+ "\"$ne\" : \"\"}}} , { \"firstname\" : { \"$not\" : { \"$regex\" : \".*\\\\Qfoo\\\\E.*\" , \"$options\" : \"i\"}}}]}"))));
193195
}
194196

197+
@Test // DATAMONGO-2228
198+
public void retainsOpsInAndExpression() {
199+
200+
PredicateOperation testExpression = predicate(Ops.AND,
201+
predicate(Ops.OR, predicate(Ops.EQ, path(Object.class, "firstname"), constant("John")),
202+
predicate(Ops.EQ, path(Object.class, "firstname"), constant("Sarah"))),
203+
predicate(Ops.OR, predicate(Ops.EQ, path(Object.class, "lastname"), constant("Smith")),
204+
predicate(Ops.EQ, path(Object.class, "lastname"), constant("Connor"))));
205+
206+
Document result = (Document) serializer.visit(testExpression, null);
207+
208+
assertThat(result.toJson(), is(
209+
"{\"$and\": [{\"$or\": [{\"firstname\": \"John\"}, {\"firstname\": \"Sarah\"}]}, {\"$or\": [{\"lastname\": \"Smith\"}, {\"lastname\": \"Connor\"}]}]}"));
210+
}
211+
195212
class Address {
196213
String id;
197214
String street;

0 commit comments

Comments
 (0)