Skip to content

Commit 4ec995f

Browse files
stefanbildlmp911de
authored andcommitted
Skip reference lookup when DocumentReference resolves to an empty collection.
Fixes #4612 Original pull request: #4613
1 parent 37aaf53 commit 4ec995f

File tree

2 files changed

+21
-9
lines changed

2 files changed

+21
-9
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/ReferenceLookupDelegate.java

+6
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
*
6161
* @author Christoph Strobl
6262
* @author Mark Paluch
63+
* @author Stefan Bildl
6364
* @since 3.3
6465
*/
6566
public final class ReferenceLookupDelegate {
@@ -106,6 +107,11 @@ public Object readReference(MongoPersistentProperty property, Object source, Loo
106107
Object value = source instanceof DocumentReferenceSource documentReferenceSource ? documentReferenceSource.getTargetSource()
107108
: source;
108109

110+
// GH-4612 no need to query database if target collection is empty
111+
if (value != null && property.isCollectionLike() && (value instanceof Collection<?> c) && c.isEmpty()) {
112+
return new ArrayList<>();
113+
}
114+
109115
DocumentReferenceQuery filter = computeFilter(property, source, spELContext);
110116
ReferenceCollection referenceCollection = computeReferenceContext(property, value, spELContext);
111117

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/ReferenceLookupDelegateUnitTests.java

+15-9
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,23 @@
1515
*/
1616
package org.springframework.data.mongodb.core.convert;
1717

18-
import static org.assertj.core.api.Assertions.*;
19-
import static org.mockito.Mockito.*;
20-
21-
import java.util.Collections;
22-
2318
import org.junit.jupiter.api.BeforeEach;
2419
import org.junit.jupiter.api.Test;
2520
import org.junit.jupiter.api.extension.ExtendWith;
2621
import org.mockito.Mock;
2722
import org.mockito.junit.jupiter.MockitoExtension;
28-
2923
import org.springframework.data.mapping.context.MappingContext;
3024
import org.springframework.data.mapping.model.SpELContext;
3125
import org.springframework.data.mongodb.core.convert.ReferenceResolver.MongoEntityReader;
3226
import org.springframework.data.mongodb.core.mapping.DocumentReference;
3327
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
3428
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
3529
import org.springframework.expression.EvaluationContext;
36-
import org.springframework.expression.spel.standard.SpelExpressionParser;
30+
31+
import java.util.Collections;
32+
33+
import static org.assertj.core.api.Assertions.assertThat;
34+
import static org.mockito.Mockito.*;
3735

3836
/**
3937
* Unit tests for {@link ReferenceLookupDelegate}.
@@ -52,9 +50,17 @@ class ReferenceLookupDelegateUnitTests {
5250

5351
@BeforeEach
5452
void beforeEach() {
55-
5653
lookupDelegate = new ReferenceLookupDelegate(mappingContext, spELContext);
57-
when(spELContext.getParser()).thenReturn(new SpelExpressionParser());
54+
}
55+
56+
@Test // GH-4612
57+
void shouldResolveEmptyListOnEmptyTargetCollection() {
58+
MongoPersistentProperty property = mock(MongoPersistentProperty.class);
59+
ReferenceLookupDelegate.LookupFunction lookupFunction = mock(ReferenceLookupDelegate.LookupFunction.class);
60+
61+
when(property.isCollectionLike()).thenReturn(true);
62+
lookupDelegate.readReference(property, Collections.emptyList(), lookupFunction, entityReader);
63+
verify(lookupFunction, never()).apply(any(), any());
5864
}
5965

6066
@Test // GH-3842

0 commit comments

Comments
 (0)