3333import org .springframework .graphql .ExecutionGraphQlResponse ;
3434import org .springframework .graphql .ExecutionGraphQlService ;
3535import org .springframework .graphql .support .DefaultExecutionGraphQlResponse ;
36+ import org .springframework .lang .Nullable ;
3637
3738/**
3839 * {@link ExecutionGraphQlService} that uses a {@link GraphQlSource} to obtain a
@@ -51,7 +52,8 @@ public class DefaultExecutionGraphQlService implements ExecutionGraphQlService {
5152
5253 private final List <DataLoaderRegistrar > dataLoaderRegistrars = new ArrayList <>();
5354
54- private boolean hasDataLoaderRegistrations ;
55+ @ Nullable
56+ private Boolean hasDataLoaderRegistrations ;
5557
5658 private final boolean isDefaultExecutionIdProvider ;
5759
@@ -70,13 +72,6 @@ public DefaultExecutionGraphQlService(GraphQlSource graphQlSource) {
7072 */
7173 public void addDataLoaderRegistrar (DataLoaderRegistrar registrar ) {
7274 this .dataLoaderRegistrars .add (registrar );
73- this .hasDataLoaderRegistrations = (this .hasDataLoaderRegistrations || hasRegistrations (registrar ));
74- }
75-
76- private static boolean hasRegistrations (DataLoaderRegistrar registrar ) {
77- DataLoaderRegistry registry = DataLoaderRegistry .newRegistry ().build ();
78- registrar .registerDataLoaders (registry , GraphQLContext .newContext ().build ());
79- return !registry .getDataLoaders ().isEmpty ();
8075 }
8176
8277
@@ -93,28 +88,41 @@ public final Mono<ExecutionGraphQlResponse> execute(ExecutionGraphQlRequest requ
9388 GraphQLContext graphQLContext = executionInput .getGraphQLContext ();
9489 ContextSnapshot .captureFrom (contextView ).updateContext (graphQLContext );
9590
96- ExecutionInput updatedExecutionInput =
97- (this .hasDataLoaderRegistrations ? registerDataLoaders (executionInput ) : executionInput );
91+ ExecutionInput executionInputToUse = registerDataLoaders (executionInput );
9892
99- return Mono .fromFuture (this .graphQlSource .graphQl ().executeAsync (updatedExecutionInput ))
100- .map ((result ) -> new DefaultExecutionGraphQlResponse (updatedExecutionInput , result ));
93+ return Mono .fromFuture (this .graphQlSource .graphQl ().executeAsync (executionInputToUse ))
94+ .map ((result ) -> new DefaultExecutionGraphQlResponse (executionInputToUse , result ));
10195 });
10296 }
10397
10498 private ExecutionInput registerDataLoaders (ExecutionInput executionInput ) {
105- GraphQLContext graphQLContext = executionInput .getGraphQLContext ();
106- DataLoaderRegistry existingRegistry = executionInput .getDataLoaderRegistry ();
107- if (existingRegistry == DataLoaderDispatcherInstrumentationState .EMPTY_DATALOADER_REGISTRY ) {
108- DataLoaderRegistry newRegistry = DataLoaderRegistry .newRegistry ().build ();
109- applyDataLoaderRegistrars (newRegistry , graphQLContext );
110- executionInput = executionInput .transform ((builder ) -> builder .dataLoaderRegistry (newRegistry ));
99+ if (this .hasDataLoaderRegistrations == null ) {
100+ this .hasDataLoaderRegistrations = initHasDataLoaderRegistrations ();
111101 }
112- else {
113- applyDataLoaderRegistrars (existingRegistry , graphQLContext );
102+ if (this .hasDataLoaderRegistrations ) {
103+ GraphQLContext graphQLContext = executionInput .getGraphQLContext ();
104+ DataLoaderRegistry existingRegistry = executionInput .getDataLoaderRegistry ();
105+ if (existingRegistry == DataLoaderDispatcherInstrumentationState .EMPTY_DATALOADER_REGISTRY ) {
106+ DataLoaderRegistry newRegistry = DataLoaderRegistry .newRegistry ().build ();
107+ applyDataLoaderRegistrars (newRegistry , graphQLContext );
108+ executionInput = executionInput .transform ((builder ) -> builder .dataLoaderRegistry (newRegistry ));
109+ }
110+ else {
111+ applyDataLoaderRegistrars (existingRegistry , graphQLContext );
112+ }
114113 }
115114 return executionInput ;
116115 }
117116
117+ private boolean initHasDataLoaderRegistrations () {
118+ for (DataLoaderRegistrar registrar : this .dataLoaderRegistrars ) {
119+ if (registrar .hasRegistrations ()) {
120+ return true ;
121+ }
122+ }
123+ return false ;
124+ }
125+
118126 private void applyDataLoaderRegistrars (DataLoaderRegistry registry , GraphQLContext graphQLContext ) {
119127 this .dataLoaderRegistrars .forEach ((registrar ) -> registrar .registerDataLoaders (registry , graphQLContext ));
120128 }
0 commit comments