Disaccoppiamento delle query richieste ed eseguibili
Gato GraphQL utilizza una pipeline di direttive, un'architettura che consente al motore del server di risolvere, validare ed eseguire la query. Per rendere il motore il più semplice possibile, ogni azione che riguarda la risoluzione della query avviene all'interno della pipeline, tramite direttive.

Chiamare il resolver per validare e risolvere un campo, e unire il suo output nella risposta, avviene tramite un paio di direttive speciali: @validate e @resolveValueAndMerge. Queste direttive sono di un tipo speciale: non vengono aggiunte dall'applicazione (né nella query né nello schema) ma dal motore stesso. Queste 2 direttive sono implicite e vengono sempre aggiunte, su ogni campo di ogni query.
Da questa strategia possiamo vedere che, quando si esegue una query sul server GraphQL, in realtà sono coinvolte 2 query:
- La query richiesta
- La query eseguibile
La query eseguibile, che è quella che verrà infine risolta dal server, è prodotta applicando trasformazioni alla query richiesta, tra cui l'inclusione delle direttive @validate e @resolveValueAndMerge per ogni campo.

Ad esempio, se la query richiesta è questa:
{
posts {
url
title @uppercase
content @include(if: $addContent)
}
}La query eseguibile sarà questa:
{
posts @validate @resolveValueAndMerge {
url @validate @resolveValueAndMerge
title @validate @resolveValueAndMerge @uppercase
content @validate @include(if: $addContent) @resolveValueAndMerge
}
}Dove viene utilizzato
Gato GraphQL utilizza questo meccanismo per produrre la query eseguibile nelle seguenti circostanze:
- Aggiunta di direttive di tipo sistema (come
@validatee@resolveValueAndMerge) - Aggiunta di qualsiasi direttiva tramite IFTTT tramite direttive
- Definizione di un ordine di esecuzione dei campi rigoroso per Multiple Query Execution