From 1f66c78fec37cba9eea9b3e6715d7f679069773e Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 10 Mar 2023 12:25:19 +0100 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 d864b2e4e6..24f8f5d5fa 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 4.1.0-SNAPSHOT + 4.1.x-GH-3917-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml index 1b2a1390e6..284c9764d8 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.1.0-SNAPSHOT + 4.1.x-GH-3917-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 8db8d798fb..33d31ac969 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.1.0-SNAPSHOT + 4.1.x-GH-3917-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 9a57f7eb52..2f98fd6760 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -13,7 +13,7 @@ org.springframework.data spring-data-mongodb-parent - 4.1.0-SNAPSHOT + 4.1.x-GH-3917-SNAPSHOT ../pom.xml From 409701873597f4689c0d8af48ee23bb1ba120a92 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 10 Mar 2023 12:25:30 +0100 Subject: [PATCH 2/2] Fix field resolution for ExposedFieldsAggregationContext. This commit fixes an issue where the context is not relaxed and errors on unknown fields if multiple stages of nesting contexts happen. --- ...osedFieldsAggregationOperationContext.java | 19 +++++++++++++++ .../aggregation/AggregationUnitTests.java | 23 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFieldsAggregationOperationContext.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFieldsAggregationOperationContext.java index 6572eabcf7..1a88175d76 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFieldsAggregationOperationContext.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFieldsAggregationOperationContext.java @@ -96,6 +96,25 @@ private FieldReference getReference(@Nullable Field field, String name) { return exposedField; } + if(rootContext instanceof RelaxedTypeBasedAggregationOperationContext) { + return new DirectFieldReference(new ExposedField(new Field() { + @Override + public String getName() { + return name; + } + + @Override + public String getTarget() { + return field != null ? field.getTarget() : name; + } + + @Override + public boolean isAliased() { + return true; + } + }, true)); + } + throw new IllegalArgumentException(String.format("Invalid reference '%s'", name)); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationUnitTests.java index 9670bcf039..64bd9a1412 100755 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationUnitTests.java @@ -29,6 +29,7 @@ import org.bson.Document; import org.junit.jupiter.api.Test; import org.springframework.data.annotation.Id; +import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond; import org.springframework.data.mongodb.core.aggregation.ProjectionOperationUnitTests.BookWithFieldAnnotation; @@ -629,6 +630,28 @@ void createsBasicAggregationOperationFromBson() { Document target = newAggregation(stage).toDocument("col-1", DEFAULT_CONTEXT); assertThat(extractPipelineElement(target, 0, "$project")).containsKey("name"); } + + @Test // GH-3917 + void inheritedFieldsExposingContextShouldNotFailOnUnknownFieldReferenceForRelaxedRootContext() { + + List aggregationOperations = new ArrayList<>(); + + GroupOperation groupOperation = Aggregation.group("_id", "label_name"); + aggregationOperations.add(groupOperation); + + ProjectionOperation projectionOperation = Aggregation.project("label_name").andExclude("_id"); + aggregationOperations.add(projectionOperation); + + Sort sort = Sort.by(Sort.Direction.DESC, "serial_number"); + SortOperation sortOperation = new SortOperation(sort).and(Sort.Direction.DESC, "label_name"); + aggregationOperations.add(sortOperation); + + MongoMappingContext mappingContext = new MongoMappingContext(); + QueryMapper queryMapper = new QueryMapper(new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext)); + + List documents = newAggregation(City.class, aggregationOperations).toPipeline(new RelaxedTypeBasedAggregationOperationContext(City.class, mappingContext, queryMapper)); + assertThat(documents.get(2)).isEqualTo("{ $sort : { 'serial_number' : -1, 'label_name' : -1 } }"); + } private Document extractPipelineElement(Document agg, int index, String operation) {