Title: The page_iterator API proble, and proposed fix · Issue #194 · googleapis/python-api-core · GitHub
Open Graph Title: The page_iterator API proble, and proposed fix · Issue #194 · googleapis/python-api-core
X Title: The page_iterator API proble, and proposed fix · Issue #194 · googleapis/python-api-core
Description: It looks to me like the page_iterator API has a problem. The Iterator class provides pagination, and yet invites clients to do their own pagination by taking a page token. (The documentation for page_token in the BigQuery list_tables met...
Open Graph Description: It looks to me like the page_iterator API has a problem. The Iterator class provides pagination, and yet invites clients to do their own pagination by taking a page token. (The documentation for pa...
X Description: It looks to me like the page_iterator API has a problem. The Iterator class provides pagination, and yet invites clients to do their own pagination by taking a page token. (The documentation for pa...
Opengraph URL: https://github.com/googleapis/python-api-core/issues/194
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"The page_iterator API proble, and proposed fix","articleBody":"It looks to me like the [page_iterator](https://github.com/googleapis/python-api-core/blob/f2600cce8bc8eaf24c2461908cfb5a2e9b489296/google/api_core/page_iterator.py) API has a problem. \r\n\r\nThe `Iterator` class provides pagination, and yet invites clients to do their own pagination by taking a page token. (The documentation for `page_token` in the BigQuery [list_tables](https://googleapis.dev/python/bigquery/latest/generated/google.cloud.bigquery.client.Client.html?highlight=list_tables#google.cloud.bigquery.client.Client.list_tables) method specifically says this.) I would hope that this isn't the intent.\r\n\r\nEmpirically, the default pagination for `list_tables` is 50 rows per page, [which is arguably too low](https://github.com/googleapis/python-bigquery-sqlalchemy/issues/173), causing many REST API calls if there are many tables in a dataset. If you pass a largish number for `max_results`, then the page size increases to 1000 rows, but no more than 1000 and you get no more than that many results. Using `max_results` to influence the page size forces the client of `page_iterator` to do its own pagination if there is any chance of total number of items exceeding the maximum `max_results`, which for `list_tables` is 2147483647. Arguably, a dataset wouldn't have more than that many tables, but this interface is also used for [list_rows](https://googleapis.dev/python/bigquery/latest/generated/google.cloud.bigquery.client.Client.html?highlight=list_rows#google.cloud.bigquery.client.Client.list_rows), which also limits `max_results` to 2147483647. One wouldn't want to limit table rows to 2147483647 just to affect the pagination, although empirically, `max_results` doesn't affect pagination in the case of `list_rows`. \r\n\r\nA straightforward way to address this would be to add a `page_size` argument to the iterator. Of course, to get the benefit, the option would need to be added to higher-level libraries.\r\n\r\n**I'd be happy to create a PR to add this argument.**\r\n\r\nBTW, it's weird to take `page_token`. Is this a holdover from an earlier design? Should it be deprecated?\r\n\r\n","author":{"url":"https://github.com/jimfulton","@type":"Person","name":"jimfulton"},"datePublished":"2021-05-24T15:23:17.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":7},"url":"https://github.com/194/python-api-core/issues/194"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:87538783-0ff4-f4b5-be13-2cf7a723ace2 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 9B10:41260:61D389:8F48CA:6A4E0F36 |
| html-safe-nonce | 1e5925cf7c28b8607ecf560655d5c62d3ecee4c28875b11f6e76f95498b7cd96 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5QjEwOjQxMjYwOjYxRDM4OTo4RjQ4Q0E6NkE0RTBGMzYiLCJ2aXNpdG9yX2lkIjoiMzM3MDU5NzM0NTM0NzM3NDkwMiIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | e82fa27139b03edfca47a0a402db17c45f92e0d828c0bdc3e2d64997b2e5fcdd |
| hovercard-subject-tag | issue:899761606 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/googleapis/python-api-core/194/issue_layout |
| twitter:image | https://opengraph.githubassets.com/5a57795ffa39e5bb70919a89565eed144d73e4d896f03f39083f2e73782c5d56/googleapis/python-api-core/issues/194 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/5a57795ffa39e5bb70919a89565eed144d73e4d896f03f39083f2e73782c5d56/googleapis/python-api-core/issues/194 |
| og:image:alt | It looks to me like the page_iterator API has a problem. The Iterator class provides pagination, and yet invites clients to do their own pagination by taking a page token. (The documentation for pa... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | jimfulton |
| hostname | github.com |
| expected-hostname | github.com |
| None | df0492960db29b4938cb72070351d6b1d0c6c0767b27ceb8394bbf4fcc0223c6 |
| turbo-cache-control | no-preview |
| go-import | github.com/googleapis/python-api-core git https://github.com/googleapis/python-api-core.git |
| octolytics-dimension-user_id | 16785467 |
| octolytics-dimension-user_login | googleapis |
| octolytics-dimension-repository_id | 226992456 |
| octolytics-dimension-repository_nwo | googleapis/python-api-core |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 226992456 |
| octolytics-dimension-repository_network_root_nwo | googleapis/python-api-core |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 51470c353b8a1f52a88d3e3cc2014b17ab8cc1ce |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width