Skip to content

Commit cea4e08

Browse files
committed
Polishing in SelfDescribingDataFetcher
1 parent 7b728fe commit cea4e08

File tree

7 files changed

+52
-54
lines changed

7 files changed

+52
-54
lines changed

Diff for: spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/AnnotatedControllerConfigurer.java

+14-18
Original file line numberDiff line numberDiff line change
@@ -464,13 +464,12 @@ static class SchemaMappingDataFetcher implements SelfDescribingDataFetcher<Objec
464464
this.executor = executor;
465465
this.invokeAsync = invokeAsync;
466466
this.subscription = this.mappingInfo.getCoordinates().getTypeName().equalsIgnoreCase("Subscription");
467-
this.usesDataLoader = hasDataLoaderParameter();
467+
this.usesDataLoader = hasDataLoaderParameter(info.getHandlerMethod());
468468
}
469469

470-
private boolean hasDataLoaderParameter() {
471-
Method handlerMethod = this.mappingInfo.getHandlerMethod().getMethod();
472-
for (Class<?> parameterType : handlerMethod.getParameterTypes()) {
473-
if (DataLoader.class.equals(parameterType)) {
470+
private static boolean hasDataLoaderParameter(HandlerMethod method) {
471+
for (MethodParameter type : method.getMethodParameters()) {
472+
if (DataLoader.class.equals(type.getParameterType())) {
474473
return true;
475474
}
476475
}
@@ -484,7 +483,11 @@ public String getDescription() {
484483

485484
@Override
486485
public ResolvableType getReturnType() {
487-
return ResolvableType.forMethodReturnType(this.mappingInfo.getHandlerMethod().getMethod());
486+
return ResolvableType.forMethodReturnType(getHandlerMethod().getMethod());
487+
}
488+
489+
HandlerMethod getHandlerMethod() {
490+
return this.mappingInfo.getHandlerMethod();
488491
}
489492

490493
@Override
@@ -493,19 +496,17 @@ public Map<String, ResolvableType> getArguments() {
493496
Predicate<MethodParameter> argumentPredicate = (p) ->
494497
(p.getParameterAnnotation(Argument.class) != null || p.getParameterType() == ArgumentValue.class);
495498

496-
return Arrays.stream(this.mappingInfo.getHandlerMethod().getMethodParameters())
499+
return Arrays.stream(getHandlerMethod().getMethodParameters())
497500
.filter(argumentPredicate)
498501
.peek((p) -> p.initParameterNameDiscovery(parameterNameDiscoverer))
499502
.collect(Collectors.toMap(
500503
ArgumentMethodArgumentResolver::getArgumentName,
501504
ResolvableType::forMethodParameter));
502505
}
503506

504-
/**
505-
* Return the {@link HandlerMethod} used to fetch data.
506-
*/
507-
HandlerMethod getHandlerMethod() {
508-
return this.mappingInfo.getHandlerMethod();
507+
@Override
508+
public boolean usesDataLoader() {
509+
return this.usesDataLoader;
509510
}
510511

511512
@Override
@@ -564,11 +565,6 @@ private <T> Publisher<T> handleSubscriptionError(
564565
.switchIfEmpty(Mono.error(ex));
565566
}
566567

567-
@Override
568-
public boolean isBatchLoading() {
569-
return this.usesDataLoader;
570-
}
571-
572568
@Override
573569
public String toString() {
574570
return getDescription();
@@ -614,7 +610,7 @@ public Object get(DataFetchingEnvironment env) {
614610
}
615611

616612
@Override
617-
public boolean isBatchLoading() {
613+
public boolean usesDataLoader() {
618614
return true;
619615
}
620616

Diff for: spring-graphql/src/main/java/org/springframework/graphql/execution/ContextDataFetcherDecorator.java

+28-28
Original file line numberDiff line numberDiff line change
@@ -150,17 +150,6 @@ static GraphQLTypeVisitor createVisitor(List<SubscriptionExceptionResolver> reso
150150
return new ContextTypeVisitor(resolvers);
151151
}
152152

153-
private static ContextDataFetcherDecorator decorate(
154-
DataFetcher<?> delegate, boolean handlesSubscription,
155-
SubscriptionExceptionResolver subscriptionExceptionResolver) {
156-
if (delegate instanceof SelfDescribingDataFetcher<?> selfDescribingDataFetcher) {
157-
return new SelfDescribingDecorator(selfDescribingDataFetcher, handlesSubscription, subscriptionExceptionResolver);
158-
}
159-
else {
160-
return new ContextDataFetcherDecorator(delegate, handlesSubscription, subscriptionExceptionResolver);
161-
}
162-
}
163-
164153

165154
/**
166155
* Type visitor to apply {@link ContextDataFetcherDecorator}.
@@ -185,8 +174,8 @@ public TraversalControl visitGraphQLFieldDefinition(
185174
DataFetcher<?> dataFetcher = codeRegistry.getDataFetcher(fieldCoordinates, fieldDefinition);
186175

187176
if (applyDecorator(dataFetcher)) {
188-
boolean handlesSubscription = visitorHelper.isSubscriptionType(parent);
189-
dataFetcher = ContextDataFetcherDecorator.decorate(dataFetcher, handlesSubscription, this.exceptionResolver);
177+
boolean subscriptionType = visitorHelper.isSubscriptionType(parent);
178+
dataFetcher = decorate(dataFetcher, subscriptionType, this.exceptionResolver);
190179
codeRegistry.dataFetcher(fieldCoordinates, dataFetcher);
191180
}
192181

@@ -205,37 +194,48 @@ private boolean applyDecorator(DataFetcher<?> dataFetcher) {
205194
}
206195
return true;
207196
}
197+
198+
private static ContextDataFetcherDecorator decorate(
199+
DataFetcher<?> dataFetcher, boolean subscriptionType, SubscriptionExceptionResolver exceptionResolver) {
200+
201+
return ((dataFetcher instanceof SelfDescribingDataFetcher<?> sddf) ?
202+
new SelfDescribingContextDataFetcherDecorator(sddf, subscriptionType, exceptionResolver) :
203+
new ContextDataFetcherDecorator(dataFetcher, subscriptionType, exceptionResolver));
204+
}
208205
}
209206

210-
private static final class SelfDescribingDecorator extends ContextDataFetcherDecorator implements SelfDescribingDataFetcher<Object> {
211207

212-
private final SelfDescribingDataFetcher<?> selfDescribingDataFetcher;
208+
private static final class SelfDescribingContextDataFetcherDecorator extends ContextDataFetcherDecorator
209+
implements SelfDescribingDataFetcher<Object> {
213210

214-
private SelfDescribingDecorator(
215-
SelfDescribingDataFetcher<?> delegate, boolean subscription,
216-
SubscriptionExceptionResolver subscriptionExceptionResolver) {
217-
super(delegate, subscription, subscriptionExceptionResolver);
218-
this.selfDescribingDataFetcher = delegate;
211+
private final SelfDescribingDataFetcher<?> delegate;
212+
213+
private SelfDescribingContextDataFetcherDecorator(
214+
SelfDescribingDataFetcher<?> delegate, boolean subscriptionType,
215+
SubscriptionExceptionResolver exceptionResolver) {
216+
217+
super(delegate, subscriptionType, exceptionResolver);
218+
this.delegate = delegate;
219219
}
220220

221221
@Override
222-
public boolean isBatchLoading() {
223-
return this.selfDescribingDataFetcher.isBatchLoading();
222+
public String getDescription() {
223+
return this.delegate.getDescription();
224224
}
225225

226226
@Override
227-
public Map<String, ResolvableType> getArguments() {
228-
return this.selfDescribingDataFetcher.getArguments();
227+
public ResolvableType getReturnType() {
228+
return this.delegate.getReturnType();
229229
}
230230

231231
@Override
232-
public ResolvableType getReturnType() {
233-
return this.selfDescribingDataFetcher.getReturnType();
232+
public Map<String, ResolvableType> getArguments() {
233+
return this.delegate.getArguments();
234234
}
235235

236236
@Override
237-
public String getDescription() {
238-
return this.selfDescribingDataFetcher.getDescription();
237+
public boolean usesDataLoader() {
238+
return this.delegate.usesDataLoader();
239239
}
240240
}
241241

Diff for: spring-graphql/src/main/java/org/springframework/graphql/execution/SelfDescribingDataFetcher.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,13 @@ default Map<String, ResolvableType> getArguments() {
6060
}
6161

6262
/**
63-
* Return whether this {@code DataFetcher} is using batch loading.
64-
* @return {@code true} if the data fetcher is batch loading elements
63+
* Whether this {@code DataFetcher} uses a {@link org.dataloader.DataLoader}
64+
* to return data. This represents a deferred operation that is typically
65+
* repeatable, and a candidate for aggregation from a metrics and tracing
66+
* perspective.
6567
* @since 1.4.0
6668
*/
67-
default boolean isBatchLoading() {
69+
default boolean usesDataLoader() {
6870
return false;
6971
}
7072

Diff for: spring-graphql/src/main/java/org/springframework/graphql/observation/GraphQlObservationInstrumentation.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ public DataFetcher<?> instrumentDataFetcher(DataFetcher<?> dataFetcher,
187187
&& state == RequestObservationInstrumentationState.INSTANCE) {
188188
// skip batch loading operations, already instrumented at the dataloader level
189189
if (dataFetcher instanceof SelfDescribingDataFetcher<?> selfDescribingDataFetcher
190-
&& selfDescribingDataFetcher.isBatchLoading()) {
190+
&& selfDescribingDataFetcher.usesDataLoader()) {
191191
return dataFetcher;
192192
}
193193
return (environment) -> {

Diff for: spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/BatchMappingDetectionTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ void dataFetchersMarkedAsBatchLoading() {
8383
initRuntimeWiringBuilder(BookController.class).build().getDataFetchers();
8484
assertThat(dataFetcherMap.get("Book").values()).allMatch(dataFetcher ->
8585
dataFetcher instanceof SelfDescribingDataFetcher<?> selfDescribingDataFetcher
86-
&& selfDescribingDataFetcher.isBatchLoading());
86+
&& selfDescribingDataFetcher.usesDataLoader());
8787
}
8888

8989
@Test

Diff for: spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingDetectionTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,13 @@ void batchLoadingDataFetchers() {
9191
Map<String, DataFetcher> queries = map.get("Book");
9292
assertThat(queries.values()).allMatch(dataFetcher ->
9393
dataFetcher instanceof SelfDescribingDataFetcher<?> selfDescribingDataFetcher
94-
&& !selfDescribingDataFetcher.isBatchLoading());
94+
&& !selfDescribingDataFetcher.usesDataLoader());
9595

9696
map = initRuntimeWiringBuilder(BatchLoadingController.class).build().getDataFetchers();
9797
queries = map.get("Book");
9898
assertThat(queries.values()).allMatch(dataFetcher ->
9999
dataFetcher instanceof SelfDescribingDataFetcher<?> selfDescribingDataFetcher
100-
&& selfDescribingDataFetcher.isBatchLoading());
100+
&& selfDescribingDataFetcher.usesDataLoader());
101101
}
102102

103103
private RuntimeWiring.Builder initRuntimeWiringBuilder(Class<?> handlerType) {

Diff for: spring-graphql/src/test/java/org/springframework/graphql/observation/GraphQlObservationInstrumentationTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ void shouldRecordBatchLoadingAsSingleObservation() {
419419
static class AuthorBatchLoadingDataFetcher implements SelfDescribingDataFetcher<CompletableFuture<Author>> {
420420

421421
@Override
422-
public boolean isBatchLoading() {
422+
public boolean usesDataLoader() {
423423
return true;
424424
}
425425

0 commit comments

Comments
 (0)