From d214ac9cc1b10028b6dfe26a0e60e8a2647b15ab Mon Sep 17 00:00:00 2001 From: siderakis Date: Wed, 21 Mar 2018 01:03:54 -0400 Subject: [PATCH] Use dataload when fetching all the books for a shelf --- .../library/graphqlserver/GraphQlServer.java | 13 +++++++------ .../graphqlserver/LibrarySchemaModule.java | 18 ++++++------------ 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/GraphQlServer.java b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/GraphQlServer.java index 8c08b07..633b886 100644 --- a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/GraphQlServer.java +++ b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/GraphQlServer.java @@ -29,6 +29,10 @@ import java.util.EnumSet; import java.util.logging.Logger; +import static javax.servlet.DispatcherType.ASYNC; +import static javax.servlet.DispatcherType.REQUEST; +import static org.eclipse.jetty.servlet.ServletContextHandler.SESSIONS; + public class GraphQlServer { private static final int HTTP_PORT = 8080; @@ -38,7 +42,7 @@ public static void main(String[] args) throws Exception { Server server = new Server(HTTP_PORT); ServletContextHandler context = - new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS); + new ServletContextHandler(server, "/", SESSIONS); context.addEventListener( new GuiceServletContextListener() { @@ -53,7 +57,7 @@ protected void configureServlets() { }, new DataLoaderModule(), new SchemaProviderModule(), // Part of Rejoiner framework (Provides `@Schema - // GraphQLSchema`) + // GraphQLSchema`) new BookClientModule(), // Configures the Book gRPC client new ShelfClientModule(), // Configures the Shelf gRPC client new BookSchemaModule(), // Creates queries and mutations for the Book service @@ -64,10 +68,7 @@ protected void configureServlets() { } }); - context.addFilter( - GuiceFilter.class, - "/*", - EnumSet.of(javax.servlet.DispatcherType.REQUEST, javax.servlet.DispatcherType.ASYNC)); + context.addFilter(GuiceFilter.class, "/*", EnumSet.of(REQUEST, ASYNC)); context.setBaseResource( new PathResource(new File("./src/main/resources").toPath().toRealPath())); diff --git a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/LibrarySchemaModule.java b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/LibrarySchemaModule.java index bad9350..73beaad 100644 --- a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/LibrarySchemaModule.java +++ b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/LibrarySchemaModule.java @@ -18,16 +18,16 @@ import com.google.api.graphql.rejoiner.Mutation; import com.google.api.graphql.rejoiner.SchemaModification; import com.google.api.graphql.rejoiner.SchemaModule; -import com.google.common.collect.ImmutableList; -import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.example.library.book.v1.Book; import com.google.example.library.book.v1.BookServiceGrpc; import com.google.example.library.book.v1.CreateBookRequest; -import com.google.example.library.book.v1.GetBookRequest; import com.google.example.library.shelf.v1.GetShelfRequest; import com.google.example.library.shelf.v1.Shelf; import com.google.example.library.shelf.v1.ShelfServiceGrpc; +import net.javacrumbs.futureconverter.java8guava.FutureConverter; +import org.dataloader.DataLoaderRegistry; + import java.util.List; /** A GraphQL {@link SchemaModule} backed by a gRPC service. */ @@ -47,14 +47,8 @@ Book createBookAndAddToShelf( } @SchemaModification(addField = "books", onType = Shelf.class) - ListenableFuture> shelfToBooks( - Shelf shelf, BookServiceGrpc.BookServiceFutureStub bookClient) { - // TODO: use a data loader or batch endpoint - return Futures.allAsList( - shelf - .getBookIdsList() - .stream() - .map(id -> bookClient.getBook(GetBookRequest.newBuilder().setId(id).build())) - .collect(ImmutableList.toImmutableList())); + ListenableFuture> shelfToBooks(Shelf shelf, DataLoaderRegistry dataLoaderRegistry) { + return FutureConverter.toListenableFuture( + dataLoaderRegistry.getDataLoader("books").loadMany(shelf.getBookIdsList())); } }