diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/ReferenceLoader.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/ReferenceLoader.java index cf7444e56..5128fe515 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/ReferenceLoader.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/ReferenceLoader.java @@ -130,7 +130,7 @@ public interface ReferenceLoader { /** * @return a {@link DocumentReferenceQuery} that will not match any documents. - * @since 4.3 + * @since 4.2.5 */ static DocumentReferenceQuery forNoResult() { return NoResultsFilter.INSTANCE; @@ -139,8 +139,8 @@ public interface ReferenceLoader { /** * A dedicated {@link DocumentReferenceQuery} that will not match any documents. - * - * @since 4.3 + * + * @since 4.2.5 */ enum NoResultsFilter implements DocumentReferenceQuery { INSTANCE; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/ReferenceLookupDelegate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/ReferenceLookupDelegate.java index 3cd5f0e98..1bcf4b1c0 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/ReferenceLookupDelegate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/ReferenceLookupDelegate.java @@ -240,7 +240,8 @@ public final class ReferenceLookupDelegate { EvaluationContext evaluationContextFor(MongoPersistentProperty property, Object source, SpELContext spELContext) { - Object target = source instanceof DocumentReferenceSource documentReferenceSource ? documentReferenceSource.getTargetSource() + Object target = source instanceof DocumentReferenceSource documentReferenceSource + ? documentReferenceSource.getTargetSource() : source; if (target == null) { @@ -285,6 +286,7 @@ public final class ReferenceLookupDelegate { Collection objects = (Collection) value; + // optimization: bypass query if the collection pointing to the references is empty if (objects.isEmpty()) { return DocumentReferenceQuery.forNoResult(); } @@ -301,7 +303,7 @@ public final class ReferenceLookupDelegate { if (property.isMap() && value instanceof Map) { - if(ObjectUtils.isEmpty(value)) { + if (ObjectUtils.isEmpty(value)) { return DocumentReferenceQuery.forNoResult(); } @@ -461,6 +463,7 @@ public final class ReferenceLookupDelegate { return target.stream().sorted((o1, o2) -> compareAgainstReferenceIndex(ors, o1, o2)).collect(Collectors.toList()); } + @Override public Document getQuery() { return query; }