diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/NestedDelegatingExpressionAggregationOperationContext.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/NestedDelegatingExpressionAggregationOperationContext.java index 4657d1033..20fd128ac 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/NestedDelegatingExpressionAggregationOperationContext.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/NestedDelegatingExpressionAggregationOperationContext.java @@ -16,13 +16,11 @@ package org.springframework.data.mongodb.core.aggregation; import java.util.Collection; -import java.util.HashSet; -import java.util.Set; -import java.util.stream.Collectors; import org.bson.Document; -import org.springframework.data.mongodb.core.aggregation.ExposedFields.FieldReference; + import org.springframework.data.mongodb.core.aggregation.ExposedFields.ExpressionFieldReference; +import org.springframework.data.mongodb.core.aggregation.ExposedFields.FieldReference; import org.springframework.util.Assert; /** @@ -31,23 +29,25 @@ import org.springframework.util.Assert; * variable. * * @author Christoph Strobl + * @author Mark Paluch * @since 1.10 */ class NestedDelegatingExpressionAggregationOperationContext implements AggregationOperationContext { private final AggregationOperationContext delegate; - private final Set inners; + private final Collection inners; /** * Creates new {@link NestedDelegatingExpressionAggregationOperationContext}. * * @param referenceContext must not be {@literal null}. */ - NestedDelegatingExpressionAggregationOperationContext(AggregationOperationContext referenceContext, Collection inners) { + NestedDelegatingExpressionAggregationOperationContext(AggregationOperationContext referenceContext, + Collection inners) { Assert.notNull(referenceContext, "Reference context must not be null!"); this.delegate = referenceContext; - this.inners = inners.stream().map(Field::getName).collect(Collectors.toSet()); + this.inners = inners; } /* @@ -67,20 +67,23 @@ class NestedDelegatingExpressionAggregationOperationContext implements Aggregati public FieldReference getReference(Field field) { FieldReference reference = delegate.getReference(field); - return !isInnerVariableReference(field) ? reference : new ExpressionFieldReference(delegate.getReference(field)) ; + return isInnerVariableReference(field) ? new ExpressionFieldReference(delegate.getReference(field)) : reference; } private boolean isInnerVariableReference(Field field) { - if(inners.isEmpty()) { + if (inners.isEmpty()) { return false; } - if(inners.contains(field.getName())) { - return true; + for (Field inner : inners) { + if (inner.getName().equals(field.getName()) + || (field.getTarget().contains(".") && field.getTarget().startsWith(inner.getName()))) { + return true; + } } - return inners.stream().anyMatch(it -> field.getTarget().contains(".") && field.getTarget().startsWith(it)); + return false; } /* diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/FilterExpressionUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/FilterExpressionUnitTests.java index ed87f019b..724d0a77e 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/FilterExpressionUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/FilterExpressionUnitTests.java @@ -119,7 +119,7 @@ public class FilterExpressionUnitTests { "cond: { $gt: [ \"$$item.price\", \"$field-1\" ] }" + // "}"); - assertThat($filter).isEqualTo(new Document(expected)); + assertThat($filter, is(expected)); } private Document extractFilterOperatorFromDocument(Document source) {