Skip to content

Commit e5bba39

Browse files
christophstroblmp911de
authored andcommitted
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. Closes #3917 Original pull request: #4328
1 parent c2f708a commit e5bba39

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFieldsAggregationOperationContext.java

+19
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,25 @@ private FieldReference getReference(@Nullable Field field, String name) {
9696
return exposedField;
9797
}
9898

99+
if(rootContext instanceof RelaxedTypeBasedAggregationOperationContext) {
100+
return new DirectFieldReference(new ExposedField(new Field() {
101+
@Override
102+
public String getName() {
103+
return name;
104+
}
105+
106+
@Override
107+
public String getTarget() {
108+
return field != null ? field.getTarget() : name;
109+
}
110+
111+
@Override
112+
public boolean isAliased() {
113+
return true;
114+
}
115+
}, true));
116+
}
117+
99118
throw new IllegalArgumentException(String.format("Invalid reference '%s'", name));
100119
}
101120

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationUnitTests.java

+23
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.bson.Document;
3030
import org.junit.jupiter.api.Test;
3131
import org.springframework.data.annotation.Id;
32+
import org.springframework.data.domain.Sort;
3233
import org.springframework.data.domain.Sort.Direction;
3334
import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond;
3435
import org.springframework.data.mongodb.core.aggregation.ProjectionOperationUnitTests.BookWithFieldAnnotation;
@@ -629,6 +630,28 @@ void createsBasicAggregationOperationFromBson() {
629630
Document target = newAggregation(stage).toDocument("col-1", DEFAULT_CONTEXT);
630631
assertThat(extractPipelineElement(target, 0, "$project")).containsKey("name");
631632
}
633+
634+
@Test // GH-3917
635+
void inheritedFieldsExposingContextShouldNotFailOnUnknownFieldReferenceForRelaxedRootContext() {
636+
637+
List<AggregationOperation> aggregationOperations = new ArrayList<>();
638+
639+
GroupOperation groupOperation = Aggregation.group("_id", "label_name");
640+
aggregationOperations.add(groupOperation);
641+
642+
ProjectionOperation projectionOperation = Aggregation.project("label_name").andExclude("_id");
643+
aggregationOperations.add(projectionOperation);
644+
645+
Sort sort = Sort.by(Sort.Direction.DESC, "serial_number");
646+
SortOperation sortOperation = new SortOperation(sort).and(Sort.Direction.DESC, "label_name");
647+
aggregationOperations.add(sortOperation);
648+
649+
MongoMappingContext mappingContext = new MongoMappingContext();
650+
QueryMapper queryMapper = new QueryMapper(new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext));
651+
652+
List<Document> documents = newAggregation(City.class, aggregationOperations).toPipeline(new RelaxedTypeBasedAggregationOperationContext(City.class, mappingContext, queryMapper));
653+
assertThat(documents.get(2)).isEqualTo("{ $sort : { 'serial_number' : -1, 'label_name' : -1 } }");
654+
}
632655

633656
private Document extractPipelineElement(Document agg, int index, String operation) {
634657

0 commit comments

Comments
 (0)