Skip to content

Commit 593dc3a

Browse files
neetkeesmyrick
authored andcommitted
Add DataLoader example. (#396)
1 parent 37cd52c commit 593dc3a

File tree

3 files changed

+94
-0
lines changed

3 files changed

+94
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.expediagroup.graphql.examples.dataloaders
2+
3+
import com.expediagroup.graphql.examples.model.Company
4+
import com.expediagroup.graphql.examples.query.CompanyService
5+
import com.expediagroup.graphql.spring.execution.DataLoaderRegistryFactory
6+
import org.dataloader.DataLoader
7+
import org.dataloader.DataLoaderRegistry
8+
import org.springframework.context.annotation.Bean
9+
import org.springframework.context.annotation.Configuration
10+
import java.util.concurrent.CompletableFuture
11+
12+
@Configuration
13+
class DataLoaderConfiguration(private val companyService: CompanyService) {
14+
@Bean
15+
fun dataLoaderRegistryFactory(): DataLoaderRegistryFactory {
16+
return object : DataLoaderRegistryFactory {
17+
override fun generate(): DataLoaderRegistry {
18+
val registry = DataLoaderRegistry()
19+
val companyLoader = DataLoader<Int, Company> { ids ->
20+
CompletableFuture.supplyAsync { companyService.getCompanies(ids) }
21+
}
22+
registry.register("companyLoader", companyLoader)
23+
return registry
24+
}
25+
}
26+
}
27+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.expediagroup.graphql.examples.model
2+
3+
import com.expediagroup.graphql.annotations.GraphQLIgnore
4+
5+
data class Employee(
6+
val name: String,
7+
@GraphQLIgnore
8+
val companyId: Int
9+
) {
10+
lateinit var company: Company
11+
}
12+
13+
data class Company(val id: Int, val name: String)
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.expediagroup.graphql.examples.query
2+
3+
import com.expediagroup.graphql.annotations.GraphQLDescription
4+
import com.expediagroup.graphql.examples.model.Company
5+
import com.expediagroup.graphql.examples.model.Employee
6+
import com.expediagroup.graphql.spring.operations.Query
7+
import graphql.schema.DataFetcher
8+
import graphql.schema.DataFetchingEnvironment
9+
import org.springframework.beans.factory.BeanFactory
10+
import org.springframework.beans.factory.BeanFactoryAware
11+
import org.springframework.context.annotation.Scope
12+
import org.springframework.stereotype.Component
13+
import java.util.concurrent.CompletableFuture
14+
15+
@Component
16+
class CompanyService {
17+
private val companies = listOf(
18+
Company(id = 1, name = "FirstCompany"),
19+
Company(id = 2, name = "SecondCompany")
20+
)
21+
22+
fun getCompanies(ids: List<Int>): List<Company> = companies
23+
}
24+
25+
@Component
26+
class EmployeeQuery : Query {
27+
private val employees = listOf(
28+
Employee(name = "Mike", companyId = 1),
29+
Employee(name = "John", companyId = 1),
30+
Employee(name = "Steve", companyId = 2)
31+
)
32+
33+
@GraphQLDescription("Get all employees")
34+
fun employees(): List<Employee> {
35+
return employees
36+
}
37+
}
38+
39+
@Component("CompanyDataFetcher")
40+
@Scope("prototype")
41+
class CompanyDataFetcher : DataFetcher<CompletableFuture<Company>>, BeanFactoryAware {
42+
private lateinit var beanFactory: BeanFactory
43+
44+
override fun setBeanFactory(beanFactory: BeanFactory) {
45+
this.beanFactory = beanFactory
46+
}
47+
48+
override fun get(environment: DataFetchingEnvironment): CompletableFuture<Company> {
49+
val companyId = environment.getSource<Employee>().companyId
50+
return environment
51+
.getDataLoader<Int, Company>("companyLoader")
52+
.load(companyId)
53+
}
54+
}

0 commit comments

Comments
 (0)