From 853b2b2d5c7903ed47bcb9dd3a892576c78f6daa Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Mon, 5 Dec 2016 16:35:53 +0100 Subject: [PATCH] DATAMONGO-1540 - Polishing. Reduce Map aggregation expression builder entrypoint. Fix JavaDoc. Original pull request: #420. --- .../aggregation/AggregationExpressions.java | 93 +++++++++---------- .../ProjectionOperationUnitTests.java | 8 +- src/main/asciidoc/reference/mongodb.adoc | 4 + 3 files changed, 51 insertions(+), 54 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AggregationExpressions.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AggregationExpressions.java index f62bee9a9..e1a3d2990 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AggregationExpressions.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AggregationExpressions.java @@ -25,7 +25,6 @@ import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import org.bson.Document; import org.springframework.data.mongodb.core.aggregation.AggregationExpressions.Filter.AsBuilder; -import org.springframework.data.mongodb.core.aggregation.AggregationExpressions.Map.ArrayOfBuilder; import org.springframework.data.mongodb.core.aggregation.ExposedFields.ExposedField; import org.springframework.data.mongodb.core.aggregation.ExposedFields.FieldReference; import org.springframework.util.Assert; @@ -1782,9 +1781,10 @@ public interface AggregationExpressions { } /** - * Gateway to {@literal Date} aggregation operations. + * Gateway to {@literal variable} aggregation operations. * * @author Christoph Strobl + * @author Mark Paluch */ class VariableOperators { @@ -1792,10 +1792,22 @@ public interface AggregationExpressions { * Starts building new {@link Map} that applies an {@link AggregationExpression} to each item of a referenced array * and returns an array with the applied results. * + * @param fieldReference must not be {@literal null}. * @return */ - public static ArrayOfBuilder map() { - return Map.map(); + public static Map.AsBuilder mapItemsOf(String fieldReference) { + return Map.itemsOf(fieldReference); + } + + /** + * Starts building new {@link Map} that applies an {@link AggregationExpression} to each item of a referenced array + * and returns an array with the applied results. + * + * @param expression must not be {@literal null}. + * @return + */ + public static Map.AsBuilder mapItemsOf(AggregationExpression expression) { + return Map.itemsOf(expression); } } @@ -5757,51 +5769,52 @@ public interface AggregationExpressions { * Starts building new {@link Map} that applies an {@link AggregationExpression} to each item of a referenced array * and returns an array with the applied results. * + * @param fieldReference must not be {@literal null}. * @return */ - static ArrayOfBuilder map() { + static AsBuilder itemsOf(final String fieldReference) { - return new ArrayOfBuilder() { + return new AsBuilder() { @Override - public AsBuilder itemsOf(final String fieldReference) { + public FunctionBuilder as(final String variableName) { - return new AsBuilder() { + return new FunctionBuilder() { @Override - public FunctionBuilder as(final String variableName) { - - return new FunctionBuilder() { - - @Override - public Map andApply(final AggregationExpression expression) { - return new Map(Fields.field(fieldReference), variableName, expression); - } - }; + public Map andApply(final AggregationExpression expression) { + return new Map(Fields.field(fieldReference), variableName, expression); } }; } - @Override - public AsBuilder itemsOf(final AggregationExpression source) { + }; + }; - return new AsBuilder() { + /** + * Starts building new {@link Map} that applies an {@link AggregationExpression} to each item of a referenced array + * and returns an array with the applied results. + * + * @param source must not be {@literal null}. + * @return + */ + public static AsBuilder itemsOf(final AggregationExpression source) { + + return new AsBuilder() { + + @Override + public FunctionBuilder as(final String variableName) { + + return new FunctionBuilder() { @Override - public FunctionBuilder as(final String variableName) { - - return new FunctionBuilder() { - - @Override - public Map andApply(final AggregationExpression expression) { - return new Map(source, variableName, expression); - } - }; + public Map andApply(final AggregationExpression expression) { + return new Map(source, variableName, expression); } }; } }; - }; + } @Override public Document toDocument(final AggregationOperationContext context) { @@ -5841,26 +5854,6 @@ public interface AggregationExpressions { return new Document("$map", map); } - interface ArrayOfBuilder { - - /** - * Set the field that resolves to an array on which to apply the {@link AggregationExpression}. - * - * @param fieldReference must not be {@literal null}. - * @return - */ - AsBuilder itemsOf(String fieldReference); - - /** - * Set the {@link AggregationExpression} that results in an array on which to apply the - * {@link AggregationExpression}. - * - * @param expression must not be {@literal null}. - * @return - */ - AsBuilder itemsOf(AggregationExpression expression); - } - interface AsBuilder { /** 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 5af53f3ce..a7fa43e86 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 @@ -1674,13 +1674,13 @@ public class ProjectionOperationUnitTests { } /** - * @see DATAMONGO-784 + * @see DATAMONGO-1540 */ @Test public void shouldRenderMapAggregationExpression() { Document agg = Aggregation.project() - .and(VariableOperators.map().itemsOf("quizzes").as("grade") + .and(VariableOperators.mapItemsOf("quizzes").as("grade") .andApply(AggregationFunctionExpressions.ADD.of(field("grade"), 2))) .as("adjustedGrades").toDocument(Aggregation.DEFAULT_CONTEXT); @@ -1689,13 +1689,13 @@ public class ProjectionOperationUnitTests { } /** - * @see DATAMONGO-784 + * @see DATAMONGO-1540 */ @Test public void shouldRenderMapAggregationExpressionOnExpression() { Document agg = Aggregation.project() - .and(VariableOperators.map().itemsOf(AggregationFunctionExpressions.SIZE.of("foo")).as("grade") + .and(VariableOperators.mapItemsOf(AggregationFunctionExpressions.SIZE.of("foo")).as("grade") .andApply(AggregationFunctionExpressions.ADD.of(field("grade"), 2))) .as("adjustedGrades").toDocument(Aggregation.DEFAULT_CONTEXT); diff --git a/src/main/asciidoc/reference/mongodb.adoc b/src/main/asciidoc/reference/mongodb.adoc index b787af778..1bcc9af94 100644 --- a/src/main/asciidoc/reference/mongodb.adoc +++ b/src/main/asciidoc/reference/mongodb.adoc @@ -1702,6 +1702,10 @@ At the time of this writing we provide support for the following Aggregation Ope | Date Aggregation Operators | dayOfYear, dayOfMonth, dayOfWeek, year, month, week, hour, minute, second, millisecond, dateToString +| Variable Operators +| map + + | Conditional Aggregation Operators | cond, ifNull