5

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。私が試しているよりも良い方法が存在する可能性があります。どのようなフィールドが要求されているかを知るために購入すると、処理データを作成するのに適しています。

どなたかご存知でしたら教えてください。

ありがとうございました。

4

1 に答える 1

4

Sangria は、説明したシナリオで役立ついくつかの機能を提供します。

最初は予測です: http://sangria-graphql.org/learn/#projections

あなたがそれを使用しているとき、フィールドは自動的に収集され、フィールド名を持つツリーの形式で関数を引数として解決するために与えられます。ドキュメント自体には例がないため、実際にどのように機能するかを確認するために、これらのテストを確認することをお勧めします: https://github.com/sangria-graphql/sangria/blob/master/src/test/スカラ/サングリア/実行/ProjectorSpec.scala

N+1 クエリの問題について。遅延値の解決について説明したドキュメントのセクションを確認することをお勧めします: http://sangria-graphql.org/learn/#deferred-value-resolution。この点でもお役に立てると思います。

于 2017-01-05T23:35:33.500 に答える