2016-12-25 26 views
2

我建立GrapQL服務器通過桑格利亞GraphQL( 「org.sangria-graphql」 %% 「汽酒」 % 「1.0.0-RC5」)怎麼知道請求在對象的解析器字段桑格利亞GraphQL

我我不確定它是否正常需要。但爲了提高性能,我想在解析期間從客戶端獲取請求的字段。

例如,

如果你提出要求,

query Query{ 
    FooObject{ 
    fieldA 
    fieldB 
    } 
} 

你的服務器FooObject對象解析器

resolve = Ctx => DB.session 
    .query("select fieldA, fieldB, FieldC, FieldD from DATA_TABLE") 
    .map(entity => DataObject(entity.fieldA, entity.fieldB) // By ORM Mapper 
) 

則可以解決,

對象場可以解決FooObject對象的域解析器

Field("fieldA", type..., resolve = _.fieldA) 
Field("fieldB", type..., resolve = _.fieldB) 
Field("fieldC", type..., resolve = _.fieldC) 
Field("fieldD", type..., resolve = _.fieldD) 

然後,你可能會得到graphql導致

{ 
    data:{ 
    FooObject:{ 
     FieldA: "DataA" 
     FieldB: "DataB" 
    } 
    } 
} 

什麼,我試圖做的是,在對象解析器解析過程中,給現場提示如下圖所示。

resolve = Ctx => { 
// Seq(FieldA[], FieldB[]) 
val requestedFields: Seq[Field[ ... ]] = Ctx.[__COLLECT_REQUESTED_FIELDS__]() 

// "FieldA, FieldB" 
val fetchingFieldInQuery:String = requestedFields.foldRight("")((acc, nextField) => acc + ", nextField") 

DB.session 
    .query(s"select ${fetchingFieldInQuery} from DATA_TABLE") 
    .map(entity => DataObject(entity.fieldA, entity.fieldB)) // By ORM Mapper 
} 

在這種情況下,我無法找到某種方式來提取客戶端在解析器中請求的字段。 Ctx(context)對象顯示了該對象與我調查中的要求無關。有沒有像我提到的方法Ctx.[__COLLECT_REQUESTED_FIELDS__]()

我可以嘗試每個字段解析器通過在數據庫中選擇一列進行查詢。但是如果我可以知道已經請求了什麼字段,我可以在一個查詢中完成它,並且它可以解決很多案例問題(因爲頂級對象可以將查詢中的所有嵌套對象,它可能取決於數據庫)

我知道還有沒有最佳做法GraphQL仍然。 比我想要的更好的方式可能存在。購買了解所要求的字段對於製作處理數據非常有用。

如果你知道,讓我知道它。

謝謝。

回答

3

桑格利亞提供了幾個功能,可以幫助你在你描述的情況。

首先是預測:http://sangria-graphql.org/learn/#projections

當你使用它,該字段將被自動收集並給出解決功能與歸檔名樹的形式參數。本文檔中沒有示例,因此我建議您檢查這些測試以瞭解它在實踐中的工作方式:https://github.com/sangria-graphql/sangria/blob/master/src/test/scala/sangria/execution/ProjectorSpec.scala

關於N + 1查詢問題。我建議您查看描述延期值分辨率的文檔部分:http://sangria-graphql.org/learn/#deferred-value-resolution。我認爲它也可以幫助你。

相關問題