Skip to content

Commit c10e466

Browse files
feat: pass graphQLContext to KotlinDataLoaderRegistryFactory (#1785)
### 📝 Description passing graphQLContext instance from GraphQLRequestHandler to KotlinDataLoaderRegistryFactory.generate to allow DataLoaders to easily pass it as context of the BatchLoaderContext, and free up the context by key. ### 🔗 Related Issues resolves #1752
1 parent ad93137 commit c10e466

File tree

27 files changed

+256
-265
lines changed

27 files changed

+256
-265
lines changed

examples/server/ktor-server/src/main/kotlin/com/expediagroup/graphql/examples/server/ktor/schema/dataloaders/BookDataLoader.kt

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2022 Expedia, Inc
2+
* Copyright 2023 Expedia, Inc
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,20 +19,22 @@ package com.expediagroup.graphql.examples.server.ktor.schema.dataloaders
1919
import com.expediagroup.graphql.examples.server.ktor.schema.models.Book
2020
import com.expediagroup.graphql.dataloader.KotlinDataLoader
2121
import kotlinx.coroutines.runBlocking
22+
import graphql.GraphQLContext
2223
import org.dataloader.DataLoaderFactory
2324
import java.util.concurrent.CompletableFuture
2425

2526
val BookDataLoader = object : KotlinDataLoader<List<Int>, List<Book>> {
2627
override val dataLoaderName = "BATCH_BOOK_LOADER"
27-
override fun getDataLoader() = DataLoaderFactory.newDataLoader<List<Int>, List<Book>> { ids ->
28-
CompletableFuture.supplyAsync {
29-
val allBooks = runBlocking { Book.search(ids.flatten()).toMutableList() }
30-
// produce lists of results from returned books
31-
ids.fold(mutableListOf()) { acc: MutableList<List<Book>>, idSet ->
32-
val matchingBooks = allBooks.filter { idSet.contains(it.id) }
33-
acc.add(matchingBooks)
34-
acc
28+
override fun getDataLoader(graphQLContext: GraphQLContext) =
29+
DataLoaderFactory.newDataLoader<List<Int>, List<Book>> { ids ->
30+
CompletableFuture.supplyAsync {
31+
val allBooks = runBlocking { Book.search(ids.flatten()).toMutableList() }
32+
// produce lists of results from returned books
33+
ids.fold(mutableListOf()) { acc: MutableList<List<Book>>, idSet ->
34+
val matchingBooks = allBooks.filter { idSet.contains(it.id) }
35+
acc.add(matchingBooks)
36+
acc
37+
}
3538
}
3639
}
37-
}
3840
}

examples/server/ktor-server/src/main/kotlin/com/expediagroup/graphql/examples/server/ktor/schema/dataloaders/CourseDataLoader.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2022 Expedia, Inc
2+
* Copyright 2023 Expedia, Inc
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,14 +19,16 @@ package com.expediagroup.graphql.examples.server.ktor.schema.dataloaders
1919
import com.expediagroup.graphql.examples.server.ktor.schema.models.Course
2020
import com.expediagroup.graphql.dataloader.KotlinDataLoader
2121
import kotlinx.coroutines.runBlocking
22+
import graphql.GraphQLContext
2223
import org.dataloader.DataLoaderFactory
2324
import java.util.concurrent.CompletableFuture
2425

2526
val CourseDataLoader = object : KotlinDataLoader<Int, Course?> {
2627
override val dataLoaderName = "COURSE_LOADER"
27-
override fun getDataLoader() = DataLoaderFactory.newDataLoader<Int, Course?> { ids ->
28-
CompletableFuture.supplyAsync {
29-
runBlocking { Course.search(ids).toMutableList() }
28+
override fun getDataLoader(graphQLContext: GraphQLContext) =
29+
DataLoaderFactory.newDataLoader<Int, Course?> { ids ->
30+
CompletableFuture.supplyAsync {
31+
runBlocking { Course.search(ids).toMutableList() }
32+
}
3033
}
31-
}
3234
}

examples/server/ktor-server/src/main/kotlin/com/expediagroup/graphql/examples/server/ktor/schema/dataloaders/UniversityDataLoader.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2022 Expedia, Inc
2+
* Copyright 2023 Expedia, Inc
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,14 +19,16 @@ package com.expediagroup.graphql.examples.server.ktor.schema.dataloaders
1919
import com.expediagroup.graphql.examples.server.ktor.schema.models.University
2020
import com.expediagroup.graphql.dataloader.KotlinDataLoader
2121
import kotlinx.coroutines.runBlocking
22+
import graphql.GraphQLContext
2223
import org.dataloader.DataLoaderFactory
2324
import java.util.concurrent.CompletableFuture
2425

2526
val UniversityDataLoader = object : KotlinDataLoader<Int, University?> {
2627
override val dataLoaderName = "UNIVERSITY_LOADER"
27-
override fun getDataLoader() = DataLoaderFactory.newDataLoader<Int, University?> { ids ->
28-
CompletableFuture.supplyAsync {
29-
runBlocking { University.search(ids).toMutableList() }
28+
override fun getDataLoader(graphQLContext: GraphQLContext) =
29+
DataLoaderFactory.newDataLoader<Int, University?> { ids ->
30+
CompletableFuture.supplyAsync {
31+
runBlocking { University.search(ids).toMutableList() }
32+
}
3033
}
31-
}
3234
}

examples/server/spring-server/src/main/kotlin/com/expediagroup/graphql/examples/server/spring/dataloaders/CompanyDataLoader.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2022 Expedia, Inc
2+
* Copyright 2023 Expedia, Inc
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@ import com.expediagroup.graphql.examples.server.spring.model.Company
2020
import com.expediagroup.graphql.dataloader.KotlinDataLoader
2121
import org.dataloader.DataLoaderFactory
2222
import org.springframework.stereotype.Component
23+
import graphql.GraphQLContext
2324
import java.util.concurrent.CompletableFuture
2425

2526
@Component
@@ -29,7 +30,8 @@ class CompanyDataLoader(private val service: CompanyService) : KotlinDataLoader<
2930
}
3031

3132
override val dataLoaderName = name
32-
override fun getDataLoader() = DataLoaderFactory.newDataLoader<Int, Company> { ids ->
33-
CompletableFuture.supplyAsync { service.getCompanies(ids) }
34-
}
33+
override fun getDataLoader(graphQLContext: GraphQLContext) =
34+
DataLoaderFactory.newDataLoader<Int, Company> { ids ->
35+
CompletableFuture.supplyAsync { service.getCompanies(ids) }
36+
}
3537
}

executions/graphql-kotlin-dataloader-instrumentation/src/main/kotlin/com/expediagroup/graphql/dataloader/instrumentation/extensions/BatchLoaderEnvironmentExtensions.kt

Lines changed: 0 additions & 44 deletions
This file was deleted.

executions/graphql-kotlin-dataloader-instrumentation/src/test/kotlin/com/expediagroup/graphql/dataloader/instrumentation/extensions/BatchLoaderEnvironmentExtensionsTest.kt

Lines changed: 0 additions & 61 deletions
This file was deleted.

executions/graphql-kotlin-dataloader-instrumentation/src/test/kotlin/com/expediagroup/graphql/dataloader/instrumentation/fixture/AstronautGraphQL.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import graphql.schema.idl.RuntimeWiring
4242
import graphql.schema.idl.SchemaGenerator
4343
import graphql.schema.idl.SchemaParser
4444
import graphql.schema.idl.TypeRuntimeWiring
45+
import io.mockk.mockk
4546
import io.mockk.spyk
4647
import kotlinx.coroutines.async
4748
import kotlinx.coroutines.awaitAll
@@ -206,7 +207,7 @@ object AstronautGraphQL {
206207
AstronautDataLoader(),
207208
MissionDataLoader(), MissionsByAstronautDataLoader(),
208209
PlanetsByMissionDataLoader()
209-
).generate()
210+
).generate(mockk())
210211
)
211212

212213
val graphQLContext = mapOf(

executions/graphql-kotlin-dataloader-instrumentation/src/test/kotlin/com/expediagroup/graphql/dataloader/instrumentation/fixture/ProductGraphQL.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import graphql.schema.idl.RuntimeWiring
3535
import graphql.schema.idl.SchemaGenerator
3636
import graphql.schema.idl.SchemaParser
3737
import graphql.schema.idl.TypeRuntimeWiring
38+
import io.mockk.mockk
3839
import io.mockk.spyk
3940
import kotlinx.coroutines.async
4041
import kotlinx.coroutines.awaitAll
@@ -114,7 +115,7 @@ object ProductGraphQL {
114115
val kotlinDataLoaderRegistry = spyk(
115116
KotlinDataLoaderRegistryFactory(
116117
ProductDataLoader()
117-
).generate()
118+
).generate(mockk())
118119
)
119120

120121
val graphQLContext = mapOf(

executions/graphql-kotlin-dataloader-instrumentation/src/test/kotlin/com/expediagroup/graphql/dataloader/instrumentation/fixture/datafetcher/AstronautService.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import com.expediagroup.graphql.dataloader.instrumentation.fixture.domain.Missio
2323
import com.expediagroup.graphql.dataloader.instrumentation.fixture.domain.Planet
2424
import com.expediagroup.graphql.dataloader.instrumentation.fixture.extensions.toListOfNullables
2525
import com.expediagroup.graphql.dataloader.instrumentation.fixture.repository.AstronautRepository
26+
import graphql.GraphQLContext
2627
import graphql.schema.DataFetchingEnvironment
2728
import org.dataloader.DataLoader
2829
import org.dataloader.DataLoaderFactory
@@ -38,7 +39,7 @@ data class CreateAstronautServiceRequest(val name: String)
3839

3940
class AstronautDataLoader : KotlinDataLoader<AstronautServiceRequest, Astronaut?> {
4041
override val dataLoaderName: String = "AstronautDataLoader"
41-
override fun getDataLoader(): DataLoader<AstronautServiceRequest, Astronaut?> =
42+
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<AstronautServiceRequest, Astronaut?> =
4243
DataLoaderFactory.newDataLoader(
4344
{ keys ->
4445
AstronautRepository

executions/graphql-kotlin-dataloader-instrumentation/src/test/kotlin/com/expediagroup/graphql/dataloader/instrumentation/fixture/datafetcher/MissionService.kt

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2022 Expedia, Inc
2+
* Copyright 2023 Expedia, Inc
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@ import com.expediagroup.graphql.dataloader.KotlinDataLoader
2020
import com.expediagroup.graphql.dataloader.instrumentation.fixture.domain.Mission
2121
import com.expediagroup.graphql.dataloader.instrumentation.fixture.extensions.toListOfNullables
2222
import com.expediagroup.graphql.dataloader.instrumentation.fixture.repository.MissionRepository
23+
import graphql.GraphQLContext
2324
import graphql.schema.DataFetchingEnvironment
2425
import org.dataloader.DataLoader
2526
import org.dataloader.DataLoaderFactory
@@ -32,28 +33,30 @@ data class MissionServiceRequest(val id: Int, val astronautId: Int = -1)
3233

3334
class MissionDataLoader : KotlinDataLoader<MissionServiceRequest, Mission?> {
3435
override val dataLoaderName: String = "MissionDataLoader"
35-
override fun getDataLoader(): DataLoader<MissionServiceRequest, Mission?> = DataLoaderFactory.newDataLoader(
36-
{ keys ->
37-
MissionRepository
38-
.getMissions(keys.map(MissionServiceRequest::id))
39-
.collectList()
40-
.map(List<Optional<Mission>>::toListOfNullables)
41-
.toFuture()
42-
},
43-
DataLoaderOptions.newOptions().setStatisticsCollector(::SimpleStatisticsCollector)
44-
)
36+
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<MissionServiceRequest, Mission?> =
37+
DataLoaderFactory.newDataLoader(
38+
{ keys ->
39+
MissionRepository
40+
.getMissions(keys.map(MissionServiceRequest::id))
41+
.collectList()
42+
.map(List<Optional<Mission>>::toListOfNullables)
43+
.toFuture()
44+
},
45+
DataLoaderOptions.newOptions().setStatisticsCollector(::SimpleStatisticsCollector)
46+
)
4547
}
4648

4749
class MissionsByAstronautDataLoader : KotlinDataLoader<MissionServiceRequest, List<Mission>> {
4850
override val dataLoaderName: String = "MissionsByAstronautDataLoader"
49-
override fun getDataLoader(): DataLoader<MissionServiceRequest, List<Mission>> = DataLoaderFactory.newDataLoader(
50-
{ keys ->
51-
MissionRepository
52-
.getMissionsByAstronautIds(keys.map(MissionServiceRequest::astronautId))
53-
.collectList().toFuture()
54-
},
55-
DataLoaderOptions.newOptions().setStatisticsCollector(::SimpleStatisticsCollector)
56-
)
51+
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<MissionServiceRequest, List<Mission>> =
52+
DataLoaderFactory.newDataLoader(
53+
{ keys ->
54+
MissionRepository
55+
.getMissionsByAstronautIds(keys.map(MissionServiceRequest::astronautId))
56+
.collectList().toFuture()
57+
},
58+
DataLoaderOptions.newOptions().setStatisticsCollector(::SimpleStatisticsCollector)
59+
)
5760
}
5861

5962
class MissionService {

executions/graphql-kotlin-dataloader-instrumentation/src/test/kotlin/com/expediagroup/graphql/dataloader/instrumentation/fixture/datafetcher/PlanetService.kt

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2022 Expedia, Inc
2+
* Copyright 2023 Expedia, Inc
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@ package com.expediagroup.graphql.dataloader.instrumentation.fixture.datafetcher
1919
import com.expediagroup.graphql.dataloader.KotlinDataLoader
2020
import com.expediagroup.graphql.dataloader.instrumentation.fixture.domain.Planet
2121
import com.expediagroup.graphql.dataloader.instrumentation.fixture.repository.PlanetRepository
22+
import graphql.GraphQLContext
2223
import graphql.schema.DataFetchingEnvironment
2324
import org.dataloader.DataLoader
2425
import org.dataloader.DataLoaderFactory
@@ -30,15 +31,16 @@ data class PlanetServiceRequest(val id: Int, val missionId: Int = -1)
3031

3132
class PlanetsByMissionDataLoader : KotlinDataLoader<PlanetServiceRequest, List<Planet>> {
3233
override val dataLoaderName: String = "PlanetsByMissionDataLoader"
33-
override fun getDataLoader(): DataLoader<PlanetServiceRequest, List<Planet>> = DataLoaderFactory.newDataLoader(
34-
{ keys ->
35-
PlanetRepository
36-
.getPlanetsByMissionIds(keys.map(PlanetServiceRequest::missionId))
37-
.collectList()
38-
.toFuture()
39-
},
40-
DataLoaderOptions.newOptions().setStatisticsCollector(::SimpleStatisticsCollector)
41-
)
34+
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<PlanetServiceRequest, List<Planet>> =
35+
DataLoaderFactory.newDataLoader(
36+
{ keys ->
37+
PlanetRepository
38+
.getPlanetsByMissionIds(keys.map(PlanetServiceRequest::missionId))
39+
.collectList()
40+
.toFuture()
41+
},
42+
DataLoaderOptions.newOptions().setStatisticsCollector(::SimpleStatisticsCollector)
43+
)
4244
}
4345

4446
class PlanetService {

0 commit comments

Comments
 (0)