|
16 | 16 |
|
17 | 17 | import six |
18 | 18 |
|
| 19 | +from google.cloud.iterator import HTTPIterator |
19 | 20 | from google.cloud.bigquery._helpers import _TypedProperty |
20 | 21 | from google.cloud.bigquery._helpers import _rows_from_json |
21 | 22 | from google.cloud.bigquery.dataset import Dataset |
22 | 23 | from google.cloud.bigquery.job import QueryJob |
23 | 24 | from google.cloud.bigquery.table import _parse_schema_resource |
24 | 25 | from google.cloud.bigquery._helpers import QueryParametersProperty |
25 | 26 | from google.cloud.bigquery._helpers import UDFResourcesProperty |
| 27 | +from google.cloud.bigquery._helpers import _item_to_row |
| 28 | +from google.cloud.bigquery._helpers import _rows_page_start |
26 | 29 |
|
27 | 30 |
|
28 | 31 | class _SyncQueryConfiguration(object): |
@@ -426,28 +429,44 @@ def fetch_data(self, max_results=None, page_token=None, start_index=None, |
426 | 429 | client = self._require_client(client) |
427 | 430 | params = {} |
428 | 431 |
|
429 | | - if max_results is not None: |
430 | | - params['maxResults'] = max_results |
431 | | - |
432 | | - if page_token is not None: |
433 | | - params['pageToken'] = page_token |
434 | | - |
435 | 432 | if start_index is not None: |
436 | 433 | params['startIndex'] = start_index |
437 | 434 |
|
438 | 435 | if timeout_ms is not None: |
439 | 436 | params['timeoutMs'] = timeout_ms |
440 | 437 |
|
441 | 438 | path = '/projects/%s/queries/%s' % (self.project, self.name) |
442 | | - response = client._connection.api_request(method='GET', |
443 | | - path=path, |
444 | | - query_params=params) |
445 | | - self._set_properties(response) |
| 439 | + iterator = HTTPIterator(client=client, path=path, |
| 440 | + item_to_value=_item_to_row, |
| 441 | + items_key='rows', |
| 442 | + page_token=page_token, |
| 443 | + max_results=max_results, |
| 444 | + page_start=_rows_page_start_query, |
| 445 | + extra_params=params) |
| 446 | + iterator.query_result = self |
| 447 | + # Over-ride the key used to retrieve the next page token. |
| 448 | + iterator._NEXT_TOKEN = 'pageToken' |
| 449 | + return iterator |
446 | 450 |
|
447 | | - total_rows = response.get('totalRows') |
448 | | - if total_rows is not None: |
449 | | - total_rows = int(total_rows) |
450 | | - page_token = response.get('pageToken') |
451 | | - rows_data = _rows_from_json(response.get('rows', ()), self.schema) |
452 | 451 |
|
453 | | - return rows_data, total_rows, page_token |
| 452 | +def _rows_page_start_query(iterator, page, response): |
| 453 | + """Update query response when :class:`~google.cloud.iterator.Page` starts. |
| 454 | +
|
| 455 | + .. note:: |
| 456 | +
|
| 457 | + This assumes that the ``query_response`` attribute has been |
| 458 | + added to the iterator after being created, which |
| 459 | + should be done by the caller. |
| 460 | +
|
| 461 | + :type iterator: :class:`~google.cloud.iterator.Iterator` |
| 462 | + :param iterator: The iterator that is currently in use. |
| 463 | +
|
| 464 | + :type page: :class:`~google.cloud.iterator.Page` |
| 465 | + :param page: The page that was just created. |
| 466 | +
|
| 467 | + :type response: dict |
| 468 | + :param response: The JSON API response for a page of rows in a table. |
| 469 | + """ |
| 470 | + iterator.query_result._set_properties(response) |
| 471 | + iterator.schema = iterator.query_result.schema |
| 472 | + _rows_page_start(iterator, page, response) |
0 commit comments