From bf1993747ddebe62691b3773270d1bc1e5e9263b Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 30 May 2022 10:06:04 +0200 Subject: [PATCH 1/2] Prepare issue branch. --- pom.xml | 2 +- spring-data-mongodb-benchmarks/pom.xml | 2 +- spring-data-mongodb-distribution/pom.xml | 2 +- spring-data-mongodb/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 79e5353b7f..14bd6fdac7 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 4.0.0-SNAPSHOT + 4.0.0-GH-4037-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml index c28a240d2c..523df6dc6d 100644 --- a/spring-data-mongodb-benchmarks/pom.xml +++ b/spring-data-mongodb-benchmarks/pom.xml @@ -7,7 +7,7 @@ org.springframework.data spring-data-mongodb-parent - 4.0.0-SNAPSHOT + 4.0.0-GH-4037-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 5dedcf81ed..d01e780c11 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -15,7 +15,7 @@ org.springframework.data spring-data-mongodb-parent - 4.0.0-SNAPSHOT + 4.0.0-GH-4037-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index b26a926c7a..a892f9368a 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -12,7 +12,7 @@ org.springframework.data spring-data-mongodb-parent - 4.0.0-SNAPSHOT + 4.0.0-GH-4037-SNAPSHOT ../pom.xml From 296078a7147cf1ed0a59e82334822e3c61e0a67e Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 30 May 2022 11:34:08 +0200 Subject: [PATCH 2/2] Support DocumentReference via Querydsl. --- .../support/SpringDataMongodbSerializer.java | 17 ++++++++++++--- .../SpringDataMongodbSerializerUnitTests.java | 21 +++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java index 377a985392..69a22f3fdd 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java @@ -22,7 +22,6 @@ import java.util.regex.Pattern; import org.bson.Document; - import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mongodb.core.convert.MongoConverter; import org.springframework.data.mongodb.core.convert.QueryMapper; @@ -158,8 +157,20 @@ protected Object convert(@Nullable Path path, @Nullable Constant constant) MongoPersistentProperty property = getPropertyFor(path); - return property.isIdProperty() ? asReference(constant.getConstant(), path.getMetadata().getParent()) - : asReference(constant.getConstant(), path); + if (property.isDocumentReference()) { + return converter.toDocumentPointer(constant.getConstant(), property).getPointer(); + } + + if (property.isIdProperty()) { + + MongoPersistentProperty propertyForPotentialDbRef = getPropertyForPotentialDbRef(path); + if (propertyForPotentialDbRef != null && propertyForPotentialDbRef.isDocumentReference()) { + return converter.toDocumentPointer(constant.getConstant(), propertyForPotentialDbRef).getPointer(); + } + return asReference(constant.getConstant(), path.getMetadata().getParent()); + } + + return asReference(constant.getConstant(), path); } @Nullable diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java index 49c2d3a798..46fe10e3a1 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java @@ -50,6 +50,7 @@ import com.querydsl.core.types.dsl.PathBuilder; import com.querydsl.core.types.dsl.SimplePath; import com.querydsl.core.types.dsl.StringPath; +import org.springframework.data.mongodb.repository.User; /** * Unit tests for {@link SpringDataMongodbSerializer}. @@ -225,6 +226,26 @@ void chainMultipleAndFlattensCorrectly() { assertThat(serializer.handle(testExpression)).isEqualTo(expected); } + @Test // GH-4037 + void parsesDocumentReference() { + + User user = new User(); + user.setId("007"); + Predicate predicate = QPerson.person.spiritAnimal.eq(user); + + assertThat(serializer.handle(predicate)).isEqualTo(Document.parse("{ 'spiritAnimal' : '007' }")); + } + + @Test // GH-4037 + void parsesDocumentReferenceOnId() { + + User user = new User(); + user.setId("007"); + Predicate predicate = QPerson.person.spiritAnimal.id.eq("007"); + + assertThat(serializer.handle(predicate)).isEqualTo(Document.parse("{ 'spiritAnimal' : '007' }")); + } + class Address { String id; String street;