アーキテクチャリクエストされたクエリと実行可能クエリの分離
リクエストされたクエリと実行可能クエリの分離
Gato GraphQLはディレクティブパイプラインを使用しています。これはサーバーのエンジンがクエリを解決・検証・実行できるようにするアーキテクチャです。エンジンをできる限りシンプルに保つために、クエリの解決に関するすべての処理はディレクティブを通じてパイプライン内で行われます。

フィールドを検証・解決するためにリゾルバーを呼び出し、その出力をレスポンスにマージする処理は、2つの特殊なディレクティブによって実現されます:@validateと@resolveValueAndMergeです。これらのディレクティブは特殊なタイプに属し、アプリケーション側(クエリまたはスキーマのいずれか)によって追加されるのではなく、エンジン自身によって追加されます。この2つのディレクティブは暗黙的なものであり、すべてのクエリのすべてのフィールドに常に追加されます。
この仕組みから、GraphQLサーバー上でクエリを実行する際には、実際には2つのクエリが関与していることがわかります:
- リクエストされたクエリ
- 実行可能クエリ
実行可能クエリとは、最終的にサーバーが解決するクエリであり、リクエストされたクエリに変換を適用することで生成されます。その変換には、すべてのフィールドへの@validateと@resolveValueAndMergeディレクティブの追加も含まれます。

たとえば、リクエストされたクエリが次のものであるとします:
{
posts {
url
title @uppercase
content @include(if: $addContent)
}
}実行可能クエリは次のようになります:
{
posts @validate @resolveValueAndMerge {
url @validate @resolveValueAndMerge
title @validate @resolveValueAndMerge @uppercase
content @validate @include(if: $addContent) @resolveValueAndMerge
}
}使用される場面
Gato GraphQLは、以下の状況において実行可能クエリを生成するためにこの仕組みを使用しています:
@validateや@resolveValueAndMergeなどのシステム型ディレクティブを追加する場合- ディレクティブによるIFTTTを通じて任意のディレクティブを追加する場合
- Multiple Query Executionにおいて厳格なフィールド実行順序を定義する場合
Prev
Next