From 3ba589072f7cfddac5ba52ccd0ff8c7fd1378183 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Mon, 13 Aug 2018 11:59:46 +0200 Subject: [PATCH] DATAMONGO-2047 - Polishing. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Retain previous options when calling withTimezone(…)/onNull…(…). Add tests. Javadoc. Original pull request: #593. --- .../core/aggregation/DateOperators.java | 23 +++++++++++-- .../core/aggregation/ProjectionOperation.java | 2 +- .../ProjectionOperationUnitTests.java | 32 ++++++++++++++++++- 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/DateOperators.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/DateOperators.java index a6c465dd3..14a21208a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/DateOperators.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/DateOperators.java @@ -1409,7 +1409,7 @@ public class DateOperators { public DateToString withTimezone(Timezone timezone) { Assert.notNull(timezone, "Timezone must not be null."); - return new DateToString(argumentMap(get("date"), get("format"), timezone)); + return new DateToString(append("timezone", timezone)); } /** @@ -1455,7 +1455,7 @@ public class DateOperators { private static java.util.Map argumentMap(Object date, @Nullable String format, Timezone timezone) { - java.util.Map args = new LinkedHashMap(2); + java.util.Map args = new LinkedHashMap<>(2); if (StringUtils.hasText(format)) { args.put("format", format); @@ -1469,6 +1469,25 @@ public class DateOperators { return args; } + protected java.util.Map append(String key, Object value) { + + java.util.Map clone = new LinkedHashMap<>(argumentMap()); + + if (value instanceof Timezone) { + + if (ObjectUtils.nullSafeEquals(value, Timezone.none())) { + clone.remove("timezone"); + } else { + clone.put("timezone", ((Timezone) value).value); + } + + } else { + clone.put(key, value); + } + + return clone; + } + public interface FormatBuilder { /** diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperation.java index ea4f5c0da..49f11ac31 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperation.java @@ -1207,7 +1207,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation { /** * Generates a {@code $dateToString} expression that takes the date representation of the previously mentioned field * using the server default format.
- * strong>NOTE: Requires MongoDB 4.0 or later. + * NOTE: Requires MongoDB 4.0 or later. * * @return * @since 2.0.10 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 d2ec5d3c8..faccf2faa 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 @@ -1318,7 +1318,7 @@ public class ProjectionOperationUnitTests { Document.parse("{ $project: { time: { $dateToString: { format: \"%H:%M:%S:%L\", date: \"$date\" } } } }")); } - @Test // DATAMONGO-1834 + @Test // DATAMONGO-1834, DATAMONGO-2047 public void shouldRenderDateToStringAggregationExpressionWithTimezone() { Document agg = project() @@ -1327,6 +1327,13 @@ public class ProjectionOperationUnitTests { assertThat(agg).isEqualTo(Document.parse( "{ $project: { time: { $dateToString: { format: \"%H:%M:%S:%L\", date: \"$date\", \"timezone\" : \"America/Chicago\" } } } } } }")); + + Document removedTimezone = project().and(DateOperators.dateOf("date") + .withTimezone(Timezone.valueOf("America/Chicago")).toString("%H:%M:%S:%L").withTimezone(Timezone.none())) + .as("time").toDocument(Aggregation.DEFAULT_CONTEXT); + + assertThat(removedTimezone).isEqualTo( + Document.parse("{ $project: { time: { $dateToString: { format: \"%H:%M:%S:%L\", date: \"$date\" } } } } } }")); } @Test // DATAMONGO-2047 @@ -1340,6 +1347,29 @@ public class ProjectionOperationUnitTests { .parse("{ $project: { time: { $dateToString: { date: \"$date\", \"onNull\" : \"$fallback-field\" } } } }")); } + @Test // DATAMONGO-2047 + public void shouldRenderDateToStringWithOnNullExpression() { + + Document agg = project() + .and(DateOperators.dateOf("date").toStringWithDefaultFormat() + .onNullReturnValueOf(LiteralOperators.valueOf("my-literal").asLiteral())) + .as("time").toDocument(Aggregation.DEFAULT_CONTEXT); + + assertThat(agg).isEqualTo(Document.parse( + "{ $project: { time: { $dateToString: { date: \"$date\", \"onNull\" : { \"$literal\": \"my-literal\"} } } } }")); + } + + @Test // DATAMONGO-2047 + public void shouldRenderDateToStringWithOnNullAndTimezone() { + + Document agg = project().and(DateOperators.dateOf("date").toStringWithDefaultFormat() + .onNullReturnValueOf("fallback-field").withTimezone(Timezone.ofField("foo"))).as("time") + .toDocument(Aggregation.DEFAULT_CONTEXT); + + assertThat(agg).isEqualTo(Document.parse( + "{ $project: { time: { $dateToString: { date: \"$date\", \"onNull\" : \"$fallback-field\", \"timezone\": \"$foo\" } } } }")); + } + @Test // DATAMONGO-1536 public void shouldRenderSumAggregationExpression() {