use of org.dataloader.DataLoader in project graphql-java by graphql-java.
the class HttpMain method buildDataLoaderRegistry.
private DataLoaderRegistry buildDataLoaderRegistry() {
BatchLoader<String, Object> friendsBatchLoader = keys -> CompletableFuture.supplyAsync(() -> loadCharactersViaHTTP(keys));
DataLoader<String, Object> friendsDataLoader = new DataLoader<>(friendsBatchLoader);
DataLoaderRegistry dataLoaderRegistry = new DataLoaderRegistry();
//
// we make sure our dataloader is in the registry
dataLoaderRegistry.register("friends", friendsDataLoader);
return dataLoaderRegistry;
}
use of org.dataloader.DataLoader in project graphql-java by graphql-java.
the class HttpMain method buildStarWarsSchema.
private GraphQLSchema buildStarWarsSchema() {
//
if (starWarsSchema == null) {
//
//
// the fetcher of friends uses java-dataloader to make the circular friends fetching
// more efficient by batching and caching the calls to load Character friends
//
DataFetcher friendsFetcher = environment -> {
DataLoaderRegistry dataloaderRegistry = asMapGet(environment.getContext(), "dataloaderRegistry");
DataLoader friendsDataLoader = dataloaderRegistry.getDataLoader("friends");
List<String> friendIds = asMapGet(environment.getSource(), "friends");
return friendsDataLoader.loadMany(friendIds);
};
//
// reads a file that provides the schema types
//
Reader streamReader = loadSchemaFile("starWarsSchemaAnnotated.graphqls");
TypeDefinitionRegistry typeRegistry = new SchemaParser().parse(streamReader);
//
// the runtime wiring is used to provide the code that backs the
// logical schema
//
TypeResolver characterTypeResolver = env -> {
Map<String, Object> obj = (Map<String, Object>) env.getObject();
String id = (String) obj.get("id");
GraphQLSchema schema = env.getSchema();
if (StarWarsData.isHuman(id)) {
return (GraphQLObjectType) schema.getType("Human");
} else {
return (GraphQLObjectType) schema.getType("Droid");
}
};
RuntimeWiring wiring = RuntimeWiring.newRuntimeWiring().type(newTypeWiring("Query").dataFetcher("hero", StarWarsData.getHeroDataFetcher()).dataFetcher("human", StarWarsData.getHumanDataFetcher()).dataFetcher("droid", StarWarsData.getDroidDataFetcher())).type(newTypeWiring("Human").dataFetcher("friends", friendsFetcher)).type(newTypeWiring("Droid").dataFetcher("friends", friendsFetcher)).type(newTypeWiring("Character").typeResolver(characterTypeResolver)).type(newTypeWiring("Episode").enumValues(StarWarsData.getEpisodeResolver())).build();
// finally combine the logical schema with the physical runtime
starWarsSchema = new SchemaGenerator().makeExecutableSchema(typeRegistry, wiring);
}
return starWarsSchema;
}
use of org.dataloader.DataLoader in project graphql-java by graphql-java.
the class BatchingExamples method starWarsExample.
void starWarsExample() {
// a batch loader function that will be called with N or more keys for batch loading
BatchLoader<String, Object> characterBatchLoader = new BatchLoader<String, Object>() {
@Override
public CompletionStage<List<Object>> load(List<String> keys) {
//
return CompletableFuture.supplyAsync(() -> getCharacterDataViaBatchHTTPApi(keys));
}
};
// a data loader for characters that points to the character batch loader
DataLoader<String, Object> characterDataLoader = new DataLoader<>(characterBatchLoader);
//
// use this data loader in the data fetchers associated with characters and put them into
// the graphql schema (not shown)
//
DataFetcher heroDataFetcher = new DataFetcher() {
@Override
public Object get(DataFetchingEnvironment environment) {
// R2D2
return characterDataLoader.load("2001");
}
};
DataFetcher friendsDataFetcher = new DataFetcher() {
@Override
public Object get(DataFetchingEnvironment environment) {
StarWarsCharacter starWarsCharacter = environment.getSource();
List<String> friendIds = starWarsCharacter.getFriendIds();
return characterDataLoader.loadMany(friendIds);
}
};
//
// DataLoaderRegistry is a place to register all data loaders in that needs to be dispatched together
// in this case there is 1 but you can have many
//
DataLoaderRegistry registry = new DataLoaderRegistry();
registry.register("character", characterDataLoader);
//
// this instrumentation implementation will dispatched all the dataloaders
// as each level fo the graphql query is executed and hence make batched objects
// available to the query and the associated DataFetchers
//
DataLoaderDispatcherInstrumentation dispatcherInstrumentation = new DataLoaderDispatcherInstrumentation(registry);
//
// now build your graphql object and execute queries on it.
// the data loader will be invoked via the data fetchers on the
// schema fields
//
GraphQL graphQL = GraphQL.newGraphQL(buildSchema()).instrumentation(dispatcherInstrumentation).build();
}
Aggregations