Избегайте 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 вызов.

0 ответов

Другие вопросы по тегам