Desacoplamento das queries solicitadas e executáveis
O Gato GraphQL utiliza uma pipeline de directives, uma arquitetura que permite ao mecanismo do servidor resolver, validar e executar a query. Para tornar o mecanismo o mais simples possível, toda ação relacionada à resolução da query ocorre dentro da pipeline, por meio de directives.

Chamar o resolver para validar e resolver um campo, e mesclar sua saída na resposta, é realizado por meio de um par de directives especiais: @validate e @resolveValueAndMerge. Essas directives são de um tipo especial: não são adicionadas pela aplicação (nem na query nem no schema), mas pelo próprio mecanismo. Essas 2 directives são implícitas e são sempre adicionadas, em cada campo de cada query.
A partir dessa estratégia, podemos ver que, ao executar uma query no servidor GraphQL, há na verdade 2 queries envolvidas:
- A query solicitada
- A query executável
A query executável, que é a que será eventualmente resolvida pelo servidor, é produzida a partir da aplicação de transformações na query solicitada, entre elas a inclusão das directives @validate e @resolveValueAndMerge para cada campo.

Por exemplo, se a query solicitada for esta:
{
posts {
url
title @uppercase
content @include(if: $addContent)
}
}A query executável será esta:
{
posts @validate @resolveValueAndMerge {
url @validate @resolveValueAndMerge
title @validate @resolveValueAndMerge @uppercase
content @validate @include(if: $addContent) @resolveValueAndMerge
}
}Onde é utilizado
O Gato GraphQL usa esse mecanismo para produzir a query executável nas seguintes circunstâncias:
- Adição de directives do tipo sistema (como
@validatee@resolveValueAndMerge) - Adição de qualquer directive por meio de IFTTT por meio de directives
- Definição de uma ordem de execução de campos estrita para Multiple Query Execution