Penomoran halaman dengan after di GraphQL

Penomoran halaman mempersempit himpunan data besar ke halaman yang lebih kecil dan dapat dikelola. Di GraphQL, Penyusun API Data (DAB) menggunakan after argumen untuk penomoran kunci, menyediakan traversal yang stabil dan efisien melalui hasil yang diurutkan. Setiap kursor mengodekan posisi rekaman terakhir di halaman sebelumnya, memungkinkan kueri berikutnya untuk melanjutkan dari titik tersebut. Tidak seperti penomoran halaman offset, paginasi set kunci menghindari kesenjangan atau duplikat saat data berubah antar permintaan.

Buka versi REST dokumen ini.

Sekilas

Konsep Description
after Token kelanjutan dari permintaan sebelumnya
first Jumlah maksimum rekaman yang diambil per halaman
hasNextPage Menunjukkan apakah ada lebih banyak data
endCursor Token yang akan disertakan dalam permintaan berikutnya after

Penomoran halaman dasar

Kueri GraphQL

Dalam contoh ini kita mendapatkan tiga buku pertama.

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

SQL Konseptual

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

Contoh tanggapan

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

Kelanjutan dengan after

Argumen after menentukan token kelanjutan untuk halaman berikutnya. Nilainya adalah kursor yang dikodekan base64 yang mewakili rekaman terakhir dari halaman sebelumnya.

Peringatan

Argumen after membawa token buram yang menandai tempat halaman sebelumnya berakhir. Perlakukan token sebagai tidak dapat diubah dan jangan pernah mencoba membangun atau mengeditnya.

Dalam contoh ini kita mendapatkan tiga buku berikutnya setelah kursor halaman terakhir.

Kueri GraphQL

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

SQL Konseptual

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

Contoh tanggapan

{
  "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="
    }
  }
}

Penomoran halaman berlapis

Penomoran halaman dapat diterapkan ke koleksi terkait, seperti mengambil penulis dengan daftar buku halaman.

Kueri GraphQL

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

SQL Konseptual

-- 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;

Nota

Setiap skema atau perubahan urutan membatalkan token yang dikeluarkan sebelumnya. Klien harus memulai ulang penomoran halaman dari halaman pertama.

Konfigurasi contoh

{
  "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" ]
        }
      }
    }
  }
}

Lihat juga

Konsep REST GraphQL Tujuan
Projection $select items Pilih bidang mana yang akan dikembalikan
Penyaringan $filter saringan Membatasi baris menurut kondisi
Pengurutan $orderby orderBy Tentukan urutan pengurutan
Ukuran halaman $first first Membatasi jumlah item per halaman
Kelanjutan $after sesudah Lanjutkan dari halaman terakhir menggunakan kursor

Nota

Kata kunci REST dimulai dengan $, mengikuti konvensi OData.