Поделиться через


Разбиение на страницы с помощью after GraphQL

Разбивка на страницы сужает большие наборы данных на небольшие управляемые страницы. В GraphQL построитель API данных (DAB) использует after аргумент для разбиения на страницы набора ключей, обеспечивая стабильный и эффективный обход по упорядоченным результатам. Каждый курсор кодирует позицию последней записи на предыдущей странице, позволяя следующему запросу продолжаться с этой точки. В отличие от смещения разбиения на страницы, набор ключей позволяет избежать пробелов или дубликатов при изменении данных между запросами.

Перейдите к версии REST этого документа.

Краткий обзор

Понятие Description
after Маркер продолжения из предыдущего запроса
first Максимальное количество записей для получения каждой страницы
hasNextPage Указывает, существует ли больше данных
endCursor Маркер для включения в следующий after запрос

Базовая разбивка на страницы

Запрос GraphQL

В этом примере мы получаем первые три книги.

query {
  books(first: 3) {
    items {
      id
      title
    }
    hasNextPage
    endCursor
  }
}

Концептуальный SQL

SELECT TOP (3)
  id,
  sku_title AS title
FROM dbo.books
ORDER BY id ASC;

Пример ответа

{
  "data": {
    "books": {
      "items": [
        { "id": 1, "title": "Dune" },
        { "id": 2, "title": "Foundation" },
        { "id": 3, "title": "Hyperion" }
      ],
      "hasNextPage": true,
      "endCursor": "eyJpZCI6M30="
    }
  }
}

Продолжение с after

Аргумент after задает маркер продолжения для следующей страницы. Значение — это курсор в кодировке Base64, представляющий последнюю запись с предыдущей страницы.

Предупреждение

Аргумент after содержит непрозрачный маркер, который помечает, где закончилась предыдущая страница. Рассматривайте маркеры как неизменяемые и никогда не пытайтесь создавать или изменять их.

В этом примере мы получаем следующие три книги после курсора последней страницы.

Запрос GraphQL

query {
  books(first: 3, after: "eyJpZCI6M30=") {
    items {
      id
      title
    }
    hasNextPage
    endCursor
  }
}

Концептуальный SQL

SELECT TOP (3)
  id,
  sku_title AS title
FROM dbo.books
WHERE id > 3
ORDER BY id ASC;

Пример ответа

{
  "data": {
    "books": {
      "items": [
        { "id": 4, "title": "I, Robot" },
        { "id": 5, "title": "The Left Hand of Darkness" },
        { "id": 6, "title": "The Martian" }
      ],
      "hasNextPage": true,
      "endCursor": "eyJpZCI6Nn0="
    }
  }
}

Вложенный разбиение на страницы

Разбиение на страницы можно применять к связанным коллекциям, таким как получение авторов со списком страниц книг.

Запрос GraphQL

query {
  authors {
    items {
      id
      name
      books(first: 2) {
        items {
          id
          title
        }
        hasNextPage
        endCursor
      }
    }
  }
}

Концептуальный SQL

-- parent
SELECT
  id,
  name
FROM dbo.authors;

-- child
SELECT TOP (2)
  author_id,
  id,
  sku_title AS title
FROM dbo.books
WHERE author_id IN (@a1, @a2)
ORDER BY id ASC;

Замечание

Любая схема или изменение порядка делает недействительными ранее выданные маркеры. Клиенты должны перезапустить разбиение на страницы с первой страницы.

Пример конфигурации

{
  "runtime": {
    "pagination": {
      "default-page-size": 100,
      "max-page-size": 100000
    }
  },
  "entities": {
    "Book": {
      "source": {
        "type": "table",
        "object": "dbo.books"
      },
      "mappings": {
        "sku_title": "title",
        "sku_price": "price"
      },
      "relationships": {
        "book_category": {
          "cardinality": "one",
          "target.entity": "Category",
          "source.fields": [ "category_id" ],
          "target.fields": [ "id" ]
        }
      }
    },
    "Category": {
      "source": {
        "type": "table",
        "object": "dbo.categories"
      },
      "relationships": {
        "category_books": {
          "cardinality": "many",
          "target.entity": "Book",
          "source.fields": [ "id" ],
          "target.fields": [ "category_id" ]
        }
      }
    }
  }
}

См. также

Понятие REST GraphQL Цель
Projection $select items Выбор возвращаемых полей
Filtering $filter фильтр Ограничение строк по условию
Сортировка $orderby orderBy Определение порядка сортировки
Размер страницы $first first Ограничение количества элементов на страницу
Продолжение $after после Продолжить с последней страницы с помощью курсора

Замечание

Ключевые слова REST начинаются с $следующих соглашений OData.