From 3bf01829f230d6cedfcca429e6930a2bc14db46b Mon Sep 17 00:00:00 2001 From: dondonz <13839920+dondonz@users.noreply.github.com> Date: Sat, 1 Nov 2025 13:30:07 +1100 Subject: [PATCH 1/4] Update to new DataLoader version --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5da92b65a2..91acd71079 100644 --- a/build.gradle +++ b/build.gradle @@ -119,7 +119,7 @@ jar { } dependencies { - api 'com.graphql-java:java-dataloader:5.0.3' + api 'com.graphql-java:java-dataloader:6.0.0' api 'org.reactivestreams:reactive-streams:' + reactiveStreamsVersion api "org.jspecify:jspecify:1.0.0" From b3b3bea5f4e1aa154f02b00572fb60f280e9a957 Mon Sep 17 00:00:00 2001 From: Andreas Marek Date: Mon, 10 Nov 2025 08:51:29 +1000 Subject: [PATCH 2/4] upgrade to dataloader 6 --- .../graphql/schema/DataLoaderWithContext.java | 45 ++++++------------- 1 file changed, 13 insertions(+), 32 deletions(-) diff --git a/src/main/java/graphql/schema/DataLoaderWithContext.java b/src/main/java/graphql/schema/DataLoaderWithContext.java index a91981da79..ffa7ff6d35 100644 --- a/src/main/java/graphql/schema/DataLoaderWithContext.java +++ b/src/main/java/graphql/schema/DataLoaderWithContext.java @@ -1,8 +1,6 @@ package graphql.schema; -import com.google.common.collect.Maps; import graphql.Internal; -import graphql.execution.Async; import graphql.execution.incremental.AlternativeCallContext; import graphql.execution.instrumentation.dataloader.ExhaustedDataLoaderDispatchStrategy; import graphql.execution.instrumentation.dataloader.PerLevelDataLoaderDispatchStrategy; @@ -12,14 +10,10 @@ import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; -import static graphql.Assert.assertNotNull; - @Internal @NullMarked public class DataLoaderWithContext extends DelegatingDataLoader { @@ -32,10 +26,18 @@ public DataLoaderWithContext(DataFetchingEnvironment dfe, String dataLoaderName, this.dfe = dfe; } + // general note: calling super.load() is important, because otherwise the data loader will sometimes called + // later than the dispatch, which results in a hanging DL + + @Override + public CompletableFuture load(K key) { + CompletableFuture result = super.load(key); + newDataLoaderInvocation(); + return result; + } + @Override public CompletableFuture load(@NonNull K key, @Nullable Object keyContext) { - // calling super.load() is important, because otherwise the data loader will sometimes called - // later than the dispatch, which results in a hanging DL CompletableFuture result = super.load(key, keyContext); newDataLoaderInvocation(); return result; @@ -44,41 +46,20 @@ public CompletableFuture load(@NonNull K key, @Nullable Object keyContext) { @Override public CompletableFuture> loadMany(List keys, List keyContexts) { - assertNotNull(keys); - assertNotNull(keyContexts); - - CompletableFuture> result; - List> collect = new ArrayList<>(keys.size()); - for (int i = 0; i < keys.size(); i++) { - K key = keys.get(i); - Object keyContext = null; - if (i < keyContexts.size()) { - keyContext = keyContexts.get(i); - } - collect.add(delegate.load(key, keyContext)); - } - result = Async.allOf(collect); + CompletableFuture> result = super.loadMany(keys, keyContexts); newDataLoaderInvocation(); return result; } @Override public CompletableFuture> loadMany(Map keysAndContexts) { - assertNotNull(keysAndContexts); - - CompletableFuture> result; - Map> collect = Maps.newHashMapWithExpectedSize(keysAndContexts.size()); - for (Map.Entry entry : keysAndContexts.entrySet()) { - K key = entry.getKey(); - Object keyContext = entry.getValue(); - collect.put(key, delegate.load(key, keyContext)); - } - result = Async.allOf(collect); + CompletableFuture> result = super.loadMany(keysAndContexts); newDataLoaderInvocation(); return result; } private void newDataLoaderInvocation() { + System.out.println("newDataLoaderInvocation"); DataFetchingEnvironmentImpl dfeImpl = (DataFetchingEnvironmentImpl) dfe; DataFetchingEnvironmentImpl.DFEInternalState dfeInternalState = (DataFetchingEnvironmentImpl.DFEInternalState) dfeImpl.toInternal(); if (dfeInternalState.getDataLoaderDispatchStrategy() instanceof PerLevelDataLoaderDispatchStrategy) { From 6b68072efb0f9c23d39cb29aea1fb167d5a0845f Mon Sep 17 00:00:00 2001 From: Andreas Marek Date: Mon, 10 Nov 2025 08:56:51 +1000 Subject: [PATCH 3/4] upgrade to dataloader 6 --- src/main/java/graphql/schema/DataLoaderWithContext.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/graphql/schema/DataLoaderWithContext.java b/src/main/java/graphql/schema/DataLoaderWithContext.java index ffa7ff6d35..488a947e2e 100644 --- a/src/main/java/graphql/schema/DataLoaderWithContext.java +++ b/src/main/java/graphql/schema/DataLoaderWithContext.java @@ -59,7 +59,6 @@ public CompletableFuture> loadMany(Map keysAndContexts) { } private void newDataLoaderInvocation() { - System.out.println("newDataLoaderInvocation"); DataFetchingEnvironmentImpl dfeImpl = (DataFetchingEnvironmentImpl) dfe; DataFetchingEnvironmentImpl.DFEInternalState dfeInternalState = (DataFetchingEnvironmentImpl.DFEInternalState) dfeImpl.toInternal(); if (dfeInternalState.getDataLoaderDispatchStrategy() instanceof PerLevelDataLoaderDispatchStrategy) { From 703155510fafa93bf548771dc655fde0e7aaf2b0 Mon Sep 17 00:00:00 2001 From: Andreas Marek Date: Mon, 10 Nov 2025 09:45:36 +1000 Subject: [PATCH 4/4] upgrade to dataloader 6 --- src/main/java/graphql/schema/DataLoaderWithContext.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/graphql/schema/DataLoaderWithContext.java b/src/main/java/graphql/schema/DataLoaderWithContext.java index 488a947e2e..3d4224b364 100644 --- a/src/main/java/graphql/schema/DataLoaderWithContext.java +++ b/src/main/java/graphql/schema/DataLoaderWithContext.java @@ -43,6 +43,12 @@ public CompletableFuture load(@NonNull K key, @Nullable Object keyContext) { return result; } + @Override + public CompletableFuture> loadMany(List keys) { + CompletableFuture> result = super.loadMany(keys); + newDataLoaderInvocation(); + return result; + } @Override public CompletableFuture> loadMany(List keys, List keyContexts) {