Skip to content

Commit 03f8772

Browse files
authored
fix Ktor server DataLoader example usage (#1786)
1 parent 8c66da3 commit 03f8772

File tree

7 files changed

+30
-23
lines changed

7 files changed

+30
-23
lines changed

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2021 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.
@@ -16,17 +16,22 @@
1616

1717
package com.expediagroup.graphql.examples.server.ktor.schema
1818

19+
import com.expediagroup.graphql.examples.server.ktor.schema.dataloaders.BookDataLoader
1920
import com.expediagroup.graphql.examples.server.ktor.schema.models.Book
2021
import com.expediagroup.graphql.generator.annotations.GraphQLDescription
2122
import com.expediagroup.graphql.server.operations.Query
23+
import graphql.schema.DataFetchingEnvironment
24+
import java.util.concurrent.CompletableFuture
2225

2326
/**
2427
* Provide Search options for book data
2528
*/
2629
class BookQueryService : Query {
2730
@GraphQLDescription("Return list of books based on BookSearchParameter options")
2831
@Suppress("unused")
29-
fun searchBooks(params: BookSearchParameters) = Book.search(params.ids)
32+
fun searchBooks(params: BookSearchParameters, dfe: DataFetchingEnvironment): CompletableFuture<List<Book>> =
33+
dfe.getDataLoader<Int, Book>(BookDataLoader.dataLoaderName)
34+
.loadMany(params.ids)
3035
}
3136

3237
data class BookSearchParameters(val ids: List<Int>)

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2021 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.
@@ -16,11 +16,16 @@
1616

1717
package com.expediagroup.graphql.examples.server.ktor.schema
1818

19+
import com.expediagroup.graphql.examples.server.ktor.schema.dataloaders.CourseDataLoader
1920
import com.expediagroup.graphql.examples.server.ktor.schema.models.Course
2021
import com.expediagroup.graphql.server.operations.Query
22+
import graphql.schema.DataFetchingEnvironment
23+
import java.util.concurrent.CompletableFuture
2124

2225
class CourseQueryService : Query {
23-
fun searchCourses(params: CourseSearchParameters) = Course.search(params.ids)
26+
fun searchCourses(params: CourseSearchParameters, dfe: DataFetchingEnvironment): CompletableFuture<List<Course>> =
27+
dfe.getDataLoader<Int, Course>(CourseDataLoader.dataLoaderName)
28+
.loadMany(params.ids)
2429
}
2530

2631
data class CourseSearchParameters(val ids: List<Int>)

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2021 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.
@@ -16,14 +16,16 @@
1616

1717
package com.expediagroup.graphql.examples.server.ktor.schema
1818

19+
import com.expediagroup.graphql.examples.server.ktor.schema.dataloaders.UniversityDataLoader
1920
import com.expediagroup.graphql.examples.server.ktor.schema.models.University
2021
import com.expediagroup.graphql.server.operations.Query
21-
import graphql.GraphQLException
22+
import graphql.schema.DataFetchingEnvironment
23+
import java.util.concurrent.CompletableFuture
2224

2325
class UniversityQueryService : Query {
24-
@Throws(GraphQLException::class)
25-
suspend fun searchUniversities(params: UniversitySearchParameters): List<University> =
26-
University.search(params.ids)
26+
fun searchUniversities(params: UniversitySearchParameters, dfe: DataFetchingEnvironment): CompletableFuture<List<University>> =
27+
dfe.getDataLoader<Int, University>(UniversityDataLoader.dataLoaderName)
28+
.loadMany(params.ids)
2729
}
2830

2931
data class UniversitySearchParameters(val ids: List<Int>)

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

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,12 @@ import graphql.GraphQLContext
2323
import org.dataloader.DataLoaderFactory
2424
import java.util.concurrent.CompletableFuture
2525

26-
val BookDataLoader = object : KotlinDataLoader<List<Int>, List<Book>> {
27-
override val dataLoaderName = "BATCH_BOOK_LOADER"
26+
val BookDataLoader = object : KotlinDataLoader<Int, Book?> {
27+
override val dataLoaderName = "BOOK_LOADER"
2828
override fun getDataLoader(graphQLContext: GraphQLContext) =
29-
DataLoaderFactory.newDataLoader<List<Int>, List<Book>> { ids ->
29+
DataLoaderFactory.newDataLoader { ids ->
3030
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-
}
31+
runBlocking { Book.search(ids).toMutableList() }
3832
}
3933
}
4034
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import java.util.concurrent.CompletableFuture
2626
val CourseDataLoader = object : KotlinDataLoader<Int, Course?> {
2727
override val dataLoaderName = "COURSE_LOADER"
2828
override fun getDataLoader(graphQLContext: GraphQLContext) =
29-
DataLoaderFactory.newDataLoader<Int, Course?> { ids ->
29+
DataLoaderFactory.newDataLoader { ids ->
3030
CompletableFuture.supplyAsync {
3131
runBlocking { Course.search(ids).toMutableList() }
3232
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import java.util.concurrent.CompletableFuture
2626
val UniversityDataLoader = object : KotlinDataLoader<Int, University?> {
2727
override val dataLoaderName = "UNIVERSITY_LOADER"
2828
override fun getDataLoader(graphQLContext: GraphQLContext) =
29-
DataLoaderFactory.newDataLoader<Int, University?> { ids ->
29+
DataLoaderFactory.newDataLoader { ids ->
3030
CompletableFuture.supplyAsync {
3131
runBlocking { University.search(ids).toMutableList() }
3232
}

examples/server/ktor-server/src/main/kotlin/com/expediagroup/graphql/examples/server/ktor/schema/models/Course.kt

Lines changed: 3 additions & 2 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.examples.server.ktor.schema.models
1919
import com.expediagroup.graphql.examples.server.ktor.schema.dataloaders.BookDataLoader
2020
import com.expediagroup.graphql.examples.server.ktor.schema.dataloaders.UniversityDataLoader
2121
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
22+
import com.expediagroup.graphql.server.extensions.getValuesFromDataLoader
2223
import graphql.schema.DataFetchingEnvironment
2324
import java.util.concurrent.CompletableFuture
2425

@@ -35,7 +36,7 @@ data class Course(
3536
}
3637

3738
fun books(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture<List<Book>> {
38-
return dataFetchingEnvironment.getValueFromDataLoader(BookDataLoader.dataLoaderName, bookIds)
39+
return dataFetchingEnvironment.getValuesFromDataLoader(BookDataLoader.dataLoaderName, bookIds)
3940
}
4041

4142
companion object {

0 commit comments

Comments
 (0)