Разделение запрошенных и исполняемых queries
Gato GraphQL использует конвейер директив — архитектуру, которая позволяет движку сервера разрешать, валидировать и выполнять query. Чтобы сделать движок максимально простым, каждое действие, связанное с разрешением query, происходит внутри конвейера через директивы.

Вызов резолвера для валидации и разрешения поля, а также объединение его вывода в ответ, осуществляется с помощью пары специальных директив: @validate и @resolveValueAndMerge. Эти директивы относятся к особому типу: их добавляет не приложение (ни в query, ни в схему), а сам движок. Эти 2 директивы являются неявными и добавляются всегда — к каждому полю каждого query.
Из этой стратегии можно увидеть, что при выполнении query на GraphQL-сервере фактически задействованы 2 queries:
- Запрошенный query
- Исполняемый query
Исполняемый query — тот, который в конечном счёте разрешается сервером, — формируется путём применения преобразований к запрошенному query, в том числе путём включения директив @validate и @resolveValueAndMerge для каждого поля.

Например, если запрошенный query выглядит так:
{
posts {
url
title @uppercase
content @include(if: $addContent)
}
}Исполняемый query будет таким:
{
posts @validate @resolveValueAndMerge {
url @validate @resolveValueAndMerge
title @validate @resolveValueAndMerge @uppercase
content @validate @include(if: $addContent) @resolveValueAndMerge
}
}Где это используется
Gato GraphQL использует этот механизм для формирования исполняемого query в следующих случаях:
- Добавление системных директив (таких как
@validateи@resolveValueAndMerge) - Добавление любой директивы через IFTTT через директивы
- Определение строгого порядка выполнения полей для Multiple Query Execution