Browse Source

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
pull/4773/head
Christoph Strobl 1 year ago committed by Mark Paluch
parent
commit
f3929840a3
No known key found for this signature in database
GPG Key ID: 55BC6374BAA9D973
  1. 2
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/SetWindowFieldsOperation.java
  2. 23
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/SetWindowFieldsOperationTests.java

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

@ -70,7 +70,7 @@ public class SetWindowFieldsOperation
@Override @Override
public ExposedFields getFields() { 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 @Override

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

@ -73,6 +73,29 @@ class SetWindowFieldsOperationTests {
238, 378); 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<Document> 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 @Test // GH-3711
void executesSetWindowFieldsOperationWithPartitionExpressionCorrectly() { void executesSetWindowFieldsOperationWithPartitionExpressionCorrectly() {

Loading…
Cancel
Save