Azure / Azure/data-api-builder

[Enh]: Pagination metadata in response results

オープン
#2,459 コメント 2 件 リアクション 0 件 担当者 0 名 GitHub で見る
2.2 enhancement graphql mcp-server rest
主要言語
C#
スター
1.5k
フォーク
370
平均マージ
3日 22時間
マージ済み PR(30日)
9

説明

## What?

```json
{
"paging": {
"page_number": 2,
"page_size": 5,
"page_count": 6,
"element_count": 30,
"is_first": false,
"is_last": false
}
}
```

| Element | Type | Description |
| ------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| page_number | integer | The current page index, 1-based. |
| page_size | integer | The number of records requested per page. Reflects the effective page size after defaults or limits are applied. |
| page_count | integer | Total number of pages available for the query. Calculated as `element_count / page_size`, rounded up. |
| element_count | integer | Total number of records matching the query filter. Determined using a `COUNT(*)` over the same filtered dataset. |
| is_first | boolean | Indicates whether the current page is the first page. `true` when `page_number = 1`. |
| is_last | boolean | Indicates whether the current page is the final page. `true` when `page_number = page_count`. |

## Why?

To help app developers who are building interactive user interfaces.

## REST example

> New query string keyword `$page-metadata=true`

Request

```
GET /api/books?$pageSize=5&$pageNumber=2&$page-metadata=true
```

Response

```json
{
"value": [
{ "id": 6, "title": "Dune Messiah", "author": "Frank Herbert", "year": 1969 },
{ "id": 7, "title": "Children of Dune", "author": "Frank Herbert", "year": 1976 },
{ "id": 8, "title": "God Emperor of Dune", "author": "Frank Herbert", "year": 1981 },
{ "id": 9, "title": "Heretics of Dune", "author": "Frank Herbert", "year": 1984 },
{ "id": 10, "title": "Chapterhouse: Dune", "author": "Frank Herbert", "year": 1985 }
],
"paging": {
"page_number": 2,
"page_size": 5,
"page_count": 6,
"element_count": 30,
"is_first": false,
"is_last": false
}
}
```

## GraphQL example

> New built-in type `pagingMetadata`

Query

```graphql
query {
books(first: 5, after: 10) {
items {
id
title
author
year
}
pagingMetadata {
page_number
page_size
page_count
element_count
is_first
is_last
}
}
}
```

Response

```json
{
"data": {
"books": {
"items": [
{ "id": 11, "title": "Foundation", "author": "Isaac Asimov", "year": 1951 },
{ "id": 12, "title": "Foundation and Empire", "author": "Isaac Asimov", "year": 1952 },
{ "id": 13, "title": "Second Foundation", "author": "Isaac Asimov", "year": 1953 },
{ "id": 14, "title": "Foundation's Edge", "author": "Isaac Asimov", "year": 1982 },
{ "id": 15, "title": "Foundation and Earth", "author": "Isaac Asimov", "year": 1986 }
],
"paging": {
"page_number": null,
"page_size": 5,
"page_count": null,
"element_count": null,
"is_first": null,
"is_last": null
}
}
}
}
```

## MCP read_records example

> New method parameter `includePageMetadata`

Tool call

```json
{
"tool": "read_records",
"arguments": {
"table": "books",
"pageSize": 5,
"pageNumber": 2,
"includePageMetadata": true
}
}
```

Result

```json
{
"records": [
{ "id": 6, "title": "Dune Messiah", "author": "Frank Herbert", "year": 1969 },
{ "id": 7, "title": "Children of Dune", "author": "Frank Herbert", "year": 1976 },
{ "id": 8, "title": "God Emperor of Dune", "author": "Frank Herbert", "year": 1981 },
{ "id": 9, "title": "Heretics of Dune", "author": "Frank Herbert", "year": 1984 },
{ "id": 10, "title": "Chapterhouse: Dune", "author": "Frank Herbert", "year": 1985 }
],
"paging": {
"page_number": 2,
"page_size": 5,
"page_count": 6,
"element_count": 30,
"is_first": false,
"is_last": false
}
}
```

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

まず、issue に記載されている REST、GraphQL、MCP の read_records リクエストパスを追跡します。各サーフェスがページネーションとフィルターをどのように適用するかを確認し、一貫したページングメタデータを実装したうえで、文書化されたレスポンス形式を検証します。これには、合計値を利用できない場合の GraphQL の例における null メタデータも含まれます。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
csharp, graphql
領域
api, backend-api-design, databases
issue の種類
機能追加
難易度
5/5
見積もり時間
1週間以上
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。