Избегайте N+1 запросов от DeferredResolver, но у меня есть будущее последовательности
Я пытаюсь избежать N+1 запросов в моей следующей схеме
type FileOverview {
fileId:Sha256!
fileInfo(fileProperties:[String!]):FileInfo
}
type FileInfo {
fileId:Sha256!
length:Long!
type:FileType!
properties:[FileProperty!]
}
type FileProperty {
name:String!
value:String!
}
type Query {
fileOverview(fileId:[Sha256!]):[FileOverview]
}
Я создал следующее deferred
класс и распознаватель
case class FileInfoDeferred(fileId: Sha256, filter: PropertiesFilter) extends Deferred[FileInfo]
class FileInfoResolver(context: RequestContext) extends DeferredResolver[Any] {
override def resolve(deferred: Vector[Deferred[Any]], ctx: Any, queryState: Any)(implicit ec: ExecutionContext): Vector[Future[Any]] = {
deferred map {
case d: FileInfoDeferred =>
context.externalService.fileInfos(d.fileId, d.filter)
// Expression of type Future[Seq[FileInfo]] doesn't conform to expected type Vector[Future[Any]]
}
}
}
externalService
вызывает стороннюю библиотеку, которая возвращает Future[Seq[FileInfo]]
но метод требует Vector[Future[Any]]
который я не могу конвертировать без блокировки. Есть ли лучший или другой способ, как это сделать без блокировки?
Я также пытался использовать Fetcher
но мне нужно иметь fileId
как Id, а также filter
и, возможно, другие параметры, необходимые для externalService
вызов.