diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AbstractAggregationExpression.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AbstractAggregationExpression.java index 573eed4a1..ec0a8ff8f 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AbstractAggregationExpression.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AbstractAggregationExpression.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import org.bson.Document; +import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; /** @@ -101,9 +102,7 @@ abstract class AbstractAggregationExpression implements AggregationExpression { List clone = new ArrayList((List) this.value); if (value instanceof List) { - for (Object val : (List) value) { - clone.add(val); - } + clone.addAll((List) value); } else { clone.add(value); } @@ -116,9 +115,8 @@ abstract class AbstractAggregationExpression implements AggregationExpression { @SuppressWarnings("unchecked") protected java.util.Map append(String key, Object value) { - if (!(this.value instanceof java.util.Map)) { - throw new IllegalArgumentException("o_O"); - } + Assert.isInstanceOf(Map.class, this.value, "Value must be a type of Map!"); + java.util.Map clone = new LinkedHashMap<>((java.util.Map) this.value); clone.put(key, value); return clone; @@ -144,6 +142,7 @@ abstract class AbstractAggregationExpression implements AggregationExpression { * @return * @since 2.1 */ + @SuppressWarnings("unchecked") protected T get(int index) { return (T) values().get(index); } @@ -156,11 +155,10 @@ abstract class AbstractAggregationExpression implements AggregationExpression { * @return * @since 2.1 */ + @SuppressWarnings("unchecked") protected T get(Object key) { - if (!(this.value instanceof java.util.Map)) { - throw new IllegalArgumentException("o_O"); - } + Assert.isInstanceOf(Map.class, this.value, "Value must be a type of Map!"); return (T) ((java.util.Map) this.value).get(key); } @@ -171,11 +169,10 @@ abstract class AbstractAggregationExpression implements AggregationExpression { * @since 2.1 * @return */ + @SuppressWarnings("unchecked") protected java.util.Map argumentMap() { - if (!(this.value instanceof java.util.Map)) { - throw new IllegalArgumentException("o_O"); - } + Assert.isInstanceOf(Map.class, this.value, "Value must be a type of Map!"); return Collections.unmodifiableMap((java.util.Map) value); } @@ -187,6 +184,7 @@ abstract class AbstractAggregationExpression implements AggregationExpression { * @return * @since 2.1 */ + @SuppressWarnings("unchecked") protected boolean contains(Object key) { if (!(this.value instanceof java.util.Map)) { 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 640bd60fe..f64703b98 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 @@ -1078,6 +1078,29 @@ public class ProjectionOperationUnitTests { "{ $project: { dayOfYear: { $dayOfYear: { \"date\" : \"$date\", \"timezone\" : \"America/Chicago\" } } } }")); } + @Test // DATAMONGO-1834 + public void shouldRenderTimeZoneFromField() { + + Document agg = project() + .and(DateOperators.dateOf("date").withTimezone(Timezone.ofField("tz")).dayOfYear()).as("dayOfYear") + .toDocument(Aggregation.DEFAULT_CONTEXT); + + assertThat(agg).isEqualTo(Document.parse( + "{ $project: { dayOfYear: { $dayOfYear: { \"date\" : \"$date\", \"timezone\" : \"$tz\" } } } }")); + } + + @Test // DATAMONGO-1834 + public void shouldRenderTimeZoneFromExpression() { + + Document agg = project() + .and(DateOperators.dateOf("date") + .withTimezone(Timezone.ofExpression(LiteralOperators.valueOf("America/Chicago").asLiteral())).dayOfYear()) + .as("dayOfYear").toDocument(Aggregation.DEFAULT_CONTEXT); + + assertThat(agg).isEqualTo(Document.parse( + "{ $project: { dayOfYear: { $dayOfYear: { \"date\" : \"$date\", \"timezone\" : { $literal: \"America/Chicago\"} } } } }")); + } + @Test // DATAMONGO-1536 public void shouldRenderDayOfMonthAggregationExpression() {