Sangria GraphQL("org.sangria-graphql" %% "sangria" % "1.0.0-RC5") で GrapQL サーバーを構築しています。
通常、必要かどうかはわかりません。しかし、パフォーマンスを向上させるために、解決中にクライアントから要求されたフィールドを取得したいと思います。
例えば、
リクエストいただければ、
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__]()
ますか?
各フィールドリゾルバーがデータベースの1つの列を選択してクエリを作成することで試すことができます。しかし、フィールドが要求されていることをすでに知っていれば、1つのクエリで作成でき、多くのN+1
ケースの問題を解決できます(トップレベルのオブジェクトはネストされたすべてのオブジェクトをクエリに持ち込むことができるため、データベースに依存する場合があります)
まだベストプラクティスがないことはわかっていましたGraphQL
。私が試しているよりも良い方法が存在する可能性があります。どのようなフィールドが要求されているかを知るために購入すると、処理データを作成するのに適しています。
どなたかご存知でしたら教えてください。
ありがとうございました。