Desacoplando consultas solicitadas y ejecutables
Gato GraphQL utiliza un pipeline de directivas, una arquitectura que permite al motor del servidor resolver, validar y ejecutar la consulta. Para hacer el motor lo más sencillo posible, toda acción relacionada con la resolución de la consulta tiene lugar dentro del pipeline, a través de directivas.

Llamar al resolver para validar y resolver un campo, y combinar su salida en la respuesta, se logra mediante un par de directivas especiales: @validate y @resolveValueAndMerge. Estas directivas son de un tipo especial: no las añade la aplicación (ni en la consulta ni en el esquema), sino el propio motor. Estas 2 directivas son implícitas y se añaden siempre, en cada campo de cada consulta.
A partir de esta estrategia podemos ver que, al ejecutar una consulta en el servidor GraphQL, en realidad intervienen 2 consultas:
- La consulta solicitada
- La consulta ejecutable
La consulta ejecutable, que es la que finalmente resolverá el servidor, se produce aplicando transformaciones a la consulta solicitada, entre ellas la inclusión de las directivas @validate y @resolveValueAndMerge en cada campo.

Por ejemplo, si la consulta solicitada es esta:
{
posts {
url
title @uppercase
content @include(if: $addContent)
}
}La consulta ejecutable será esta:
{
posts @validate @resolveValueAndMerge {
url @validate @resolveValueAndMerge
title @validate @resolveValueAndMerge @uppercase
content @validate @include(if: $addContent) @resolveValueAndMerge
}
}Dónde se utiliza
Gato GraphQL emplea este mecanismo para producir la consulta ejecutable en las siguientes circunstancias:
- Al añadir directivas de tipo sistema (como
@validatey@resolveValueAndMerge) - Al añadir cualquier directiva mediante IFTTT a través de directivas
- Al definir un orden estricto de ejecución de campos para Multiple Query Execution