Entkopplung von angeforderten und ausführbaren queries
Gato GraphQL verwendet eine Directive-Pipeline, eine Architektur, die es der Server-Engine ermöglicht, die Query aufzulösen, zu validieren und auszuführen. Um die Engine so einfach wie möglich zu halten, findet jede Aktion im Zusammenhang mit der Auflösung der Query innerhalb der Pipeline statt – durch Direktiven.

Der Resolver wird aufgerufen, um ein Feld zu validieren und aufzulösen und dessen Ausgabe in die Antwort zu mergen – das geschieht über zwei spezielle Direktiven: @validate und @resolveValueAndMerge. Diese Direktiven sind von einem besonderen Typ: Sie werden nicht von der Anwendung hinzugefügt (weder in der Query noch im Schema), sondern von der Engine selbst. Diese 2 Direktiven sind implizit und werden immer zu jedem Feld jeder Query hinzugefügt.
Aus dieser Strategie lässt sich erkennen, dass beim Ausführen einer Query auf dem GraphQL-Server tatsächlich 2 queries beteiligt sind:
- Die angeforderte Query
- Die ausführbare Query
Die ausführbare Query, die letztendlich vom Server aufgelöst wird, entsteht durch Transformationen der angeforderten Query – unter anderem durch das Einfügen der Direktiven @validate und @resolveValueAndMerge für jedes Feld.

Wenn die angeforderte Query beispielsweise diese ist:
{
posts {
url
title @uppercase
content @include(if: $addContent)
}
}Dann wird die ausführbare Query diese sein:
{
posts @validate @resolveValueAndMerge {
url @validate @resolveValueAndMerge
title @validate @resolveValueAndMerge @uppercase
content @validate @include(if: $addContent) @resolveValueAndMerge
}
}Wo wird es verwendet
Gato GraphQL nutzt diesen Mechanismus zur Erzeugung der ausführbaren Query in folgenden Situationen:
- Hinzufügen von System-Direktiven (wie
@validateund@resolveValueAndMerge) - Hinzufügen beliebiger Direktiven über IFTTT durch Direktiven
- Festlegen einer strikten Ausführungsreihenfolge für Felder bei Multiple Query Execution