From 9466de7e4c6e8a3908df71d0d2a61a1799a754cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Feb 2024 21:42:59 +0000 Subject: [PATCH 1/5] chore(deps): bump spring-boot.version from 3.2.2 to 3.2.3 Bumps `spring-boot.version` from 3.2.2 to 3.2.3. Updates `org.springframework.boot:spring-boot-dependencies` from 3.2.2 to 3.2.3 - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.2.2...v3.2.3) Updates `org.springframework.boot:spring-boot-maven-plugin` from 3.2.2 to 3.2.3 - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.2.2...v3.2.3) --- updated-dependencies: - dependency-name: org.springframework.boot:spring-boot-dependencies dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.springframework.boot:spring-boot-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- dependencies/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies/pom.xml b/dependencies/pom.xml index 14f21d91..219ddc93 100644 --- a/dependencies/pom.xml +++ b/dependencies/pom.xml @@ -14,7 +14,7 @@ - 3.2.2 + 3.2.3 21.4 1.3 2.12.7 From 4e439127f92639a5adedcd2c9b8860c89a7e8ca1 Mon Sep 17 00:00:00 2001 From: Igor Dianov Date: Sun, 3 Mar 2024 21:13:45 -0800 Subject: [PATCH 2/5] Add batch loader registry configurer for Spring GraphQl Execution Service --- ...ueryGraphQlExecutionAutoConfiguration.java | 28 +++++++++++++++++++ .../GraphQLSchemaAutoConfigurationTest.java | 15 ++++++++++ .../support/TestChildEntity.java | 13 +++++++++ .../autoconfigure/support/TestEntity.java | 5 ++++ .../schema/impl/BatchLoaderRegistry.java | 9 ++++++ 5 files changed, 70 insertions(+) create mode 100644 autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/support/TestChildEntity.java diff --git a/autoconfigure/src/main/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLJpaQueryGraphQlExecutionAutoConfiguration.java b/autoconfigure/src/main/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLJpaQueryGraphQlExecutionAutoConfiguration.java index 80ff3f53..83c9dc65 100644 --- a/autoconfigure/src/main/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLJpaQueryGraphQlExecutionAutoConfiguration.java +++ b/autoconfigure/src/main/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLJpaQueryGraphQlExecutionAutoConfiguration.java @@ -1,6 +1,10 @@ package com.introproventures.graphql.jpa.query.autoconfigure; +import static com.introproventures.graphql.jpa.query.schema.impl.BatchLoaderRegistry.getMappedBatchDataLoaderMap; + import graphql.GraphQL; +import org.dataloader.DataLoaderOptions; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; @@ -10,7 +14,9 @@ import org.springframework.context.annotation.Bean; import org.springframework.graphql.ExecutionGraphQlService; import org.springframework.graphql.execution.BatchLoaderRegistry; +import org.springframework.graphql.execution.DefaultExecutionGraphQlService; import org.springframework.graphql.execution.GraphQlSource; +import reactor.core.publisher.Mono; @AutoConfiguration(after = GraphQLJpaQueryGraphQlSourceAutoConfiguration.class) @ConditionalOnClass({ GraphQL.class, GraphQlSource.class }) @@ -32,4 +38,26 @@ ExecutionGraphQlService executionGraphQlService( ) { return new GraphQlAutoConfiguration(beanFactory).executionGraphQlService(graphQlSource, batchLoaderRegistry); } + + @Bean + InitializingBean batchLoaderRegistryConfigurer( + DefaultExecutionGraphQlService executionGraphQlService, + BatchLoaderRegistry batchLoaderRegistry + ) { + return () -> { + DataLoaderOptions options = DataLoaderOptions.newOptions().setCachingEnabled(false); + + getMappedBatchDataLoaderMap() + .forEach((name, mappedBatchLoader) -> + batchLoaderRegistry + .forName(name) + .withOptions(options) + .registerMappedBatchLoader((keys, env) -> + Mono.fromCompletionStage(mappedBatchLoader.load(keys, env)) + ) + ); + + executionGraphQlService.addDataLoaderRegistrar(batchLoaderRegistry); + }; + } } diff --git a/autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLSchemaAutoConfigurationTest.java b/autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLSchemaAutoConfigurationTest.java index 0094e476..e486d00e 100644 --- a/autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLSchemaAutoConfigurationTest.java +++ b/autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLSchemaAutoConfigurationTest.java @@ -1,5 +1,6 @@ package com.introproventures.graphql.jpa.query.autoconfigure; +import static graphql.GraphQLContext.newContext; import static graphql.annotations.AnnotationsSchemaCreator.newAnnotationsSchema; import static graphql.schema.FieldCoordinates.coordinates; import static graphql.schema.GraphQLCodeRegistry.newCodeRegistry; @@ -9,6 +10,7 @@ import static graphql.schema.idl.RuntimeWiring.newRuntimeWiring; import static java.util.Collections.emptyMap; import static org.assertj.core.api.Assertions.assertThat; +import static org.dataloader.DataLoaderRegistry.newRegistry; import static org.springframework.transaction.TransactionDefinition.PROPAGATION_REQUIRED; import com.introproventures.graphql.jpa.query.autoconfigure.support.AdditionalGraphQLType; @@ -58,6 +60,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import org.assertj.core.api.InstanceOfAssertFactories; +import org.dataloader.DataLoaderRegistry; import org.junit.jupiter.api.Test; import org.reactivestreams.Publisher; import org.reflections.Reflections; @@ -69,6 +72,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.Resource; +import org.springframework.graphql.execution.BatchLoaderRegistry; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import org.springframework.transaction.TransactionDefinition; @@ -101,6 +105,9 @@ public class GraphQLSchemaAutoConfigurationTest { @Autowired private GraphQLJpaQueryProperties graphQLJpaQueryProperties; + @Autowired + BatchLoaderRegistry batchLoaderRegistry; + @SpringBootApplication @EnableGraphQLJpaQuerySchema(basePackageClasses = TestEntity.class) static class Application { @@ -520,4 +527,12 @@ void configuresSubscriptionTransactionalExecutionStrategyCustomizer() { .isEqualTo(true); }); } + + @Test + void batchLoaderRegistry() { + DataLoaderRegistry dataLoaderRegistry = newRegistry().build(); + batchLoaderRegistry.registerDataLoaders(dataLoaderRegistry, newContext().build()); + + assertThat(dataLoaderRegistry.getDataLoadersMap()).isNotEmpty().containsOnlyKeys("TestEntity.children"); + } } diff --git a/autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/support/TestChildEntity.java b/autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/support/TestChildEntity.java new file mode 100644 index 00000000..7145cfda --- /dev/null +++ b/autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/support/TestChildEntity.java @@ -0,0 +1,13 @@ +package com.introproventures.graphql.jpa.query.autoconfigure.support; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import lombok.Data; + +@Entity +@Data +public class TestChildEntity { + + @Id + String id; +} diff --git a/autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/support/TestEntity.java b/autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/support/TestEntity.java index f13fadea..fe3ec4f9 100644 --- a/autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/support/TestEntity.java +++ b/autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/support/TestEntity.java @@ -2,6 +2,8 @@ import jakarta.persistence.Entity; import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import java.util.Set; import lombok.Data; @Entity @@ -10,4 +12,7 @@ public class TestEntity { @Id private Long id; + + @OneToMany + Set children; } diff --git a/schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/BatchLoaderRegistry.java b/schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/BatchLoaderRegistry.java index 9f17dbff..95e081ba 100644 --- a/schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/BatchLoaderRegistry.java +++ b/schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/BatchLoaderRegistry.java @@ -33,6 +33,15 @@ public static void registerToOne( mappedToOneBatchLoaders.putIfAbsent(batchLoaderKey, mappedBatchLoader); } + public static Map getMappedBatchDataLoaderMap() { + var loaders = new LinkedHashMap(); + + loaders.putAll(mappedToManyBatchLoaders); + loaders.putAll(mappedToOneBatchLoaders); + + return loaders; + } + public static DataLoaderRegistry newDataLoaderRegistry(DataLoaderOptions dataLoaderOptions) { DataLoaderRegistry dataLoaderRegistry = new DataLoaderRegistry(); From 4ed4def5fb2bbac77cdb6367482991362d594b83 Mon Sep 17 00:00:00 2001 From: Igor Dianov Date: Sun, 3 Mar 2024 21:33:15 -0800 Subject: [PATCH 3/5] Fix test --- .../GraphQLJpaQueryGraphQlSourceAutoConfigurationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/boot-starter/src/test/java/com/introproventures/graphql/jpa/query/boot/test/autoconfigure/GraphQLJpaQueryGraphQlSourceAutoConfigurationTest.java b/tests/boot-starter/src/test/java/com/introproventures/graphql/jpa/query/boot/test/autoconfigure/GraphQLJpaQueryGraphQlSourceAutoConfigurationTest.java index 030596a5..67be615c 100644 --- a/tests/boot-starter/src/test/java/com/introproventures/graphql/jpa/query/boot/test/autoconfigure/GraphQLJpaQueryGraphQlSourceAutoConfigurationTest.java +++ b/tests/boot-starter/src/test/java/com/introproventures/graphql/jpa/query/boot/test/autoconfigure/GraphQLJpaQueryGraphQlSourceAutoConfigurationTest.java @@ -79,6 +79,6 @@ public void contextIsAutoConfigured() { DataLoaderRegistry dataLoaderRegistry = newRegistry().build(); batchLoaderRegistry.registerDataLoaders(dataLoaderRegistry, newContext().build()); - assertThat(dataLoaderRegistry.getDataLoadersMap()).isEmpty(); + assertThat(dataLoaderRegistry.getDataLoadersMap()).isNotEmpty().containsOnlyKeys("Author.books", "Book.author"); } } From 4eae7adee9c56f9aa4c9ccfdb5958708565f154c Mon Sep 17 00:00:00 2001 From: Igor Dianov Date: Mon, 4 Mar 2024 11:54:41 -0800 Subject: [PATCH 4/5] fix duplicate dataloader error --- ...ueryGraphQlExecutionAutoConfiguration.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/autoconfigure/src/main/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLJpaQueryGraphQlExecutionAutoConfiguration.java b/autoconfigure/src/main/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLJpaQueryGraphQlExecutionAutoConfiguration.java index 83c9dc65..7a92e570 100644 --- a/autoconfigure/src/main/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLJpaQueryGraphQlExecutionAutoConfiguration.java +++ b/autoconfigure/src/main/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLJpaQueryGraphQlExecutionAutoConfiguration.java @@ -3,6 +3,8 @@ import static com.introproventures.graphql.jpa.query.schema.impl.BatchLoaderRegistry.getMappedBatchDataLoaderMap; import graphql.GraphQL; +import java.util.Map; +import java.util.concurrent.CompletableFuture; import org.dataloader.DataLoaderOptions; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.ListableBeanFactory; @@ -14,7 +16,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.graphql.ExecutionGraphQlService; import org.springframework.graphql.execution.BatchLoaderRegistry; -import org.springframework.graphql.execution.DefaultExecutionGraphQlService; import org.springframework.graphql.execution.GraphQlSource; import reactor.core.publisher.Mono; @@ -25,7 +26,18 @@ public class GraphQLJpaQueryGraphQlExecutionAutoConfiguration { @Bean @ConditionalOnMissingBean BatchLoaderRegistry batchLoaderRegistry(ListableBeanFactory beanFactory) { - return new GraphQlAutoConfiguration(beanFactory).batchLoaderRegistry(); + var batchLoaderRegistry = new GraphQlAutoConfiguration(beanFactory).batchLoaderRegistry(); + + DataLoaderOptions options = DataLoaderOptions.newOptions().setCachingEnabled(false); + + batchLoaderRegistry + .forName(GraphQLJpaQueryGraphQlExecutionAutoConfiguration.class.getName()) + .withOptions(options) + .registerMappedBatchLoader((keys, env) -> + Mono.fromCompletionStage(CompletableFuture.completedStage(Map.of())) + ); + + return batchLoaderRegistry; } @Bean @@ -40,10 +52,7 @@ ExecutionGraphQlService executionGraphQlService( } @Bean - InitializingBean batchLoaderRegistryConfigurer( - DefaultExecutionGraphQlService executionGraphQlService, - BatchLoaderRegistry batchLoaderRegistry - ) { + InitializingBean batchLoaderRegistryConfigurer(BatchLoaderRegistry batchLoaderRegistry) { return () -> { DataLoaderOptions options = DataLoaderOptions.newOptions().setCachingEnabled(false); @@ -56,8 +65,6 @@ InitializingBean batchLoaderRegistryConfigurer( Mono.fromCompletionStage(mappedBatchLoader.load(keys, env)) ) ); - - executionGraphQlService.addDataLoaderRegistrar(batchLoaderRegistry); }; } } From 2820157d853485b17ad751c0fbcc4bead8aa754a Mon Sep 17 00:00:00 2001 From: Igor Dianov Date: Mon, 4 Mar 2024 12:00:57 -0800 Subject: [PATCH 5/5] update batch dataloader test assertiion --- .../query/autoconfigure/GraphQLSchemaAutoConfigurationTest.java | 2 +- .../GraphQLJpaQueryGraphQlSourceAutoConfigurationTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLSchemaAutoConfigurationTest.java b/autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLSchemaAutoConfigurationTest.java index e486d00e..6e730afe 100644 --- a/autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLSchemaAutoConfigurationTest.java +++ b/autoconfigure/src/test/java/com/introproventures/graphql/jpa/query/autoconfigure/GraphQLSchemaAutoConfigurationTest.java @@ -533,6 +533,6 @@ void batchLoaderRegistry() { DataLoaderRegistry dataLoaderRegistry = newRegistry().build(); batchLoaderRegistry.registerDataLoaders(dataLoaderRegistry, newContext().build()); - assertThat(dataLoaderRegistry.getDataLoadersMap()).isNotEmpty().containsOnlyKeys("TestEntity.children"); + assertThat(dataLoaderRegistry.getDataLoadersMap()).isNotEmpty().containsKeys("TestEntity.children"); } } diff --git a/tests/boot-starter/src/test/java/com/introproventures/graphql/jpa/query/boot/test/autoconfigure/GraphQLJpaQueryGraphQlSourceAutoConfigurationTest.java b/tests/boot-starter/src/test/java/com/introproventures/graphql/jpa/query/boot/test/autoconfigure/GraphQLJpaQueryGraphQlSourceAutoConfigurationTest.java index 67be615c..e67dc14e 100644 --- a/tests/boot-starter/src/test/java/com/introproventures/graphql/jpa/query/boot/test/autoconfigure/GraphQLJpaQueryGraphQlSourceAutoConfigurationTest.java +++ b/tests/boot-starter/src/test/java/com/introproventures/graphql/jpa/query/boot/test/autoconfigure/GraphQLJpaQueryGraphQlSourceAutoConfigurationTest.java @@ -79,6 +79,6 @@ public void contextIsAutoConfigured() { DataLoaderRegistry dataLoaderRegistry = newRegistry().build(); batchLoaderRegistry.registerDataLoaders(dataLoaderRegistry, newContext().build()); - assertThat(dataLoaderRegistry.getDataLoadersMap()).isNotEmpty().containsOnlyKeys("Author.books", "Book.author"); + assertThat(dataLoaderRegistry.getDataLoadersMap()).isNotEmpty().containsKeys("Author.books", "Book.author"); } }