Skip to content

Commit f3c744f

Browse files
DATAMONGO-2228 - Fixed loosing branches in AND expressions (MongodbDocumentSerializer)
1 parent 70098ae commit f3c744f

File tree

2 files changed

+27
-16
lines changed

2 files changed

+27
-16
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
* @author laimw
5050
* @author Mark Paluch
5151
* @author Christoph Strobl
52+
* @author Mikhail Kaduchka
5253
* @since 2.1
5354
*/
5455
abstract class MongodbDocumentSerializer implements Visitor<Object, Void> {
@@ -184,8 +185,8 @@ public Object visit(Operation<?> expr, Void context) {
184185
Map<Object, Object> lhs = (Map<Object, Object>) handle(expr.getArg(0));
185186
Map<Object, Object> rhs = (Map<Object, Object>) handle(expr.getArg(1));
186187

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

190191
if (lhs2.isEmpty()) {
191192
lhs.putAll(rhs);

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

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

18-
import static org.hamcrest.Matchers.*;
19-
import static org.junit.Assert.*;
20-
import static org.springframework.data.mongodb.core.DocumentTestUtils.*;
21-
22-
import java.util.ArrayList;
23-
import java.util.Collections;
24-
import java.util.List;
25-
18+
import com.querydsl.core.types.Ops;
19+
import com.querydsl.core.types.PredicateOperation;
20+
import com.querydsl.core.types.dsl.*;
2621
import org.bson.Document;
2722
import org.bson.types.ObjectId;
28-
import org.hamcrest.collection.IsIterableContainingInOrder;
2923
import org.junit.Before;
3024
import org.junit.Test;
3125
import org.junit.runner.RunWith;
@@ -43,18 +37,21 @@
4337
import org.springframework.data.mongodb.repository.QAddress;
4438
import org.springframework.data.mongodb.repository.QPerson;
4539

46-
import com.querydsl.core.types.dsl.BooleanExpression;
47-
import com.querydsl.core.types.dsl.BooleanOperation;
48-
import com.querydsl.core.types.dsl.PathBuilder;
49-
import com.querydsl.core.types.dsl.SimplePath;
50-
import com.querydsl.core.types.dsl.StringPath;
40+
import java.util.Collections;
41+
42+
import static com.querydsl.core.types.ExpressionUtils.path;
43+
import static com.querydsl.core.types.ExpressionUtils.predicate;
44+
import static com.querydsl.core.types.dsl.Expressions.constant;
45+
import static org.hamcrest.Matchers.*;
46+
import static org.junit.Assert.assertThat;
5147

5248
/**
5349
* Unit tests for {@link SpringDataMongodbSerializer}.
5450
*
5551
* @author Oliver Gierke
5652
* @author Christoph Strobl
5753
* @author Mark Paluch
54+
* @author Mikhail Kaduchka
5855
*/
5956
@RunWith(MockitoJUnitRunner.class)
6057
public class SpringDataMongodbSerializerUnitTests {
@@ -163,6 +160,19 @@ public void shouldRemarshallListsAndDocuments() {
163160
+ "\"$ne\" : \"\"}}} , { \"firstname\" : { \"$not\" : { \"$regex\" : \".*\\\\Qfoo\\\\E.*\" , \"$options\" : \"i\"}}}]}"))));
164161
}
165162

163+
@Test // DATAMONGO-2228
164+
public void retainsOpsInAndExpression() {
165+
166+
PredicateOperation testExpression = predicate(Ops.AND,
167+
predicate(Ops.EQ, path(Object.class, "name"), constant("John")),
168+
predicate(Ops.EQ, path(Object.class, "name"), constant("Sarah"))
169+
);
170+
171+
Document result = (Document) serializer.visit(testExpression, null);
172+
173+
assertThat(result.toJson(), is("{\"$and\": [{\"name\": \"John\"}, {\"name\": \"Sarah\"}]}"));
174+
}
175+
166176
class Address {
167177
String id;
168178
String street;

0 commit comments

Comments
 (0)