From 633338a774ecf4d47858987d30faf87277f372ce Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 18 Dec 2024 14:11:41 +0100 Subject: [PATCH 1/2] Prepare issue branch. --- pom.xml | 2 +- spring-data-mongodb-distribution/pom.xml | 2 +- spring-data-mongodb/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index c3245aad49..d5d696c250 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 4.5.0-SNAPSHOT + 4.5.x-GH-4857-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 58c63dfc97..74beacabea 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -15,7 +15,7 @@ org.springframework.data spring-data-mongodb-parent - 4.5.0-SNAPSHOT + 4.5.x-GH-4857-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 98516a5ba9..2f4d2b2c48 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -13,7 +13,7 @@ org.springframework.data spring-data-mongodb-parent - 4.5.0-SNAPSHOT + 4.5.x-GH-4857-SNAPSHOT ../pom.xml From ea28713c245beb57faee300ff54a2ff883fa2e29 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 18 Dec 2024 14:31:11 +0100 Subject: [PATCH 2/2] Support Expressions in $slice operator. This commit allows AggregationExpressions to be used for itemCount and offset of the Slice expression. --- .../core/aggregation/ArrayOperators.java | 55 +++++++++++++++---- .../ProjectionOperationUnitTests.java | 12 ++++ 2 files changed, 56 insertions(+), 11 deletions(-) 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 af01e3cebe..068b5bf717 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 @@ -1032,35 +1032,68 @@ public Slice itemCount(int nrElements) { return new Slice(append(nrElements)); } + /** + * Slice the number of elements. + * + * @param nrElements An {@link AggregationExpression} that evaluates to a numeric value used as item count. + * @return new instance of {@link Slice}. + * @since 4.5 + */ + public Slice itemCount(AggregationExpression nrElements) { + return new Slice(append(nrElements)); + } + /** * Slice using offset and count. * * @param position the start position * @return new instance of {@link SliceElementsBuilder} to create {@link Slice}. */ - public SliceElementsBuilder offset(final int position) { - - return new SliceElementsBuilder() { + public SliceElementsBuilder offset(int position) { + return new SliceElementsBuilder(position); + } - @Override - public Slice itemCount(int nrElements) { - return new Slice(append(position)).itemCount(nrElements); - } - }; + /** + * Slice using offset and count. + * + * @param position the start position + * @return new instance of {@link SliceElementsBuilder} to create {@link Slice}. + */ + public SliceElementsBuilder offset(AggregationExpression position) { + return new SliceElementsBuilder(position); } /** * @author Christoph Strobl */ - public interface SliceElementsBuilder { + public class SliceElementsBuilder { + + private final Object position; + + SliceElementsBuilder(Object position) { + this.position = position; + } /** * Set the number of elements given {@literal nrElements}. * * @param nrElements - * @return + * @return new instance of {@link Slice}. */ - Slice itemCount(int nrElements); + public Slice itemCount(int nrElements) { + return new Slice(append(position)).itemCount(nrElements); + } + + /** + * Slice the number of elements. + * + * @param nrElements An {@link AggregationExpression} that evaluates to a numeric value used as item count. + * @return new instance of {@link Slice}. + * @since 4.5 + */ + public Slice itemCount(AggregationExpression nrElements) { + return new Slice(append(position)).itemCount(nrElements); + } } } 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 ded639f204..09a0ebbcd0 100755 --- 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 @@ -29,6 +29,7 @@ import org.springframework.data.domain.Range; import org.springframework.data.domain.Range.Bound; import org.springframework.data.mongodb.core.DocumentTestUtils; +import org.springframework.data.mongodb.core.aggregation.ArithmeticOperators.Subtract; 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; @@ -1064,6 +1065,17 @@ void shouldRenderSliceWithPositionAggregationExpression() { assertThat(agg).isEqualTo(Document.parse("{ $project: { threeFavorites: { $slice: [ \"$favorites\", 2, 3 ] } } }")); } + @Test // DATAMONGO-4857 + void shouldRenderSliceWithExpressions() { + + Document agg = project().and(ArrayOperators.arrayOf("favorites").slice() + .offset(Subtract.valueOf(ArrayOperators.Size.lengthOfArray("myArray")).subtract(1)) + .itemCount(ArithmeticOperators.rand())).as("threeFavorites").toDocument(Aggregation.DEFAULT_CONTEXT); + + assertThat(agg).isEqualTo(Document.parse( + "{ $project: { threeFavorites: { $slice: [ \"$favorites\", { \"$subtract\": [ {\"$size\": \"$myArray\"}, 1]}, { $rand : {} } ] } } }")); + } + @Test // DATAMONGO-1536 void shouldRenderLiteral() {