DATAMONGO-1586 - Consider field name in TypeBasedAggregationOperationContext.getReferenceFor(…).

We now consider the provided field name (alias) in mapped fields with which it is exposed. The field name applies to the exposed field after property path resolution in TypeBasedAggregationOperationContext. Previously, the field reference used the property name which caused fields to be considered non-aliased, so aggregation projection operations dropped the alias and exposed the field with its leaf property name.

Original Pull Request: #434
This commit is contained in:
Mark Paluch
2017-01-09 15:40:51 +01:00
committed by Christoph Strobl
parent 90ae6d1805
commit 8df9d30d2e
2 changed files with 30 additions and 5 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2013-2016 the original author or authors.
* Copyright 2013-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,6 +35,7 @@ import org.springframework.util.Assert;
*
* @author Oliver Gierke
* @author Christoph Strobl
* @author Mark Paluch
* @since 1.3
*/
public class TypeBasedAggregationOperationContext implements AggregationOperationContext {
@@ -94,9 +95,9 @@ public class TypeBasedAggregationOperationContext implements AggregationOperatio
private FieldReference getReferenceFor(Field field) {
PersistentPropertyPath<MongoPersistentProperty> propertyPath = mappingContext
.getPersistentPropertyPath(field.getTarget(), type);
Field mappedField = field(propertyPath.getLeafProperty().getName(),
PersistentPropertyPath<MongoPersistentProperty> propertyPath = mappingContext.getPersistentPropertyPath(
field.getTarget(), type);
Field mappedField = field(field.getName(),
propertyPath.toDotPath(MongoPersistentProperty.PropertyToFieldNameConverter.INSTANCE));
return new DirectFieldReference(new ExposedField(mappedField, true));

View File

@@ -17,6 +17,7 @@ package org.springframework.data.mongodb.core.aggregation;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.springframework.data.mongodb.core.DocumentTestUtils.*;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.aggregation.Fields.*;
import static org.springframework.data.mongodb.test.util.IsBsonObject.*;
@@ -191,6 +192,27 @@ public class TypeBasedAggregationOperationContextUnitTests {
assertThat(definition.get("counter"), is(equalTo((Object) 1)));
}
/**
* @see DATAMONGO-1586
*/
@Test
public void rendersFieldAliasingProjectionCorrectly() {
AggregationOperationContext context = getContext(FooPerson.class);
TypedAggregation<FooPerson> agg = newAggregation(FooPerson.class,
project() //
.and("name").as("person_name") //
.and("age.value").as("age"));
Document dbo = agg.toDocument("person", context);
Document projection = getPipelineElementFromAggregationAt(dbo, 0);
assertThat(getAsDocument(projection, "$project"),
isBsonObject() //
.containing("person_name", "$name") //
.containing("age", "$age.value"));
}
/**
* @see DATAMONGO-1133
*/
@@ -328,7 +350,9 @@ public class TypeBasedAggregationOperationContextUnitTests {
assertThat(getValue(age, "$cond"), isBsonObject().containing("else", "$age"));
}
/**.AggregationUnitTests
/**
* .AggregationUnitTests
*
* @see DATAMONGO-861, DATAMONGO-1542
*/
@Test