From 99eefe0773b2357f9223c4d60fabf5a107902891 Mon Sep 17 00:00:00 2001 From: Thomas Darimont Date: Thu, 30 Jan 2014 14:59:48 +0100 Subject: [PATCH] DATAMONGO-838 - Cannot refer to expression based field in group operation. Previously we didn't set a proper target value for the generated expression field. As a potential fix we just use the alias as the target field. Original pull request: #116. --- .../core/aggregation/ProjectionOperation.java | 2 +- .../aggregation/AggregationUnitTests.java | 20 ++++++++++++++++++- 2 files changed, 20 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 cf8093cee..bbc89bc0f 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 @@ -262,7 +262,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation { @Override public ProjectionOperation as(String alias) { - Field expressionField = Fields.field(alias, "expr"); + Field expressionField = Fields.field(alias, alias); return this.operation.and(new ExpressionProjection(expressionField, this.value.toString(), params)); } 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 06ee8a1c4..dae68fda1 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 @@ -1,5 +1,5 @@ /* - * Copyright 2013 the original author or authors. + * Copyright 2013-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import com.mongodb.BasicDBObject; import com.mongodb.DBObject; /** @@ -161,4 +162,21 @@ public class AggregationUnitTests { assertThat(fields.get("aCnt"), is((Object) 1)); assertThat(fields.get("a"), is((Object) "$_id.a")); } + + /** + * @see DATAMONGO-838 + */ + @Test + public void expressionBasedFieldsShouldBeReferencableInFollowingOperations() { + + DBObject agg = newAggregation( // + project("a").andExpression("b+c").as("foo"), // + group("a").sum("foo").as("foosum") // + ).toDbObject("foo", Aggregation.DEFAULT_CONTEXT); + + @SuppressWarnings("unchecked") + DBObject secondProjection = ((List) agg.get("pipeline")).get(1); + DBObject fields = getAsDBObject(secondProjection, "$group"); + assertThat(fields.get("foosum"), is((Object) new BasicDBObject("$sum", "$foo"))); + } }