From f3929840a3ae30b10ca4320888ccac8fb3f277ad Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 25 Jul 2024 13:39:33 +0200 Subject: [PATCH] Expose output of `SetWindowFieldsOperation` correctly to next aggregation stage. This commit makes sure to expose calculated output fields correctly. Original pull request #4751 Closes #4745 --- .../aggregation/SetWindowFieldsOperation.java | 2 +- .../SetWindowFieldsOperationTests.java | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/SetWindowFieldsOperation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/SetWindowFieldsOperation.java index ee90b12f9..a01c08121 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/SetWindowFieldsOperation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/SetWindowFieldsOperation.java @@ -70,7 +70,7 @@ public class SetWindowFieldsOperation @Override public ExposedFields getFields() { - return ExposedFields.nonSynthetic(Fields.from(output.fields.toArray(new Field[0]))); + return ExposedFields.synthetic(Fields.from(output.fields.toArray(new Field[0]))); } @Override diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/SetWindowFieldsOperationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/SetWindowFieldsOperationTests.java index 2ed243df6..97a5faf1c 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/SetWindowFieldsOperationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/SetWindowFieldsOperationTests.java @@ -73,6 +73,29 @@ class SetWindowFieldsOperationTests { 238, 378); } + @Test // GH-4745 + void exposesFieldsToNextStageCorrectly() { + + initCakeSales(); + + SetWindowFieldsOperation setWindowFieldsOperation = SetWindowFieldsOperation.builder() // + .partitionByField("state") // resolves to field ref "$state" + .sortBy(Sort.by(Direction.ASC, "date")) // resolves to "orderDate" + .output(AccumulatorOperators.valueOf("qty").sum()) // resolves to "$quantity" + .within(Windows.documents().fromUnbounded().toCurrent().build()) // + .as("cumulativeQuantityForState") // + .build(); // + + AggregationResults results = mongoTemplate.aggregateAndReturn(Document.class) + .by(Aggregation.newAggregation(CakeSale.class, setWindowFieldsOperation, + /* and now project on the field to see it can be referenced */ + Aggregation.project("cumulativeQuantityForState"))) + .all(); + + assertThat(results.getMappedResults()).map(it -> it.get("cumulativeQuantityForState")).contains(162, 282, 427, 134, + 238, 378); + } + @Test // GH-3711 void executesSetWindowFieldsOperationWithPartitionExpressionCorrectly() {