Введение
Relay Спецификация соединения курсора GraphQL иллюстрирует, как реализовать разбиение на страницы на основе курсора в GraphQL. Однако многие разработчики хотят упорядочивать получаемые данные. В этой статье мы рассмотрим, как включить упорядочение в ваши соединения курсора.
Исходная схема
Чтобы предоставить примеры в этой статье, мы расширим следующую схему, в которой уже реализованы соединения курсора.
# Example Original Schema type Query { users( first: Int, after: String ): UserConnection products( first: Int, after: String ): ProductConnection reviews( first: Int, after: String ): ReviewConnection } type User { id: ID! name: String! } type UserEdge { node: User cursor: String } type UserConnection { edges: [UserEdge] pageInfo: PageInfo } type Product { id: ID! upc: String! price: Float! inStock: Boolean! } type ProductEdge { node: Product cursor: String } type ProductConnection { edges: [ProductEdge] pageInfo: PageInfo } type Review { id: ID! body: String! } type ReviewEdge { node: Review cursor: String } type ReviewConnection { edges: [ReveiwEdge] pageInfo: PageInfo } type PageInfo { endCursor: String hasNextPage: Boolean! hasPreviousPage: Boolean! startCursor: String }
Зарезервированные типы
Чтобы следовать этой спецификации, ваша схема должна зарезервировать определенные имена типов для поддержки упорядочения соединений курсора.
- Любой ввод, имя которого заканчивается на «OrderByInput».
- Перечисление с именем «SortOrder».
Упорядочить по входам
Любой ввод, имя которого оканчивается на «OrderBy», рассматривается этой спецификацией как Order By Input. Заказ по входам должен иметь одно или несколько полей, связанных с заказом.
- «Где ввод» должен иметь одно или несколько полей, связанных с заказом. Эти поля входят в перечисление «SortOrder».
# Example Order By Inputs input UserOrderByInput { name: SortOrder } input ProductOrderByInput { upc: SortOrder price: SortOrder inStock: SortOrder } input ReviewOrderByInput { body: SortOrder }
Порядок сортировки
Перечисление с именем «SortOrder» рассматривается этой спецификацией как Порядок сортировки. Перечисление Sort Order должно иметь две константы: по возрастанию и по убыванию.
- «Порядок сортировки» должен иметь константу «ПО ВОЗРАСТУ», указывающую, что поле должно быть упорядочено в порядке возрастания.
- «Порядок сортировки» должен иметь константу «ПО УБЫВАНИЮ», указывающую, что поле должно быть упорядочено в порядке убывания.
# Example Sort Order enum SortOrder { ASCENDING DESCENDING }
Аргументы
Для включения упорядочения требуется один аргумент. Сервер должен использовать этот аргумент для упорядочения ребер, возвращаемых соединением, возвращая ребра, порядок которых соответствует применяемому порядку.
- Запрос «Соединение» должен содержать аргумент с именем «orderBy». Этот аргумент принимает тип списка, который является оболочкой «Упорядочить по входу».
# Example Queries w/ Arguments type Query { users( first: Int, after: String, orderBy: [UserOrderByInput!] ): UserConnection products( first: Int, after: String, orderBy: [ProductOrderByInput!] ): ProductConnection reviews( first: Int, after: String, orderBy: [ReviewOrderByInput!] ): ReviewConnection }
Пример запроса
Упорядочивая соединения курсора, вы можете делать такие запросы, как:
query GetProductConnection( $first: Int, $after: String, $orderBy: [ProductOrderByInput!] ) { products( first: $first, after: $after, orderBy: $orderBy ) { edges { node { id upc price } } } } { "first": 1000, "after": "7b20226976223a2022363936653639373436393631366336393761363137343639366636653230373636353633373436663732222c202264617461223a2022363536653633366636343635363432303633373537323733366637323230363436313734363122207d", "orderBy": [ { "inStock": "ASCENDING" }, { "price": "DESCENDING" } ] }
Заключение
Расширяя спецификацию соединения курсора GraphQL с возможностями упорядочивания, наши графики могут сначала предоставлять клиентам приоритетные данные. Включение упорядочения в разбиение на страницы на основе курсора требует определения пользовательских входных данных, обновления аргументов соединения, изменения преобразователей и обработки генерации курсора.