From 937c26509149ebe6ceb468013044164ebf7e5ed9 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Thu, 17 Feb 2022 12:24:42 +0000 Subject: [PATCH] Support List arguments in QuerydslDataFetcher Closes gh-281 --- .../graphql/data/query/QuerydslDataFetcher.java | 4 +++- .../data/query/QuerydslDataFetcherTests.java | 15 +++++++++++++++ .../src/test/resources/books/schema.graphqls | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/spring-graphql/src/main/java/org/springframework/graphql/data/query/QuerydslDataFetcher.java b/spring-graphql/src/main/java/org/springframework/graphql/data/query/QuerydslDataFetcher.java index d0f992d6..b771f1f8 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/data/query/QuerydslDataFetcher.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/data/query/QuerydslDataFetcher.java @@ -130,7 +130,9 @@ public abstract class QuerydslDataFetcher { this.customizer.customize(bindings, path); for (Map.Entry entry : environment.getArguments().entrySet()) { - parameters.put(entry.getKey(), Collections.singletonList(entry.getValue())); + Object value = entry.getValue(); + List values = (value instanceof List ? (List) value : Collections.singletonList(value)); + parameters.put(entry.getKey(), values); } return BUILDER.getPredicate(this.domainType, (MultiValueMap) parameters, bindings); diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/query/QuerydslDataFetcherTests.java b/spring-graphql/src/test/java/org/springframework/graphql/data/query/QuerydslDataFetcherTests.java index 7120458b..e8602db9 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/query/QuerydslDataFetcherTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/query/QuerydslDataFetcherTests.java @@ -111,6 +111,21 @@ class QuerydslDataFetcherTests { tester.accept(graphQlSetup(mockRepository)); } + @Test + void shouldFetchMultipleItemsWithListInput() { + Book book1 = new Book(42L, "Hitchhiker's Guide to the Galaxy", new Author(0L, "Douglas", "Adams")); + Book book2 = new Book(53L, "Breaking Bad", new Author(0L, "", "Heisenberg")); + mockRepository.saveAll(Arrays.asList(book1, book2)); + + Mono output = graphQlSetup(mockRepository).toWebGraphQlHandler() + .handleRequest(input("{ booksById(id: [42,53]) {name}}")); + + List names = GraphQlResponse.from(output).toList("booksById", Book.class) + .stream().map(Book::getName).collect(Collectors.toList()); + + assertThat(names).containsExactlyInAnyOrder(book1.getName(), book2.getName()); + } + @Test void shouldApplyCustomizerInRepository() { MockWithCustomizerRepository repository = repositoryFactory.getRepository(MockWithCustomizerRepository.class); diff --git a/spring-graphql/src/test/resources/books/schema.graphqls b/spring-graphql/src/test/resources/books/schema.graphqls index 8c3c4b72..283735df 100644 --- a/spring-graphql/src/test/resources/books/schema.graphqls +++ b/spring-graphql/src/test/resources/books/schema.graphqls @@ -1,5 +1,6 @@ type Query { bookById(id: ID): Book + booksById(id: [ID]): [Book] books(id: ID, name: String, author: String): [Book] booksByCriteria(criteria:BookCriteria): [Book] booksByProjectedArguments(name: String, author: String): [Book]