การแยก queries ที่ร้องขอออกจาก queries ที่สามารถประมวลผลได้
Gato GraphQL ใช้ directive pipeline ซึ่งเป็นสถาปัตยกรรมที่ช่วยให้เอนจิ้นของเซิร์ฟเวอร์สามารถแก้ไข ตรวจสอบ และประมวลผล queries ได้ เพื่อให้เอนจิ้นเรียบง่ายที่สุดเท่าที่จะเป็นไปได้ การดำเนินการทุกอย่างที่เกี่ยวข้องกับการแก้ไข query จะเกิดขึ้นภายใน pipeline ผ่าน directives

การเรียก resolver เพื่อตรวจสอบและแก้ไขฟิลด์ และรวมผลลัพธ์เข้าใน response นั้นทำได้ผ่าน directives พิเศษสองตัว ได้แก่ @validate และ @resolveValueAndMerge directives เหล่านี้เป็นประเภทพิเศษ กล่าวคือ ไม่ได้ถูกเพิ่มโดยแอปพลิเคชัน (ไม่ว่าจะใน query หรือ schema) แต่ถูกเพิ่มโดยเอนจิ้นเอง directives ทั้ง 2 ตัวนี้เป็น implicit และจะถูกเพิ่มเสมอในทุกฟิลด์ของทุก query
จากกลยุทธ์นี้เราจะเห็นว่า เมื่อประมวลผล query บนเซิร์ฟเวอร์ GraphQL นั้น มี queries ที่เกี่ยวข้องจริงๆ อยู่ 2 ตัว ได้แก่:
- requested query
- executable query
executable query ซึ่งเป็นตัวที่เซิร์ฟเวอร์จะแก้ไขในท้ายที่สุด ถูกสร้างขึ้นจากการนำการแปลงไปใช้กับ requested query ซึ่งในบรรดาการแปลงเหล่านั้น ได้แก่ การเพิ่ม directives @validate และ @resolveValueAndMerge ให้กับทุกฟิลด์

ตัวอย่างเช่น หาก requested query เป็นดังนี้:
{
posts {
url
title @uppercase
content @include(if: $addContent)
}
}executable query จะเป็นดังนี้:
{
posts @validate @resolveValueAndMerge {
url @validate @resolveValueAndMerge
title @validate @resolveValueAndMerge @uppercase
content @validate @include(if: $addContent) @resolveValueAndMerge
}
}ใช้งานที่ไหนบ้าง
Gato GraphQL ใช้กลไกนี้เพื่อสร้าง executable query ในสถานการณ์ต่อไปนี้:
- การเพิ่ม directives ประเภทระบบ (เช่น
@validateและ@resolveValueAndMerge) - การเพิ่ม directive ใดๆ ผ่าน IFTTT through directives
- การกำหนด field-execution order ที่เข้มงวดสำหรับ Multiple Query Execution