From ed12298271344e2ace6d5f3197b63f1a4a52d780 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 31 Oct 2013 13:45:06 +0000 Subject: [PATCH] DATAMONGO-788 - Polishing. Slightly changed the way the the simple reference rendering for projections is implemented. Introduced an isAliased() method on Field to be able to determine whether the field reference has been renamed explicitly. Original pull request: #90. --- .../data/mongodb/core/aggregation/ExposedFields.java | 10 +++++++++- .../data/mongodb/core/aggregation/Field.java | 7 +++++++ .../data/mongodb/core/aggregation/Fields.java | 9 +++++++++ .../mongodb/core/aggregation/ProjectionOperation.java | 9 +-------- .../mongodb/core/aggregation/AggregationUnitTests.java | 4 ++-- .../core/aggregation/ProjectionOperationUnitTests.java | 2 +- 6 files changed, 29 insertions(+), 12 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java index c2bfead5d..b6bd75fd1 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java @@ -259,6 +259,15 @@ public class ExposedFields implements Iterable { return field.getTarget(); } + /* + * (non-Javadoc) + * @see org.springframework.data.mongodb.core.aggregation.Field#isAliased() + */ + @Override + public boolean isAliased() { + return field.isAliased(); + } + /** * Returns whether the field can be referred to using the given name. * @@ -349,7 +358,6 @@ public class ExposedFields implements Iterable { public String getRaw() { String target = field.getTarget(); - return field.synthetic ? target : String.format("%s.%s", Fields.UNDERSCORE_ID, target); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Field.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Field.java index 76a01f1af..4ac7f5b18 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Field.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Field.java @@ -36,4 +36,11 @@ public interface Field { * @return must not be {@literal null}. */ String getTarget(); + + /** + * Returns whether the Field is aliased, which means it has a name set different from the target. + * + * @return + */ + boolean isAliased(); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java index 15fb4ec13..b729cce4f 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java @@ -237,6 +237,15 @@ public class Fields implements Iterable { return StringUtils.hasText(this.target) ? this.target : this.name; } + /* + * (non-Javadoc) + * @see org.springframework.data.mongodb.core.aggregation.Field#isAliased() + */ + @Override + public boolean isAliased() { + return !getName().equals(getTarget()); + } + /* * (non-Javadoc) * @see java.lang.Object#toString() 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 3bc28b69c..540ac9087 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 @@ -627,15 +627,8 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation { // check whether referenced field exists in the context FieldReference reference = context.getReference(field.getTarget()); + return reference.isSynthetic() && !field.isAliased() ? 1 : reference.toString(); - if (field.getName().equals(field.getTarget()) && reference.isSynthetic()) { - - // render field as included - return 1; - } - - // render field reference - return reference.toString(); } else if (Boolean.FALSE.equals(value)) { // render field as excluded diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationUnitTests.java index bfb50de3e..ac6df23e1 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationUnitTests.java @@ -117,7 +117,7 @@ public class AggregationUnitTests { @SuppressWarnings("unchecked") DBObject secondProjection = ((List) agg.get("pipeline")).get(2); DBObject fields = DBObjectTestUtils.getAsDBObject(secondProjection, "$project"); - assertThat((Integer) fields.get("aCnt"), is(1)); - assertThat((String) fields.get("a"), is("$_id.a")); + assertThat(fields.get("aCnt"), is((Object) 1)); + assertThat(fields.get("a"), is((Object) "$_id.a")); } } 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 d9c49475d..2c0b2fbc5 100644 --- 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 @@ -68,7 +68,7 @@ public class ProjectionOperationUnitTests { DBObject dbObject = operation.toDBObject(Aggregation.DEFAULT_CONTEXT); DBObject projectClause = DBObjectTestUtils.getAsDBObject(dbObject, PROJECT); - assertThat((Integer) projectClause.get("foo"), is(1)); + assertThat(projectClause.get("foo"), is((Object) 1)); assertThat(projectClause.get("bar"), is((Object) "$foobar")); }