Skip to content

Commit d3999a8

Browse files
authored
BigQuery: Can iterate over QueryJob results without explicitly calling result() (googleapis#4350)
1 parent a105bba commit d3999a8

File tree

3 files changed

+29
-0
lines changed

3 files changed

+29
-0
lines changed

bigquery/google/cloud/bigquery/job.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1949,6 +1949,9 @@ def result(self, timeout=None, retry=DEFAULT_RETRY):
19491949
return self._client.list_rows(dest_table, selected_fields=schema,
19501950
retry=retry)
19511951

1952+
def __iter__(self):
1953+
return iter(self.result())
1954+
19521955

19531956
class QueryPlanEntryStep(object):
19541957
"""Map a single step in a query plan entry.

bigquery/tests/system.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,6 +1235,13 @@ def test_query_future(self):
12351235
row_tuples = [r.values() for r in iterator]
12361236
self.assertEqual(row_tuples, [(1,)])
12371237

1238+
def test_query_iter(self):
1239+
import types
1240+
query_job = Config.CLIENT.query('SELECT 1')
1241+
self.assertIsInstance(iter(query_job), types.GeneratorType)
1242+
row_tuples = [r.values() for r in query_job]
1243+
self.assertEqual(row_tuples, [(1,)])
1244+
12381245
def test_query_table_def(self):
12391246
gs_url = self._write_csv_to_storage(
12401247
'bq_external_test' + unique_resource_id(), 'person_ages.csv',

bigquery/tests/unit/test_job.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2720,6 +2720,25 @@ def test_reload_w_alternate_client(self):
27202720
self.assertEqual(req['path'], PATH)
27212721
self._verifyResourceProperties(job, RESOURCE)
27222722

2723+
def test_iter(self):
2724+
import types
2725+
2726+
begun_resource = self._makeResource()
2727+
query_resource = {
2728+
'jobComplete': True,
2729+
'jobReference': {
2730+
'projectId': self.PROJECT,
2731+
'jobId': self.JOB_ID,
2732+
},
2733+
}
2734+
done_resource = copy.deepcopy(begun_resource)
2735+
done_resource['status'] = {'state': 'DONE'}
2736+
connection = _Connection(begun_resource, query_resource, done_resource)
2737+
client = _make_client(project=self.PROJECT, connection=connection)
2738+
job = self._make_one(self.JOB_ID, self.QUERY, client)
2739+
2740+
self.assertIsInstance(iter(job), types.GeneratorType)
2741+
27232742

27242743
class TestQueryPlanEntryStep(unittest.TestCase, _Base):
27252744
KIND = 'KIND'

0 commit comments

Comments
 (0)