Skip to content

Commit 5bd83c6

Browse files
Replace BiFunctions with custom functional interfaces
1 parent d3e21be commit 5bd83c6

File tree

7 files changed

+54
-51
lines changed

7 files changed

+54
-51
lines changed

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,20 +44,20 @@ public ReferenceLoader getReferenceLoader() {
4444
@Nullable
4545
@Override
4646
public Object resolveReference(MongoPersistentProperty property, Object source, ReferenceReader referenceReader,
47-
BiFunction<ReferenceContext, DocumentReferenceQuery, Iterable<Document>> lookupFunction, BiFunction<MongoPersistentProperty, Object, Object> documentConversionFunction) {
47+
LookupFunction lookupFunction, ResultConversionFunction resultConversionFunction) {
4848

4949
if (isLazyReference(property)) {
50-
return createLazyLoadingProxy(property, source, referenceReader, lookupFunction, documentConversionFunction);
50+
return createLazyLoadingProxy(property, source, referenceReader, lookupFunction, resultConversionFunction);
5151
}
5252

53-
return referenceReader.readReference(property, source, lookupFunction, documentConversionFunction);
53+
return referenceReader.readReference(property, source, lookupFunction, resultConversionFunction);
5454
}
5555

5656
private Object createLazyLoadingProxy(MongoPersistentProperty property, Object source,
57-
ReferenceReader referenceReader, BiFunction<ReferenceContext, DocumentReferenceQuery, Iterable<Document>> lookupFunction,
58-
BiFunction<MongoPersistentProperty, Object, Object> documentConversionFunction
57+
ReferenceReader referenceReader, LookupFunction lookupFunction,
58+
ResultConversionFunction resultConversionFunction
5959
) {
60-
return new LazyLoadingProxyGenerator(referenceReader).createLazyLoadingProxy(property, source, lookupFunction, documentConversionFunction);
60+
return new LazyLoadingProxyGenerator(referenceReader).createLazyLoadingProxy(property, source, lookupFunction, resultConversionFunction);
6161
}
6262

6363
protected boolean isLazyReference(MongoPersistentProperty property) {

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

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@
3434
import org.springframework.cglib.proxy.Factory;
3535
import org.springframework.cglib.proxy.MethodProxy;
3636
import org.springframework.data.mongodb.core.convert.ReferenceLoader.DocumentReferenceQuery;
37+
import org.springframework.data.mongodb.core.convert.ReferenceResolver.LookupFunction;
3738
import org.springframework.data.mongodb.core.convert.ReferenceResolver.ReferenceContext;
39+
import org.springframework.data.mongodb.core.convert.ReferenceResolver.ResultConversionFunction;
3840
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
3941
import org.springframework.data.util.TypeInformation;
4042
import org.springframework.objenesis.ObjenesisStd;
@@ -55,11 +57,11 @@ public LazyLoadingProxyGenerator(ReferenceReader referenceReader) {
5557
}
5658

5759
public Object createLazyLoadingProxy(MongoPersistentProperty property, Object source,
58-
BiFunction<ReferenceContext, DocumentReferenceQuery, Iterable<Document>> lookupFunction,
59-
BiFunction<MongoPersistentProperty, Object, Object> documentConversionFunction) {
60+
LookupFunction lookupFunction,
61+
ResultConversionFunction resultConversionFunction) {
6062

6163
Class<?> propertyType = property.getType();
62-
LazyLoadingInterceptor interceptor = new LazyLoadingInterceptor(property, source, referenceReader, lookupFunction, documentConversionFunction);
64+
LazyLoadingInterceptor interceptor = new LazyLoadingInterceptor(property, source, referenceReader, lookupFunction, resultConversionFunction);
6365

6466
if (!propertyType.isInterface()) {
6567

@@ -106,8 +108,8 @@ public static class LazyLoadingInterceptor
106108
private volatile boolean resolved;
107109
private @org.springframework.lang.Nullable Object result;
108110
private Object source;
109-
private BiFunction<ReferenceContext, DocumentReferenceQuery, Iterable<Document>> lookupFunction;
110-
private final BiFunction<MongoPersistentProperty, Object, Object> documentConversionFunction;
111+
private LookupFunction lookupFunction;
112+
private ResultConversionFunction resultConversionFunction;
111113

112114
private final Method INITIALIZE_METHOD, TO_DBREF_METHOD, FINALIZE_METHOD;
113115

@@ -122,14 +124,14 @@ public static class LazyLoadingInterceptor
122124
}
123125

124126
public LazyLoadingInterceptor(MongoPersistentProperty property, Object source, ReferenceReader reader,
125-
BiFunction<ReferenceContext, DocumentReferenceQuery, Iterable<Document>> lookupFunction,
126-
BiFunction<MongoPersistentProperty, Object, Object> documentConversionFunction) {
127+
LookupFunction lookupFunction,
128+
ResultConversionFunction resultConversionFunction) {
127129

128130
this.property = property;
129131
this.source = source;
130132
this.referenceReader = reader;
131133
this.lookupFunction = lookupFunction;
132-
this.documentConversionFunction = documentConversionFunction;
134+
this.resultConversionFunction = resultConversionFunction;
133135
}
134136

135137
@Nullable
@@ -238,7 +240,7 @@ private synchronized Object resolve() {
238240
// property.getOwner() != null ? property.getOwner().getName() : "unknown", property.getName());
239241
// }
240242

241-
return referenceReader.readReference(property, source, lookupFunction, documentConversionFunction);
243+
return referenceReader.readReference(property, source, lookupFunction, resultConversionFunction);
242244

243245
} catch (RuntimeException ex) {
244246
throw ex;

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

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@
6363
import org.springframework.data.mapping.model.SpELExpressionParameterValueProvider;
6464
import org.springframework.data.mongodb.CodecRegistryProvider;
6565
import org.springframework.data.mongodb.MongoDatabaseFactory;
66+
import org.springframework.data.mongodb.core.mapping.DocumentPointer;
6667
import org.springframework.data.mongodb.core.mapping.DocumentReference;
6768
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
6869
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
69-
import org.springframework.data.mongodb.core.mapping.DocumentPointer;
7070
import org.springframework.data.mongodb.core.mapping.Unwrapped;
7171
import org.springframework.data.mongodb.core.mapping.Unwrapped.OnEmpty;
7272
import org.springframework.data.mongodb.core.mapping.event.AfterConvertCallback;
@@ -365,7 +365,7 @@ private <S extends Object> S read(ConversionContext context, MongoPersistentEnti
365365
SpELExpressionEvaluator evaluator = new DefaultSpELExpressionEvaluator(bson, spELContext);
366366
DocumentAccessor documentAccessor = new DocumentAccessor(bson);
367367

368-
if(bson.get("_id") != null) {
368+
if (bson.get("_id") != null) {
369369

370370
Object existing = context.getPath().getPathItem(bson.get("_id"), entity.getCollection(), entity.getType());
371371
if (existing != null) {
@@ -459,7 +459,8 @@ private void readProperties(ConversionContext context, MongoPersistentEntity<?>
459459
callback = getDbRefResolverCallback(context, documentAccessor, evaluator);
460460
}
461461

462-
readAssociation(prop.getRequiredAssociation(), accessor, documentAccessor, dbRefProxyHandler, callback, context, evaluator);
462+
readAssociation(prop.getRequiredAssociation(), accessor, documentAccessor, dbRefProxyHandler, callback, context,
463+
evaluator);
463464
continue;
464465
}
465466

@@ -486,7 +487,8 @@ private void readProperties(ConversionContext context, MongoPersistentEntity<?>
486487
callback = getDbRefResolverCallback(context, documentAccessor, evaluator);
487488
}
488489

489-
readAssociation(prop.getRequiredAssociation(), accessor, documentAccessor, dbRefProxyHandler, callback, context, evaluator);
490+
readAssociation(prop.getRequiredAssociation(), accessor, documentAccessor, dbRefProxyHandler, callback, context,
491+
evaluator);
490492
continue;
491493
}
492494

@@ -502,7 +504,8 @@ private DbRefResolverCallback getDbRefResolverCallback(ConversionContext context
502504
}
503505

504506
private void readAssociation(Association<MongoPersistentProperty> association, PersistentPropertyAccessor<?> accessor,
505-
DocumentAccessor documentAccessor, DbRefProxyHandler handler, DbRefResolverCallback callback, ConversionContext context, SpELExpressionEvaluator evaluator) {
507+
DocumentAccessor documentAccessor, DbRefProxyHandler handler, DbRefResolverCallback callback,
508+
ConversionContext context, SpELExpressionEvaluator evaluator) {
506509

507510
MongoPersistentProperty property = association.getInverse();
508511
final Object value = documentAccessor.get(property);
@@ -526,14 +529,7 @@ public Object getPointer() {
526529
}, property.getActualType()));
527530
} else {
528531
accessor.setProperty(property, dbRefResolver.resolveReference(property, value, referenceReader,
529-
(prop, document) -> {
530-
531-
532-
return context.convert(document, prop.getTypeInformation());
533-
// return MappingMongoConverter.this.getValueInternal(context, prop, new Document(property.getFieldName(), document), evaluator);
534-
535-
// return this.read(context, prop.getPersistentEntity(), )
536-
}));
532+
(document, prop) -> context.convert(document, prop.getTypeInformation())));
537533
}
538534
return;
539535
}
@@ -871,15 +867,15 @@ protected Bson createMap(Map<Object, Object> map, MongoPersistentProperty proper
871867
if (conversions.isSimpleType(key.getClass())) {
872868

873869
String simpleKey = prepareMapKey(key.toString());
874-
if(property.isDbReference()) {
870+
if (property.isDbReference()) {
875871
document.put(simpleKey, value != null ? createDBRef(value, property) : null);
876872
} else {
877873
if (conversionService.canConvert(value.getClass(), DocumentPointer.class)) {
878874
document.put(simpleKey, conversionService.convert(value, DocumentPointer.class).getPointer());
879875
} else {
880876
// just take the id as a reference
881-
document.put(simpleKey, mappingContext.getPersistentEntity(property.getAssociationTargetType()).getIdentifierAccessor(value)
882-
.getIdentifier());
877+
document.put(simpleKey, mappingContext.getPersistentEntity(property.getAssociationTargetType())
878+
.getIdentifierAccessor(value).getIdentifier());
883879
}
884880
}
885881

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ private <T> T handle() throws UnsupportedOperationException {
7777
@Nullable
7878
@Override
7979
public Object resolveReference(MongoPersistentProperty property, Object source, ReferenceReader referenceReader,
80-
BiFunction<ReferenceContext, DocumentReferenceQuery, Iterable<Document>> lookupFunction,
81-
BiFunction<MongoPersistentProperty, Object, Object> documentConversionFunction) {
80+
LookupFunction lookupFunction,
81+
ResultConversionFunction resultConversionFunction) {
8282
return null;
8383
}
8484

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@
3333
import org.springframework.data.mapping.context.MappingContext;
3434
import org.springframework.data.mapping.model.SpELContext;
3535
import org.springframework.data.mongodb.core.convert.ReferenceLoader.DocumentReferenceQuery;
36+
import org.springframework.data.mongodb.core.convert.ReferenceResolver.LookupFunction;
3637
import org.springframework.data.mongodb.core.convert.ReferenceResolver.ReferenceContext;
38+
import org.springframework.data.mongodb.core.convert.ReferenceResolver.ResultConversionFunction;
3739
import org.springframework.data.mongodb.core.mapping.DocumentReference;
3840
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
3941
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
@@ -78,25 +80,25 @@ public ReferenceReader(
7880
}
7981

8082
Object readReference(MongoPersistentProperty property, Object value,
81-
BiFunction<ReferenceContext, DocumentReferenceQuery, Iterable<Document>> lookupFunction,
82-
BiFunction<MongoPersistentProperty, Object, Object> documentConversionFunction) {
83+
LookupFunction lookupFunction,
84+
ResultConversionFunction resultConversionFunction) {
8385

8486
SpELContext spELContext = spelContextSupplier.get();
8587

8688
DocumentReferenceQuery filter = computeFilter(property, value, spELContext);
8789
ReferenceContext referenceContext = computeReferenceContext(property, value, spELContext);
8890

89-
Iterable<Document> result = lookupFunction.apply(referenceContext, filter);
91+
Iterable<Document> result = lookupFunction.apply(filter, referenceContext);
9092

9193
if(!result.iterator().hasNext()) {
9294
return null;
9395
}
9496

9597
if (property.isCollectionLike()) {
96-
return documentConversionFunction.apply(property, result);
98+
return resultConversionFunction.apply(result, property);
9799
}
98100

99-
return documentConversionFunction.apply(property, result.iterator().next());
101+
return resultConversionFunction.apply(result.iterator().next(), property);
100102

101103
}
102104

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

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,11 @@
1616
package org.springframework.data.mongodb.core.convert;
1717

1818
import java.util.Collections;
19-
import java.util.LinkedHashMap;
20-
import java.util.LinkedHashSet;
21-
import java.util.Map;
22-
import java.util.Set;
2319
import java.util.function.BiFunction;
24-
import java.util.stream.Stream;
2520

2621
import org.bson.Document;
27-
import org.bson.conversions.Bson;
2822
import org.springframework.data.mongodb.core.convert.ReferenceLoader.DocumentReferenceQuery;
2923
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
30-
import org.springframework.data.util.TypeInformation;
3124
import org.springframework.lang.Nullable;
3225

3326
import com.mongodb.DBRef;
@@ -39,20 +32,20 @@ public interface ReferenceResolver {
3932

4033
@Nullable
4134
Object resolveReference(MongoPersistentProperty property, Object source, ReferenceReader referenceReader,
42-
BiFunction<ReferenceContext, DocumentReferenceQuery, Iterable<Document>> lookupFunction,
43-
BiFunction<MongoPersistentProperty, Object, Object> documentConversionFunction);
35+
LookupFunction lookupFunction, ResultConversionFunction resultConversionFunction);
4436

45-
default Object resolveReference(MongoPersistentProperty property, Object source, ReferenceReader referenceReader, BiFunction<MongoPersistentProperty, Object, Object> documentConversionFunction) {
37+
default Object resolveReference(MongoPersistentProperty property, Object source, ReferenceReader referenceReader,
38+
ResultConversionFunction resultConversionFunction) {
4639

47-
return resolveReference(property, source, referenceReader, (ctx, filter) -> {
40+
return resolveReference(property, source, referenceReader, (filter, ctx) -> {
4841
if (property.isCollectionLike() || property.isMap()) {
4942
return getReferenceLoader().bulkFetch(filter, ctx);
5043

5144
}
5245

5346
Object target = getReferenceLoader().fetch(filter, ctx);
5447
return target == null ? Collections.emptyList() : Collections.singleton(getReferenceLoader().fetch(filter, ctx));
55-
}, documentConversionFunction);
48+
}, resultConversionFunction);
5649
}
5750

5851
ReferenceLoader getReferenceLoader();
@@ -82,4 +75,14 @@ public String getDatabase() {
8275
return database;
8376
}
8477
}
78+
79+
@FunctionalInterface
80+
interface LookupFunction {
81+
Iterable<Document> apply(DocumentReferenceQuery referenceQuery, ReferenceContext referenceContext);
82+
}
83+
84+
@FunctionalInterface
85+
interface ResultConversionFunction {
86+
Object apply(Object source, MongoPersistentProperty property);
87+
}
8588
}

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/performance/ReactivePerformanceTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public void setUp() throws Exception {
106106

107107
@Nullable
108108
@Override
109-
public Object resolveReference(MongoPersistentProperty property, Object source, ReferenceReader referenceReader, BiFunction<ReferenceContext, DocumentReferenceQuery, Iterable<Document>> lookupFunction, BiFunction<MongoPersistentProperty, Object, Object> documentConversionFunction) {
109+
public Object resolveReference(MongoPersistentProperty property, Object source, ReferenceReader referenceReader, LookupFunction lookupFunction, ResultConversionFunction resultConversionFunction) {
110110
return null;
111111
}
112112

0 commit comments

Comments
 (0)