アーキテクチャ
アーキテクチャリクエストされたクエリと実行可能クエリの分離

リクエストされたクエリと実行可能クエリの分離

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

ディレクティブパイプライン

フィールドを検証・解決するためにリゾルバーを呼び出し、その出力をレスポンスにマージする処理は、2つの特殊なディレクティブによって実現されます:@validate@resolveValueAndMergeです。これらのディレクティブは特殊なタイプに属し、アプリケーション側(クエリまたはスキーマのいずれか)によって追加されるのではなく、エンジン自身によって追加されます。この2つのディレクティブは暗黙的なものであり、すべてのクエリのすべてのフィールドに常に追加されます。

この仕組みから、GraphQLサーバー上でクエリを実行する際には、実際には2つのクエリが関与していることがわかります:

  • リクエストされたクエリ
  • 実行可能クエリ

実行可能クエリとは、最終的にサーバーが解決するクエリであり、リクエストされたクエリに変換を適用することで生成されます。その変換には、すべてのフィールドへの@validate@resolveValueAndMergeディレクティブの追加も含まれます。

GraphQLサーバー内部プロセス

たとえば、リクエストされたクエリが次のものであるとします:

{
  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は、以下の状況において実行可能クエリを生成するためにこの仕組みを使用しています: