1

想象一下,我有这个作为我的模式,人们用鸟 ID 查询,如果他们询问位置,他们会得到关于该位置的所有信息。我还需要以“模式”格式定义位置吗?或者有什么方法可以立即在这里使用案例类?

如果您想了解一下我为什么要这样做的背景知识:我有一个大规模嵌套的 JSon 模式,几乎不可能管理它的每个级别。我很高兴用户请求顶层元素,该元素将返回该阶段定义的任何案例类。

import sangria.schema._

case class Location( lat: String, long: String )
case class Bird( name: String, location: List[Location] )

class BirdRepo {
  def get(id: Int ) = {
    if( id < 10 ) {
      Bird( "Small",
        List( Location("1", "2"), Location("3", "4")
      ))
    } else {
      Bird( "Big",
        List( Location("5", "6"), Location("7", "8")
        ))
    }
  }
}

object SchemaDefinition {
  val Bird = ObjectType(
    "Bird",
    "Some Bird",
    fields[BirdRepo, Bird] (
      Field( "name", StringType, resolve = _.value.name ),
      Field( "location", List[Location], resolve = _.value.location)
//                       ^^ I know this is not possible
    )
  )
}
4

2 回答 2

4

正如@Tyler 提到的,您可以使用deriveObjectType. 两种类型的定义如下所示:

implicit val LocationType = deriveObjectType[BirdRepo, Location]()
implicit val BirdType = deriveObjectType[BirdRepo, Bird]()

deriveObjectTypeList[Location]只要您在范围内定义了( 在您的情况下)的隐式实例,就能够正确处理。ObjectType[BirdRepo, Location]LocationType

字段(“位置”,列表 [位置],解析 = _.value.location)

正确的语法是:

Field( "location", ListType(LocationType), resolve = _.value.location)

假设您已经在LocationType别处定义了。

于 2017-03-10T22:26:59.073 回答
1

从文档中,您应该查看有关ObjectType Derivation的部分

这是示例:

case class User(id: String, permissions: List[String], password: String)

val UserType = deriveObjectType[MyCtx, User](
  ObjectTypeName("AuthUser"),
  ObjectTypeDescription("A user of the system."),
  RenameField("id", "identifier"),
  DocumentField("permissions", "User permissions",
    deprecationReason = Some("Will not be exposed in future")),
  ExcludeFields("password"))

您会注意到您仍然需要提供名称,然后还有一些可选的东西,例如重命名字段和折旧。

它将生成一个与此等效的 ObjectType:

ObjectType("AuthUser", "A user of the system.", fields[MyCtx, User](
  Field("identifier", StringType, resolve = _.value.id),
  Field("permissions", ListType(StringType),
    description = Some("User permissions"),
    deprecationReason = Some("Will not be exposed in future"),
    resolve = _.value.permissions)))
于 2017-03-07T19:17:34.650 回答