From 4633380ae40825100f92cc5984b99d136c8dff35 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Tue, 24 Sep 2024 16:04:48 +0200 Subject: [PATCH] Polishing. Add missing Override annotations. Eagerly compute input properties. See #3163 --- .../DefaultProjectionInformation.java | 13 +++++--- .../data/repository/query/ReturnedType.java | 31 ++++++++++++------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/springframework/data/projection/DefaultProjectionInformation.java b/src/main/java/org/springframework/data/projection/DefaultProjectionInformation.java index 21253e85a..8f76ac6f0 100644 --- a/src/main/java/org/springframework/data/projection/DefaultProjectionInformation.java +++ b/src/main/java/org/springframework/data/projection/DefaultProjectionInformation.java @@ -29,6 +29,7 @@ import java.util.stream.Stream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import org.springframework.beans.BeanUtils; import org.springframework.core.log.LogMessage; import org.springframework.core.type.AnnotationMetadata; @@ -53,6 +54,7 @@ class DefaultProjectionInformation implements ProjectionInformation { private final Class projectionType; private final List properties; + private final List inputProperties; /** * Creates a new {@link DefaultProjectionInformation} for the given type. @@ -65,6 +67,10 @@ class DefaultProjectionInformation implements ProjectionInformation { this.projectionType = type; this.properties = new PropertyDescriptorSource(type).getDescriptors(); + this.inputProperties = properties.stream()// + .filter(this::isInputProperty)// + .distinct()// + .toList(); } @Override @@ -72,12 +78,9 @@ class DefaultProjectionInformation implements ProjectionInformation { return projectionType; } + @Override public List getInputProperties() { - - return properties.stream()// - .filter(this::isInputProperty)// - .distinct()// - .collect(Collectors.toList()); + return inputProperties; } @Override diff --git a/src/main/java/org/springframework/data/repository/query/ReturnedType.java b/src/main/java/org/springframework/data/repository/query/ReturnedType.java index 51cead902..780cbdfee 100644 --- a/src/main/java/org/springframework/data/repository/query/ReturnedType.java +++ b/src/main/java/org/springframework/data/repository/query/ReturnedType.java @@ -143,6 +143,7 @@ public abstract class ReturnedType { private final ProjectionInformation information; private final Class domainType; + private final List inputProperties; /** * Creates a new {@link ReturnedInterface} from the given {@link ProjectionInformation} and domain type. @@ -158,6 +159,20 @@ public abstract class ReturnedType { this.information = information; this.domainType = domainType; + this.inputProperties = detectInputProperties(information); + } + + private static List detectInputProperties(ProjectionInformation information) { + + List properties = new ArrayList<>(); + + for (PropertyDescriptor descriptor : information.getInputProperties()) { + if (!properties.contains(descriptor.getName())) { + properties.add(descriptor.getName()); + } + } + + return Collections.unmodifiableList(properties); } @Override @@ -165,6 +180,7 @@ public abstract class ReturnedType { return information.getType(); } + @Override public boolean needsCustomConstruction() { return isProjecting() && information.isClosed(); } @@ -182,16 +198,7 @@ public abstract class ReturnedType { @Override public List getInputProperties() { - - List properties = new ArrayList<>(); - - for (PropertyDescriptor descriptor : information.getInputProperties()) { - if (!properties.contains(descriptor.getName())) { - properties.add(descriptor.getName()); - } - } - - return properties; + return inputProperties; } } @@ -231,6 +238,7 @@ public abstract class ReturnedType { return type; } + @Override @NonNull public Class getTypeToRead() { return type; @@ -241,6 +249,7 @@ public abstract class ReturnedType { return isDto(); } + @Override public boolean needsCustomConstruction() { return isDto() && !inputProperties.isEmpty(); } @@ -268,7 +277,7 @@ public abstract class ReturnedType { properties.add(parameter.getName()); } - return properties; + return Collections.unmodifiableList(properties); } private boolean isDto() {