From cec6526543421d80c6447438e8110a9117fb86c8 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 13 Feb 2018 10:10:32 +0100 Subject: [PATCH] DATAMONGO-1871 - Fix AggregationExpression aliasing. We now make sure to allow a nested property alias by setting the target. Original pull request: #533. --- .../core/aggregation/ProjectionOperation.java | 2 +- .../core/aggregation/AggregationUnitTests.java | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperation.java index 2d868313f..320f2c032 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperation.java @@ -455,7 +455,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation { } if (value instanceof AggregationExpression) { - return this.operation.and(new ExpressionProjection(Fields.field(alias), (AggregationExpression) value)); + return this.operation.and(new ExpressionProjection(Fields.field(alias, alias), (AggregationExpression) value)); } return this.operation.and(new FieldProjection(Fields.field(alias, getRequiredName()), null)); 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 e6f6d378a..0ae99b89d 100644 --- 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 @@ -33,7 +33,6 @@ import org.junit.rules.ExpectedException; import org.springframework.data.domain.Sort.Direction; import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond; import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.test.util.BasicDbListBuilder; /** * Unit tests for {@link Aggregation}. @@ -569,6 +568,23 @@ public class AggregationUnitTests { is(equalTo(new Document("val", new Document("$add", Arrays.asList("$value1.value", "$value2.value")))))); } + @Test // DATAMONGO-1871 + public void providedAliasShouldAllowNestingExpressionWithAliasCorrectly() { + + Document condition = new Document("$and", + Arrays.asList(new Document("$gte", Arrays.asList("$$est.dt", "2015-12-29")), // + new Document("$lte", Arrays.asList("$$est.dt", "2017-12-29")) // + )); + + Aggregation agg = newAggregation(project("_id", "dId", "aId", "cty", "cat", "plts.plt") + .and(ArrayOperators.arrayOf("plts.ests").filter().as("est").by(condition)).as("plts.ests")); + + Document $project = extractPipelineElement(agg.toDocument("collection-1", Aggregation.DEFAULT_CONTEXT), 0, + "$project"); + + assertThat($project.containsKey("plts.ests"), is(true)); + } + private Document extractPipelineElement(Document agg, int index, String operation) { List pipeline = (List) agg.get("pipeline");