Rozdzielenie queries żądanych i wykonywalnych
Gato GraphQL wykorzystuje pipeline dyrektyw, architekturę umożliwiającą silnikowi serwera rozwiązywanie, walidowanie i wykonywanie queries. Aby silnik był jak najprostszy, każda akcja związana z rozwiązywaniem queries odbywa się wewnątrz pipeline'u, za pośrednictwem dyrektyw.

Wywołanie resolvera w celu walidacji i rozwiązania pola oraz scalenia jego wyniku z odpowiedzią jest realizowane przez kilka specjalnych dyrektyw: @validate i @resolveValueAndMerge. Te dyrektywy są szczególnego rodzaju: nie są dodawane przez aplikację (ani w query, ani w schemacie), lecz przez sam silnik. Te 2 dyrektywy są niejawne i zawsze dodawane do każdego pola każdej query.
Z tej strategii wynika, że podczas wykonywania query na serwerze GraphQL w rzeczywistości biorą udział 2 queries:
- Żądana query
- Wykonywalna query
Wykonywalna query, która ostatecznie zostanie rozwiązana przez serwer, jest tworzona poprzez zastosowanie transformacji na żądanej query, w tym dodanie dyrektyw @validate i @resolveValueAndMerge dla każdego pola.

Na przykład, jeśli żądana query wygląda tak:
{
posts {
url
title @uppercase
content @include(if: $addContent)
}
}Wykonywalna query będzie wyglądać tak:
{
posts @validate @resolveValueAndMerge {
url @validate @resolveValueAndMerge
title @validate @resolveValueAndMerge @uppercase
content @validate @include(if: $addContent) @resolveValueAndMerge
}
}Gdzie jest używane
Gato GraphQL wykorzystuje ten mechanizm do tworzenia wykonywalnej query w następujących okolicznościach:
- Dodawanie dyrektyw systemowych (takich jak
@validatei@resolveValueAndMerge) - Dodawanie dowolnej dyrektywy poprzez IFTTT za pomocą dyrektyw
- Definiowanie ścisłej kolejności wykonywania pól dla Multiple Query Execution