Skip to content

Commit 40a3b49

Browse files
author
Jon Wayne Parrott
authored
Remove QueryJob.results() (googleapis#3661)
1 parent 506a304 commit 40a3b49

6 files changed

Lines changed: 25 additions & 90 deletions

File tree

bigquery/google/cloud/bigquery/dbapi/_helpers.py

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,34 +15,13 @@
1515
import collections
1616
import datetime
1717
import numbers
18-
import time
1918

2019
import six
2120

2221
from google.cloud import bigquery
2322
from google.cloud.bigquery.dbapi import exceptions
2423

2524

26-
def wait_for_job(job):
27-
"""Waits for a job to complete by polling until the state is `DONE`.
28-
29-
Sleeps 1 second between calls to the BigQuery API.
30-
31-
:type job: :class:`~google.cloud.bigquery.job._AsyncJob`
32-
:param job: Wait for this job to finish.
33-
34-
:raises: :class:`~google.cloud.bigquery.dbapi.exceptions.DatabaseError`
35-
if the job fails.
36-
"""
37-
while True:
38-
job.reload()
39-
if job.state == 'DONE':
40-
if job.error_result:
41-
raise exceptions.DatabaseError(job.errors)
42-
return
43-
time.sleep(1)
44-
45-
4625
def scalar_to_query_parameter(value, name=None):
4726
"""Convert a scalar value into a query parameter.
4827

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
from google.cloud.bigquery.dbapi import _helpers
2323
from google.cloud.bigquery.dbapi import exceptions
24-
24+
import google.cloud.exceptions
2525

2626
# Per PEP 249: A 7-item sequence containing information describing one result
2727
# column. The first two items (name and type_code) are mandatory, the other
@@ -148,9 +148,11 @@ def execute(self, operation, parameters=None):
148148
formatted_operation,
149149
query_parameters=query_parameters)
150150
query_job.use_legacy_sql = False
151-
query_job.begin()
152-
_helpers.wait_for_job(query_job)
153-
query_results = query_job.results()
151+
152+
try:
153+
query_results = query_job.result()
154+
except google.cloud.exceptions.GoogleCloudError:
155+
raise exceptions.DatabaseError(query_job.errors)
154156

155157
# Force the iterator to run because the query_results doesn't
156158
# have the total_rows populated. See:

bigquery/google/cloud/bigquery/job.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
import collections
1818
import threading
19-
import warnings
2019

2120
import six
2221
from six.moves import http_client
@@ -1264,21 +1263,6 @@ def query_results(self):
12641263
from google.cloud.bigquery.query import QueryResults
12651264
return QueryResults.from_query_job(self)
12661265

1267-
def results(self):
1268-
"""DEPRECATED.
1269-
1270-
This method is deprecated. Use :meth:`query_results` or :meth:`result`.
1271-
1272-
Construct a QueryResults instance, bound to this job.
1273-
1274-
:rtype: :class:`~google.cloud.bigquery.query.QueryResults`
1275-
:returns: The query results.
1276-
"""
1277-
warnings.warn(
1278-
'QueryJob.results() is deprecated. Please use query_results() or '
1279-
'result().', DeprecationWarning)
1280-
return self.query_results()
1281-
12821266
def result(self, timeout=None):
12831267
"""Start the job and wait for it to complete and get the result.
12841268

bigquery/tests/unit/test_dbapi__helpers.py

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -16,48 +16,11 @@
1616
import math
1717
import unittest
1818

19-
import mock
20-
2119
import google.cloud._helpers
2220
from google.cloud.bigquery.dbapi import _helpers
2321
from google.cloud.bigquery.dbapi import exceptions
2422

2523

26-
class Test_wait_for_job(unittest.TestCase):
27-
28-
def _mock_job(self):
29-
from google.cloud.bigquery import job
30-
mock_job = mock.create_autospec(job.QueryJob)
31-
mock_job.state = 'RUNNING'
32-
mock_job._mocked_iterations = 0
33-
34-
def mock_reload():
35-
mock_job._mocked_iterations += 1
36-
if mock_job._mocked_iterations >= 2:
37-
mock_job.state = 'DONE'
38-
39-
mock_job.reload.side_effect = mock_reload
40-
return mock_job
41-
42-
def _call_fut(self, job):
43-
from google.cloud.bigquery.dbapi._helpers import wait_for_job
44-
with mock.patch('time.sleep'):
45-
wait_for_job(job)
46-
47-
def test_wo_error(self):
48-
mock_job = self._mock_job()
49-
mock_job.error_result = None
50-
self._call_fut(mock_job)
51-
self.assertEqual('DONE', mock_job.state)
52-
53-
def test_w_error(self):
54-
from google.cloud.bigquery.dbapi import exceptions
55-
mock_job = self._mock_job()
56-
mock_job.error_result = {'reason': 'invalidQuery'}
57-
self.assertRaises(exceptions.DatabaseError, self._call_fut, mock_job)
58-
self.assertEqual('DONE', mock_job.state)
59-
60-
6124
class TestQueryParameters(unittest.TestCase):
6225

6326
def test_scalar_to_query_parameter(self):

bigquery/tests/unit/test_dbapi_cursor.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def _mock_job(
4242
mock_job = mock.create_autospec(job.QueryJob)
4343
mock_job.error_result = None
4444
mock_job.state = 'DONE'
45-
mock_job.results.return_value = self._mock_results(
45+
mock_job.result.return_value = self._mock_results(
4646
rows=rows, schema=schema,
4747
num_dml_affected_rows=num_dml_affected_rows)
4848
return mock_job
@@ -219,6 +219,24 @@ def test_execute_w_query(self):
219219
row = cursor.fetchone()
220220
self.assertIsNone(row)
221221

222+
def test_execute_raises_if_result_raises(self):
223+
import google.cloud.exceptions
224+
225+
from google.cloud.bigquery import client
226+
from google.cloud.bigquery import job
227+
from google.cloud.bigquery.dbapi import connect
228+
from google.cloud.bigquery.dbapi import exceptions
229+
230+
job = mock.create_autospec(job.QueryJob)
231+
job.result.side_effect = google.cloud.exceptions.GoogleCloudError('')
232+
client = mock.create_autospec(client.Client)
233+
client.run_async_query.return_value = job
234+
connection = connect(client)
235+
cursor = connection.cursor()
236+
237+
with self.assertRaises(exceptions.DatabaseError):
238+
cursor.execute('SELECT 1')
239+
222240
def test_executemany_w_dml(self):
223241
from google.cloud.bigquery.dbapi import connect
224242
connection = connect(

bigquery/tests/unit/test_job.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
# limitations under the License.
1414

1515
import copy
16-
import warnings
1716

1817
from six.moves import http_client
1918
import unittest
@@ -1560,16 +1559,6 @@ def test_query_results(self):
15601559
self.assertIsInstance(results, QueryResults)
15611560
self.assertIs(results._job, job)
15621561

1563-
def test_results_is_deprecated(self):
1564-
client = _Client(self.PROJECT)
1565-
job = self._make_one(self.JOB_NAME, self.QUERY, client)
1566-
1567-
with warnings.catch_warnings(record=True) as warned:
1568-
warnings.simplefilter('always')
1569-
job.results()
1570-
self.assertEqual(len(warned), 1)
1571-
self.assertIn('deprecated', str(warned[0]))
1572-
15731562
def test_result(self):
15741563
from google.cloud.bigquery.query import QueryResults
15751564

0 commit comments

Comments
 (0)