From 3381774fb9146494b1f311b8f1c0c5788cd2ca77 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Tue, 20 Feb 2024 07:18:34 +0000 Subject: [PATCH 1/2] Improve check whether to create DataLoaderRegistry Closes gh-915 --- .../graphql/execution/DataLoaderRegistrar.java | 1 - .../execution/DefaultExecutionGraphQlService.java | 13 +++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/spring-graphql/src/main/java/org/springframework/graphql/execution/DataLoaderRegistrar.java b/spring-graphql/src/main/java/org/springframework/graphql/execution/DataLoaderRegistrar.java index bbeed39c..fae2ed82 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/execution/DataLoaderRegistrar.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/execution/DataLoaderRegistrar.java @@ -17,7 +17,6 @@ package org.springframework.graphql.execution; import graphql.ExecutionInput; import graphql.GraphQLContext; -import org.dataloader.BatchLoaderContextProvider; import org.dataloader.DataLoaderRegistry; /** diff --git a/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultExecutionGraphQlService.java b/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultExecutionGraphQlService.java index 267e3db8..f0c83065 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultExecutionGraphQlService.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultExecutionGraphQlService.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,6 +51,8 @@ public class DefaultExecutionGraphQlService implements ExecutionGraphQlService { private final List dataLoaderRegistrars = new ArrayList<>(); + private boolean hasDataLoaderRegistrations; + private final boolean isDefaultExecutionIdProvider; @@ -68,6 +70,13 @@ public class DefaultExecutionGraphQlService implements ExecutionGraphQlService { */ public void addDataLoaderRegistrar(DataLoaderRegistrar registrar) { this.dataLoaderRegistrars.add(registrar); + this.hasDataLoaderRegistrations = (this.hasDataLoaderRegistrations || hasRegistrations(registrar)); + } + + private static boolean hasRegistrations(DataLoaderRegistrar registrar) { + DataLoaderRegistry registry = DataLoaderRegistry.newRegistry().build(); + registrar.registerDataLoaders(registry, GraphQLContext.newContext().build()); + return !registry.getDataLoaders().isEmpty(); } @@ -87,7 +96,7 @@ public class DefaultExecutionGraphQlService implements ExecutionGraphQlService { } private ExecutionInput registerDataLoaders(ExecutionInput executionInput) { - if (!this.dataLoaderRegistrars.isEmpty()) { + if (this.hasDataLoaderRegistrations) { GraphQLContext graphQLContext = executionInput.getGraphQLContext(); DataLoaderRegistry existingRegistry = executionInput.getDataLoaderRegistry(); if (existingRegistry == DataLoaderDispatcherInstrumentationState.EMPTY_DATALOADER_REGISTRY) { From 43a76c487ae960a26c38f7400b55194bbe104b04 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Tue, 20 Feb 2024 07:20:54 +0000 Subject: [PATCH 2/2] Polishing See gh-915 --- .../DefaultExecutionGraphQlService.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultExecutionGraphQlService.java b/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultExecutionGraphQlService.java index f0c83065..e79b67b3 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultExecutionGraphQlService.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/execution/DefaultExecutionGraphQlService.java @@ -87,26 +87,30 @@ public class DefaultExecutionGraphQlService implements ExecutionGraphQlService { if (!this.isDefaultExecutionIdProvider && request.getExecutionId() == null) { request.configureExecutionInput(RESET_EXECUTION_ID_CONFIGURER); } + ExecutionInput executionInput = request.toExecutionInput(); - ContextSnapshot.captureFrom(contextView).updateContext(executionInput.getGraphQLContext()); - ExecutionInput updatedExecutionInput = registerDataLoaders(executionInput); + + GraphQLContext graphQLContext = executionInput.getGraphQLContext(); + ContextSnapshot.captureFrom(contextView).updateContext(graphQLContext); + + ExecutionInput updatedExecutionInput = + (this.hasDataLoaderRegistrations ? registerDataLoaders(executionInput) : executionInput); + return Mono.fromFuture(this.graphQlSource.graphQl().executeAsync(updatedExecutionInput)) .map(result -> new DefaultExecutionGraphQlResponse(updatedExecutionInput, result)); }); } private ExecutionInput registerDataLoaders(ExecutionInput executionInput) { - if (this.hasDataLoaderRegistrations) { - GraphQLContext graphQLContext = executionInput.getGraphQLContext(); - DataLoaderRegistry existingRegistry = executionInput.getDataLoaderRegistry(); - if (existingRegistry == DataLoaderDispatcherInstrumentationState.EMPTY_DATALOADER_REGISTRY) { - DataLoaderRegistry newRegistry = DataLoaderRegistry.newRegistry().build(); - applyDataLoaderRegistrars(newRegistry, graphQLContext); - executionInput = executionInput.transform(builder -> builder.dataLoaderRegistry(newRegistry)); - } - else { - applyDataLoaderRegistrars(existingRegistry, graphQLContext); - } + GraphQLContext graphQLContext = executionInput.getGraphQLContext(); + DataLoaderRegistry existingRegistry = executionInput.getDataLoaderRegistry(); + if (existingRegistry == DataLoaderDispatcherInstrumentationState.EMPTY_DATALOADER_REGISTRY) { + DataLoaderRegistry newRegistry = DataLoaderRegistry.newRegistry().build(); + applyDataLoaderRegistrars(newRegistry, graphQLContext); + executionInput = executionInput.transform(builder -> builder.dataLoaderRegistry(newRegistry)); + } + else { + applyDataLoaderRegistrars(existingRegistry, graphQLContext); } return executionInput; }