Skip to content

Commit 9c358d3

Browse files
authored
Merge pull request #4003 from graphql-java/chained-dataloader-optimize
minimize work done when chained dataloaders are disabled
2 parents 493e4cf + 3066c6f commit 9c358d3

2 files changed

Lines changed: 17 additions & 4 deletions

File tree

src/main/java/graphql/schema/DataFetchingEnvironmentImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import graphql.execution.MergedField;
1414
import graphql.execution.directives.QueryDirectives;
1515
import graphql.execution.incremental.DeferredCallContext;
16+
import graphql.execution.instrumentation.dataloader.DataLoaderDispatchingContextKeys;
1617
import graphql.language.Document;
1718
import graphql.language.Field;
1819
import graphql.language.FragmentDefinition;
@@ -217,6 +218,9 @@ public ExecutionStepInfo getExecutionStepInfo() {
217218

218219
@Override
219220
public <K, V> @Nullable DataLoader<K, V> getDataLoader(String dataLoaderName) {
221+
if (!graphQLContext.getBoolean(DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING, false)) {
222+
return dataLoaderRegistry.getDataLoader(dataLoaderName);
223+
}
220224
return new DataLoaderWithContext<>(this, dataLoaderName, dataLoaderRegistry.getDataLoader(dataLoaderName));
221225
}
222226

src/test/groovy/graphql/schema/DataFetchingEnvironmentImplTest.groovy

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import graphql.GraphQLContext
44
import graphql.execution.CoercedVariables
55
import graphql.execution.ExecutionId
66
import graphql.execution.ExecutionStepInfo
7+
import graphql.execution.instrumentation.dataloader.DataLoaderDispatchingContextKeys
78
import graphql.language.Argument
89
import graphql.language.Field
910
import graphql.language.FragmentDefinition
@@ -37,7 +38,7 @@ class DataFetchingEnvironmentImplTest extends Specification {
3738

3839
def executionContext = newExecutionContextBuilder()
3940
.root("root")
40-
.graphQLContext(GraphQLContext.of(["key":"context"]))
41+
.graphQLContext(GraphQLContext.of(["key": "context"]))
4142
.executionId(executionId)
4243
.operationDefinition(operationDefinition)
4344
.document(document)
@@ -65,6 +66,7 @@ class DataFetchingEnvironmentImplTest extends Specification {
6566
when:
6667
def dfe = newDataFetchingEnvironment(executionContext)
6768
.build()
69+
dfe.getGraphQlContext().put(DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING, chainedDataLoaderEnabled)
6870
then:
6971
dfe.getRoot() == "root"
7072
dfe.getGraphQlContext().get("key") == "context"
@@ -74,13 +76,16 @@ class DataFetchingEnvironmentImplTest extends Specification {
7476
dfe.getOperationDefinition() == operationDefinition
7577
dfe.getExecutionId() == executionId
7678
dfe.getDataLoaderRegistry() == executionContext.getDataLoaderRegistry()
77-
dfe.getDataLoader("dataLoader").delegate == executionContext.getDataLoaderRegistry().getDataLoader("dataLoader")
79+
dfe.getDataLoader("dataLoader") == executionContext.getDataLoaderRegistry().getDataLoader("dataLoader") ||
80+
dfe.getDataLoader("dataLoader").delegate == executionContext.getDataLoaderRegistry().getDataLoader("dataLoader")
81+
where:
82+
chainedDataLoaderEnabled << [true, false]
7883
}
7984

8085
def "create environment from existing one will copy everything to new instance"() {
8186
def dfe = newDataFetchingEnvironment()
8287
.context("Test Context") // Retain deprecated builder for coverage
83-
.graphQLContext(GraphQLContext.of(["key": "context"]))
88+
.graphQLContext(GraphQLContext.of(["key": "context", (DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING): chainedDataLoaderEnabled]))
8489
.source("Test Source")
8590
.root("Test Root")
8691
.fieldDefinition(Mock(GraphQLFieldDefinition))
@@ -119,9 +124,13 @@ class DataFetchingEnvironmentImplTest extends Specification {
119124
dfe.getDocument() == dfeCopy.getDocument()
120125
dfe.getOperationDefinition() == dfeCopy.getOperationDefinition()
121126
dfe.getVariables() == dfeCopy.getVariables()
122-
dfe.getDataLoader("dataLoader").delegate == dfeCopy.getDataLoader("dataLoader").delegate
127+
dfe.getDataLoader("dataLoader") == executionContext.getDataLoaderRegistry().getDataLoader("dataLoader") ||
128+
dfe.getDataLoader("dataLoader").delegate == dfeCopy.getDataLoader("dataLoader").delegate
123129
dfe.getLocale() == dfeCopy.getLocale()
124130
dfe.getLocalContext() == dfeCopy.getLocalContext()
131+
where:
132+
chainedDataLoaderEnabled << [true, false]
133+
125134
}
126135

127136
def "get or default support"() {

0 commit comments

Comments
 (0)