Skip to content

Commit 29620a1

Browse files
authored
BQ: remove QueryJob.query_results(), make QueryResults private (#4652)
The QueryResults object is not necessary to be used by external developers, but it is still needed internally for the getQueryResults API response. From BigQuery team's GA review of the library.
1 parent 66299b6 commit 29620a1

File tree

7 files changed

+19
-64
lines changed

7 files changed

+19
-64
lines changed

bigquery/google/cloud/bigquery/client.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
from google.cloud.bigquery.job import ExtractJob
4343
from google.cloud.bigquery.job import LoadJob
4444
from google.cloud.bigquery.job import QueryJob, QueryJobConfig
45-
from google.cloud.bigquery.query import QueryResults
45+
from google.cloud.bigquery.query import _QueryResults
4646
from google.cloud.bigquery.table import Table
4747
from google.cloud.bigquery.table import TableListItem
4848
from google.cloud.bigquery.table import TableReference
@@ -488,8 +488,8 @@ def _get_query_results(self, job_id, retry, project=None, timeout_ms=None):
488488
(Optional) number of milliseconds the the API call should wait for
489489
the query to complete before the request times out.
490490
491-
:rtype: :class:`google.cloud.bigquery.query.QueryResults`
492-
:returns: a new ``QueryResults`` instance
491+
:rtype: :class:`google.cloud.bigquery.query._QueryResults`
492+
:returns: a new ``_QueryResults`` instance
493493
"""
494494

495495
extra_params = {'maxResults': 0}
@@ -507,7 +507,7 @@ def _get_query_results(self, job_id, retry, project=None, timeout_ms=None):
507507
# QueryJob.result()). So we don't need to poll here.
508508
resource = self._call_api(
509509
retry, method='GET', path=path, query_params=extra_params)
510-
return QueryResults.from_api_repr(resource)
510+
return _QueryResults.from_api_repr(resource)
511511

512512
def job_from_resource(self, resource):
513513
"""Detect correct job type from resource and instantiate.

bigquery/google/cloud/bigquery/dbapi/cursor.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def _set_rowcount(self, query_results):
8686
of modified rows.
8787
8888
:type query_results:
89-
:class:`~google.cloud.bigquery.query.QueryResults`
89+
:class:`~google.cloud.bigquery.query._QueryResults`
9090
:param query_results: results of a query
9191
"""
9292
total_rows = 0
@@ -156,7 +156,7 @@ def execute(self, operation, parameters=None, job_id=None):
156156
except google.cloud.exceptions.GoogleCloudError:
157157
raise exceptions.DatabaseError(self._query_job.errors)
158158

159-
query_results = self._query_job.query_results()
159+
query_results = self._query_job._query_results
160160
self._set_rowcount(query_results)
161161
self._set_description(query_results.schema)
162162

@@ -193,7 +193,7 @@ def _try_fetch(self, size=None):
193193
# TODO(tswast): pass in page size to list_rows based on arraysize
194194
rows_iter = client.list_rows(
195195
self._query_job.destination,
196-
selected_fields=self._query_job.query_results().schema)
196+
selected_fields=self._query_job._query_results.schema)
197197
self._query_data = iter(rows_iter)
198198

199199
def fetchone(self):

bigquery/google/cloud/bigquery/job.py

+4-15
Original file line numberDiff line numberDiff line change
@@ -1867,20 +1867,6 @@ def undeclared_query_parameters(self):
18671867

18681868
return parameters
18691869

1870-
def query_results(self, retry=DEFAULT_RETRY):
1871-
"""Construct a QueryResults instance, bound to this job.
1872-
1873-
:type retry: :class:`google.api_core.retry.Retry`
1874-
:param retry: (Optional) How to retry the RPC.
1875-
1876-
:rtype: :class:`~google.cloud.bigquery.QueryResults`
1877-
:returns: results instance
1878-
"""
1879-
if not self._query_results:
1880-
self._query_results = self._client._get_query_results(
1881-
self.job_id, retry, project=self.project)
1882-
return self._query_results
1883-
18841870
def done(self, retry=DEFAULT_RETRY):
18851871
"""Refresh the job and checks if it is complete.
18861872
@@ -1945,7 +1931,10 @@ def result(self, timeout=None, retry=DEFAULT_RETRY):
19451931
"""
19461932
super(QueryJob, self).result(timeout=timeout)
19471933
# Return an iterator instead of returning the job.
1948-
schema = self.query_results().schema
1934+
if not self._query_results:
1935+
self._query_results = self._client._get_query_results(
1936+
self.job_id, retry, project=self.project)
1937+
schema = self._query_results.schema
19491938
dest_table = self.destination
19501939
return self._client.list_rows(dest_table, selected_fields=schema,
19511940
retry=retry)

bigquery/google/cloud/bigquery/query.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ def __repr__(self):
461461
return 'StructQueryParameter{}'.format(self._key())
462462

463463

464-
class QueryResults(object):
464+
class _QueryResults(object):
465465
"""Results of a query.
466466
467467
See:

bigquery/tests/unit/test_dbapi_cursor.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -51,21 +51,21 @@ def _mock_job(
5151
mock_job.error_result = None
5252
mock_job.state = 'DONE'
5353
mock_job.result.return_value = mock_job
54+
mock_job._query_results = self._mock_results(
55+
total_rows=total_rows, schema=schema,
56+
num_dml_affected_rows=num_dml_affected_rows)
5457

5558
if num_dml_affected_rows is None:
5659
mock_job.statement_type = None # API sends back None for SELECT
5760
else:
5861
mock_job.statement_type = 'UPDATE'
5962

60-
mock_job.query_results.return_value = self._mock_results(
61-
total_rows=total_rows, schema=schema,
62-
num_dml_affected_rows=num_dml_affected_rows)
6363
return mock_job
6464

6565
def _mock_results(
6666
self, total_rows=0, schema=None, num_dml_affected_rows=None):
6767
from google.cloud.bigquery import query
68-
mock_results = mock.create_autospec(query.QueryResults)
68+
mock_results = mock.create_autospec(query._QueryResults)
6969
mock_results.schema = schema
7070
mock_results.num_dml_affected_rows = num_dml_affected_rows
7171
mock_results.total_rows = total_rows

bigquery/tests/unit/test_job.py

-34
Original file line numberDiff line numberDiff line change
@@ -2097,40 +2097,6 @@ def test_undeclared_query_parameters(self):
20972097
self.assertEqual(struct.struct_types, {'count': 'INT64'})
20982098
self.assertEqual(struct.struct_values, {'count': 123})
20992099

2100-
def test_query_results(self):
2101-
from google.cloud.bigquery.query import QueryResults
2102-
2103-
query_resource = {
2104-
'jobComplete': True,
2105-
'jobReference': {
2106-
'projectId': self.PROJECT,
2107-
'jobId': self.JOB_ID,
2108-
},
2109-
}
2110-
connection = _Connection(query_resource)
2111-
client = _make_client(self.PROJECT, connection=connection)
2112-
job = self._make_one(self.JOB_ID, self.QUERY, client)
2113-
results = job.query_results()
2114-
self.assertIsInstance(results, QueryResults)
2115-
2116-
def test_query_results_w_cached_value(self):
2117-
from google.cloud.bigquery.query import QueryResults
2118-
2119-
client = _make_client(project=self.PROJECT)
2120-
job = self._make_one(self.JOB_ID, self.QUERY, client)
2121-
resource = {
2122-
'jobReference': {
2123-
'projectId': self.PROJECT,
2124-
'jobId': self.JOB_ID,
2125-
},
2126-
}
2127-
query_results = QueryResults(resource)
2128-
job._query_results = query_results
2129-
2130-
results = job.query_results()
2131-
2132-
self.assertIs(results, query_results)
2133-
21342100
def test_result(self):
21352101
query_resource = {
21362102
'jobComplete': True,

bigquery/tests/unit/test_query.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -973,16 +973,16 @@ def test___repr__(self):
973973
self.assertIn("'field1': 'hello'", got)
974974

975975

976-
class TestQueryResults(unittest.TestCase):
976+
class Test_QueryResults(unittest.TestCase):
977977
PROJECT = 'project'
978978
JOB_ID = 'test-synchronous-query'
979979
TOKEN = 'TOKEN'
980980

981981
@staticmethod
982982
def _get_target_class():
983-
from google.cloud.bigquery.query import QueryResults
983+
from google.cloud.bigquery.query import _QueryResults
984984

985-
return QueryResults
985+
return _QueryResults
986986

987987
def _make_one(self, *args, **kw):
988988
return self._get_target_class()(*args, **kw)

0 commit comments

Comments
 (0)