From 5314e6f8bb1101bfbcef6789e3c9710066898adf Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 15 Apr 2020 13:47:17 +0200 Subject: [PATCH] DATAMONGO-2513 - Fix Eq aggregation operator comparing collection values. Original pull request: #855. --- .../AbstractAggregationExpression.java | 18 +++++++++++++++--- .../core/aggregation/ComparisonOperators.java | 6 +++--- .../ProjectionOperationUnitTests.java | 9 +++++++++ 3 files changed, 27 insertions(+), 6 deletions(-) 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 b1f24e6cf..ad607cbca 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 @@ -17,6 +17,7 @@ package org.springframework.data.mongodb.core.aggregation; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; @@ -100,14 +101,14 @@ abstract class AbstractAggregationExpression implements AggregationExpression { return value; } - protected List append(Object value) { + protected List append(Object value, Expand expandList) { if (this.value instanceof List) { List clone = new ArrayList((List) this.value); - if (value instanceof List) { - clone.addAll((List) value); + if (value instanceof Collection && Expand.EXPAND_VALUES.equals(expandList)) { + clone.addAll((Collection) value); } else { clone.add(value); } @@ -117,6 +118,17 @@ abstract class AbstractAggregationExpression implements AggregationExpression { return Arrays.asList(this.value, value); } + /** + * Expand a nested list of values to single entries or keep the list. + */ + protected enum Expand { + EXPAND_VALUES, KEEP_SOURCE + } + + protected List append(Object value) { + return append(value, Expand.EXPAND_VALUES); + } + @SuppressWarnings("unchecked") protected java.util.Map append(String key, Object value) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ComparisonOperators.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ComparisonOperators.java index c39e79f54..2ce153a0f 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ComparisonOperators.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ComparisonOperators.java @@ -411,7 +411,7 @@ public class ComparisonOperators { public Cmp compareToValue(Object value) { Assert.notNull(value, "Value must not be null!"); - return new Cmp(append(value)); + return new Cmp(append(value, Expand.KEEP_SOURCE)); } } @@ -488,7 +488,7 @@ public class ComparisonOperators { public Eq equalToValue(Object value) { Assert.notNull(value, "Value must not be null!"); - return new Eq(append(value)); + return new Eq(append(value, Expand.KEEP_SOURCE)); } } @@ -873,7 +873,7 @@ public class ComparisonOperators { public Ne notEqualToValue(Object value) { Assert.notNull(value, "Value must not be null!"); - return new Ne(append(value)); + return new Ne(append(value, Expand.KEEP_SOURCE)); } } } 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 84e35119f..1b4151710 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 @@ -1499,6 +1499,15 @@ public class ProjectionOperationUnitTests { assertThat(agg).isEqualTo(Document.parse("{ $project: { eq250: { $eq: [\"$qty\", 250]} } }")); } + @Test // DATAMONGO-2513 + public void shouldRenderEqAggregationExpressionWithListComparison() { + + Document agg = project().and(ComparisonOperators.valueOf("qty").equalToValue(Arrays.asList(250))).as("eq250") + .toDocument(Aggregation.DEFAULT_CONTEXT); + + assertThat(agg).isEqualTo(Document.parse("{ $project: { eq250: { $eq: [\"$qty\", [250]]} } }")); + } + @Test // DATAMONGO-1536 public void shouldRenderGtAggregationExpression() {