From bb280bd59be05630a6f9967954556201d622a4d8 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Tue, 2 Jul 2019 14:24:02 +0200 Subject: [PATCH] DATAMONGO-2200 - Polishing. Tweak Javadoc. Simplify Fields creation from Stream. Remove final modifier from private static method. Iterate with loop over PersistentEntity. Original pull request: #748. --- .../aggregation/AggregationOperationContext.java | 14 +++++++------- .../data/mongodb/core/aggregation/Fields.java | 2 +- .../core/aggregation/ProjectionOperation.java | 4 ++-- .../TypeBasedAggregationOperationContext.java | 13 ++++++++++--- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AggregationOperationContext.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AggregationOperationContext.java index e73441958..e16d398cd 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AggregationOperationContext.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AggregationOperationContext.java @@ -18,10 +18,9 @@ package org.springframework.data.mongodb.core.aggregation; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; import org.bson.Document; + import org.springframework.beans.BeanUtils; import org.springframework.data.mongodb.core.aggregation.ExposedFields.FieldReference; import org.springframework.lang.Nullable; @@ -77,17 +76,20 @@ public interface AggregationOperationContext { FieldReference getReference(String name); /** - * Returns the {@link Fields} exposed by the type. May be a {@literal class} or an {@literal interface}. + * Returns the {@link Fields} exposed by the type. May be a {@literal class} or an {@literal interface}. The default + * implementation uses {@link BeanUtils#getPropertyDescriptors(Class) property descriptors} discover fields from a + * {@link Class}. * * @param type must not be {@literal null}. * @return never {@literal null}. * @since 2.2 + * @see BeanUtils#getPropertyDescriptor(Class, String) */ default Fields getFields(Class type) { Assert.notNull(type, "Type must not be null!"); - List fields = Arrays.stream(BeanUtils.getPropertyDescriptors(type)) // + return Fields.fields(Arrays.stream(BeanUtils.getPropertyDescriptors(type)) // .filter(it -> { // object and default methods Method method = it.getReadMethod(); if (method == null) { @@ -99,8 +101,6 @@ public interface AggregationOperationContext { return !method.isDefault(); }) // .map(PropertyDescriptor::getName) // - .collect(Collectors.toList()); - - return Fields.fields(fields.toArray(new String[0])); + .toArray(String[]::new)); } } 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 664c5c370..8e00bc2a6 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 @@ -112,7 +112,7 @@ public final class Fields implements Iterable { this.fields = verify(fields); } - private static final List verify(List fields) { + private static List verify(List fields) { Map reference = new HashMap(); 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 3b0e94e42..18f48b574 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 @@ -22,6 +22,7 @@ import java.util.Collections; import java.util.List; import org.bson.Document; + import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond; import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.IfNull; import org.springframework.data.mongodb.core.aggregation.ExposedFields.ExposedField; @@ -30,7 +31,6 @@ import org.springframework.data.mongodb.core.aggregation.ProjectionOperation.Pro import org.springframework.data.mongodb.core.aggregation.VariableOperators.Let.ExpressionVariable; import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import org.springframework.util.ReflectionUtils; /** * Encapsulates the aggregation framework {@code $project}-operation. @@ -1739,7 +1739,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation { Document projections = new Document(); Fields fields = context.getFields(type); - fields.asList().forEach(it -> projections.append(it.getName(), 1)); + fields.forEach(it -> projections.append(it.getName(), 1)); return context.getMappedObject(projections, type); } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/TypeBasedAggregationOperationContext.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/TypeBasedAggregationOperationContext.java index ce116e40c..5595c4e47 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/TypeBasedAggregationOperationContext.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/TypeBasedAggregationOperationContext.java @@ -21,8 +21,8 @@ import java.util.ArrayList; import java.util.List; import org.bson.Document; + import org.springframework.data.mapping.PersistentPropertyPath; -import org.springframework.data.mapping.SimplePropertyHandler; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mongodb.core.aggregation.ExposedFields.DirectFieldReference; import org.springframework.data.mongodb.core.aggregation.ExposedFields.ExposedField; @@ -111,14 +111,21 @@ public class TypeBasedAggregationOperationContext implements AggregationOperatio @Override public Fields getFields(Class type) { + Assert.notNull(type, "Type must not be null!"); + MongoPersistentEntity entity = mappingContext.getPersistentEntity(type); + if (entity == null) { return AggregationOperationContext.super.getFields(type); } List fields = new ArrayList<>(); - entity.doWithProperties((SimplePropertyHandler) it -> fields.add(it.getName())); - return Fields.fields(fields.toArray(new String[fields.size()])); + + for (MongoPersistentProperty property : entity) { + fields.add(property.getName()); + } + + return Fields.fields(fields.toArray(new String[0])); } private FieldReference getReferenceFor(Field field) {