diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ArrayOperators.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ArrayOperators.java index d6346baaa..b26a34053 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ArrayOperators.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ArrayOperators.java @@ -230,8 +230,8 @@ public class ArrayOperators { @Override public Reduce startingWith(Object initialValue) { - return (usesFieldRef() ? Reduce.arrayOf(fieldReference) : Reduce.arrayOf(expression)) - .withInitialValue(initialValue).reduce(expression); + return (usesFieldRef() ? Reduce.arrayOf(fieldReference) + : Reduce.arrayOf(ArrayOperatorFactory.this.expression)).withInitialValue(initialValue).reduce(expression); } }; } @@ -1114,12 +1114,10 @@ public class ArrayOperators { /** * Start creating new {@link Reduce}. * - * @param expression must not be {@literal null}. + * @param arrayValueExpression must not be {@literal null}. * @return */ - public static InitialValueBuilder arrayOf(final AggregationExpression expression) { - - Assert.notNull(expression, "AggregationExpression must not be null"); + public static InitialValueBuilder arrayOf(final AggregationExpression arrayValueExpression) { return new InitialValueBuilder() { @@ -1134,14 +1132,14 @@ public class ArrayOperators { public Reduce reduce(AggregationExpression expression) { Assert.notNull(expression, "AggregationExpression must not be null"); - return new Reduce(expression, initialValue, Collections.singletonList(expression)); + return new Reduce(arrayValueExpression, initialValue, Collections.singletonList(expression)); } @Override public Reduce reduce(PropertyExpression... expressions) { Assert.notNull(expressions, "PropertyExpressions must not be null"); - return new Reduce(expression, initialValue, Arrays. asList(expressions)); + return new Reduce(arrayValueExpression, initialValue, Arrays. asList(expressions)); } }; } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperationUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperationUnitTests.java index 668f1feb1..f3ee23d94 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperationUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperationUnitTests.java @@ -32,10 +32,13 @@ import org.hamcrest.Matchers; import org.junit.Test; import org.springframework.data.domain.Range; import org.springframework.data.mongodb.core.DBObjectTestUtils; +import org.springframework.data.mongodb.core.aggregation.ArrayOperators.Reduce; import org.springframework.data.mongodb.core.aggregation.ArrayOperators.Reduce.PropertyExpression; import org.springframework.data.mongodb.core.aggregation.ArrayOperators.Reduce.Variable; +import org.springframework.data.mongodb.core.aggregation.ArrayOperators.Slice; import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Switch.CaseOperator; import org.springframework.data.mongodb.core.aggregation.ProjectionOperation.ProjectionOperationBuilder; +import org.springframework.data.mongodb.core.aggregation.StringOperators.Concat; import org.springframework.data.mongodb.core.aggregation.VariableOperators.Let.ExpressionVariable; import com.mongodb.BasicDBObject; @@ -45,7 +48,7 @@ import com.mongodb.util.JSON; /** * Unit tests for {@link ProjectionOperation}. - * + * * @author Oliver Gierke * @author Thomas Darimont * @author Christoph Strobl @@ -1568,6 +1571,27 @@ public class ProjectionOperationUnitTests { "{ $project : { \"results\": { $reduce: { input: \"$probabilityArr\", initialValue: { \"sum\" : 5 , \"product\" : 2} , in: { \"sum\": { $add : [\"$$value.sum\", \"$$this\"] }, \"product\": { $multiply: [ \"$$value.product\", \"$$this\" ] } } } } } }"))); } + @Test // DATAMONGO-1843 + public void shouldRenderReduceWithInputAndInExpressionsCorrectly() { + + DBObject exprected = (DBObject) JSON.parse( + "{ \"$project\" : { \"results\" : { \"$reduce\" : { \"input\" : { \"$slice\" : [\"$array\", 5] }, \"initialValue\" : \"\", \"in\" : { \"$concat\" : [\"$$value\", \"/\", \"$$this\"] } } } } }"); + + Reduce reduceEntryPoint = Reduce.arrayOf(Slice.sliceArrayOf("array").itemCount(5)) // + .withInitialValue("") // + .reduce(Concat.valueOf("$$value").concat("/").concatValueOf("$$this")); + + Reduce arrayEntryPoint = ArrayOperators.arrayOf(Slice.sliceArrayOf("array").itemCount(5)) // + .reduce(Concat.valueOf("$$value").concat("/").concatValueOf("$$this")) // + .startingWith(""); + + assertThat(project().and(reduceEntryPoint).as("results").toDBObject(Aggregation.DEFAULT_CONTEXT), + Matchers.is(exprected)); + + assertThat(project().and(arrayEntryPoint).as("results").toDBObject(Aggregation.DEFAULT_CONTEXT), + Matchers.is(exprected)); + } + @Test // DATAMONGO-1548 public void shouldRenderZipCorrectly() {