From 44e581f14c5803a8017784d91963310e700b0c60 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 17 Dec 2020 09:56:06 +0100 Subject: [PATCH 1/2] DATAMONGO-2651 - Prepare issue branch. --- pom.xml | 2 +- spring-data-mongodb-benchmarks/pom.xml | 2 +- spring-data-mongodb-distribution/pom.xml | 2 +- spring-data-mongodb/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 10c1adf1bf..7c15a134d4 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 3.2.0-SNAPSHOT + 3.2.0-DATAMONGO-2651-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml index f0fbb601c8..7f90fa51ff 100644 --- a/spring-data-mongodb-benchmarks/pom.xml +++ b/spring-data-mongodb-benchmarks/pom.xml @@ -7,7 +7,7 @@ org.springframework.data spring-data-mongodb-parent - 3.2.0-SNAPSHOT + 3.2.0-DATAMONGO-2651-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 1a17321782..cea96d79d9 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -14,7 +14,7 @@ org.springframework.data spring-data-mongodb-parent - 3.2.0-SNAPSHOT + 3.2.0-DATAMONGO-2651-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 0248517caf..71ac2dc3f6 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -11,7 +11,7 @@ org.springframework.data spring-data-mongodb-parent - 3.2.0-SNAPSHOT + 3.2.0-DATAMONGO-2651-SNAPSHOT ../pom.xml From e83d211174ab2e8c819e0d29696adc5d14e00dee Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 17 Dec 2020 13:04:07 +0100 Subject: [PATCH 2/2] DATAMONGO-2651 - Support $accumulator in GroupOperationBuilder. --- .../core/aggregation/GroupOperation.java | 27 ++++++++++++++++--- .../aggregation/GroupOperationUnitTests.java | 15 ++++++++++- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/GroupOperation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/GroupOperation.java index 8f586fd754..b58ec4b24d 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/GroupOperation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/GroupOperation.java @@ -23,6 +23,7 @@ import org.bson.Document; import org.springframework.data.mongodb.core.aggregation.ExposedFields.ExposedField; import org.springframework.data.mongodb.core.aggregation.ExposedFields.FieldReference; +import org.springframework.data.mongodb.core.aggregation.ScriptOperators.Accumulator; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -375,6 +376,17 @@ public GroupOperationBuilder stdDevPop(AggregationExpression expr) { return newBuilder(GroupOps.STD_DEV_POP, null, expr); } + /** + * Generates an {@link GroupOperationBuilder} for an {@code $accumulator}-expression. + * + * @param accumulator must not be {@literal null}. + * @return never {@literal null}. + * @since 1.10 + */ + public GroupOperationBuilder accumulate(Accumulator accumulator) { + return new GroupOperationBuilder(this, new Operation(accumulator)); + } + private GroupOperationBuilder newBuilder(Keyword keyword, @Nullable String reference, @Nullable Object value) { return new GroupOperationBuilder(this, new Operation(keyword, null, reference, value)); } @@ -465,12 +477,16 @@ public String toString() { static class Operation implements AggregationOperation { - private final Keyword op; + private final @Nullable Keyword op; private final @Nullable String key; private final @Nullable String reference; private final @Nullable Object value; - public Operation(Keyword op, @Nullable String key, @Nullable String reference, @Nullable Object value) { + Operation(AggregationExpression expression) { + this(null, null, null, expression); + } + + public Operation(@Nullable Keyword op, @Nullable String key, @Nullable String reference, @Nullable Object value) { this.op = op; this.key = key; @@ -487,7 +503,12 @@ public ExposedField asField() { } public Document toDocument(AggregationOperationContext context) { - return new Document(key, new Document(op.toString(), getValue(context))); + + Object value = getValue(context); + if(op == null && value instanceof Document) { + return new Document(key, value); + } + return new Document(key, new Document(op.toString(), value)); } public Object getValue(AggregationOperationContext context) { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/GroupOperationUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/GroupOperationUnitTests.java index 6239b3d10f..3340e8119b 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/GroupOperationUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/GroupOperationUnitTests.java @@ -23,7 +23,6 @@ import org.bson.Document; import org.junit.jupiter.api.Test; - import org.springframework.data.mongodb.core.DocumentTestUtils; import org.springframework.data.mongodb.core.query.Criteria; @@ -241,6 +240,20 @@ public void sumWithNullExpressionShouldThrowException() { .isThrownBy(() -> Aggregation.group("username").sum((AggregationExpression) null)); } + @Test // DATAMONGO-2651 + void accumulatorShouldBeAllowedOnGroupOperation() { + + GroupOperation groupOperation = Aggregation.group("id") + .accumulate( + ScriptOperators.accumulatorBuilder().init("inti").accumulate("acc").merge("merge").finalize("finalize")) + .as("accumulated-value"); + + Document groupClause = extractDocumentFromGroupOperation(groupOperation); + Document accumulatedValue = DocumentTestUtils.getAsDocument(groupClause, "accumulated-value"); + + assertThat(accumulatedValue.get("$accumulator")).isNotNull(); + } + private Document extractDocumentFromGroupOperation(GroupOperation groupOperation) { Document document = groupOperation.toDocument(Aggregation.DEFAULT_CONTEXT); Document groupClause = DocumentTestUtils.getAsDocument(document, "$group");