Skip to content

Commit d3a54e7

Browse files
christophstroblmp911de
authored andcommitted
DATAMONGO-1843 - Fix parameter shadowing in ArrayOperators reduce.
Original pull request: spring-projects#526.
1 parent 95def1f commit d3a54e7

File tree

2 files changed

+30
-8
lines changed

2 files changed

+30
-8
lines changed

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

+6-8
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,8 @@ public ArrayOperatorFactory.ReduceInitialValueBuilder reduce(final AggregationEx
229229

230230
@Override
231231
public Reduce startingWith(Object initialValue) {
232-
return (usesFieldRef() ? Reduce.arrayOf(fieldReference) : Reduce.arrayOf(expression))
233-
.withInitialValue(initialValue).reduce(expression);
232+
return (usesFieldRef() ? Reduce.arrayOf(fieldReference)
233+
: Reduce.arrayOf(ArrayOperatorFactory.this.expression)).withInitialValue(initialValue).reduce(expression);
234234
}
235235
};
236236
}
@@ -1104,12 +1104,10 @@ public Reduce reduce(PropertyExpression... expressions) {
11041104
/**
11051105
* Start creating new {@link Reduce}.
11061106
*
1107-
* @param expression must not be {@literal null}.
1107+
* @param arrayValueExpression must not be {@literal null}.
11081108
* @return
11091109
*/
1110-
public static InitialValueBuilder arrayOf(final AggregationExpression expression) {
1111-
1112-
Assert.notNull(expression, "AggregationExpression must not be null");
1110+
public static InitialValueBuilder arrayOf(final AggregationExpression arrayValueExpression) {
11131111

11141112
return new InitialValueBuilder() {
11151113

@@ -1124,14 +1122,14 @@ public ReduceBuilder withInitialValue(final Object initialValue) {
11241122
public Reduce reduce(AggregationExpression expression) {
11251123

11261124
Assert.notNull(expression, "AggregationExpression must not be null");
1127-
return new Reduce(expression, initialValue, Collections.singletonList(expression));
1125+
return new Reduce(arrayValueExpression, initialValue, Collections.singletonList(expression));
11281126
}
11291127

11301128
@Override
11311129
public Reduce reduce(PropertyExpression... expressions) {
11321130

11331131
Assert.notNull(expressions, "PropertyExpressions must not be null");
1134-
return new Reduce(expression, initialValue, Arrays.<AggregationExpression> asList(expressions));
1132+
return new Reduce(arrayValueExpression, initialValue, Arrays.asList(expressions));
11351133
}
11361134
};
11371135
}

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

+24
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,13 @@
3232
import org.junit.Test;
3333
import org.springframework.data.domain.Range;
3434
import org.springframework.data.mongodb.core.DocumentTestUtils;
35+
import org.springframework.data.mongodb.core.aggregation.ArrayOperators.Reduce;
3536
import org.springframework.data.mongodb.core.aggregation.ArrayOperators.Reduce.PropertyExpression;
3637
import org.springframework.data.mongodb.core.aggregation.ArrayOperators.Reduce.Variable;
38+
import org.springframework.data.mongodb.core.aggregation.ArrayOperators.Slice;
3739
import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Switch.CaseOperator;
3840
import org.springframework.data.mongodb.core.aggregation.ProjectionOperation.ProjectionOperationBuilder;
41+
import org.springframework.data.mongodb.core.aggregation.StringOperators.Concat;
3942
import org.springframework.data.mongodb.core.aggregation.VariableOperators.Let.ExpressionVariable;
4043

4144
/**
@@ -1573,6 +1576,27 @@ public void shouldRenderReduceWithComplexObjectCorrectly() {
15731576
"{ $project : { \"results\": { $reduce: { input: \"$probabilityArr\", initialValue: { \"sum\" : 5 , \"product\" : 2} , in: { \"sum\": { $add : [\"$$value.sum\", \"$$this\"] }, \"product\": { $multiply: [ \"$$value.product\", \"$$this\" ] } } } } } }")));
15741577
}
15751578

1579+
@Test // DATAMONGO-1843
1580+
public void shouldRenderReduceWithInputAndInExpressionsCorrectly() {
1581+
1582+
Document exprected = Document.parse(
1583+
"{ \"$project\" : { \"results\" : { \"$reduce\" : { \"input\" : { \"$slice\" : [\"$array\", 5] }, \"initialValue\" : \"\", \"in\" : { \"$concat\" : [\"$$value\", \"/\", \"$$this\"] } } } } }");
1584+
1585+
Reduce reduceEntryPoint = Reduce.arrayOf(Slice.sliceArrayOf("array").itemCount(5)) //
1586+
.withInitialValue("") //
1587+
.reduce(Concat.valueOf("$$value").concat("/").concatValueOf("$$this"));
1588+
1589+
Reduce arrayEntryPoint = ArrayOperators.arrayOf(Slice.sliceArrayOf("array").itemCount(5)) //
1590+
.reduce(Concat.valueOf("$$value").concat("/").concatValueOf("$$this")) //
1591+
.startingWith("");
1592+
1593+
assertThat(project().and(reduceEntryPoint).as("results").toDocument(Aggregation.DEFAULT_CONTEXT),
1594+
Matchers.is(exprected));
1595+
1596+
assertThat(project().and(arrayEntryPoint).as("results").toDocument(Aggregation.DEFAULT_CONTEXT),
1597+
Matchers.is(exprected));
1598+
}
1599+
15761600
@Test // DATAMONGO-1548
15771601
public void shouldRenderZipCorrectly() {
15781602

0 commit comments

Comments
 (0)