diff --git a/docs/bigquery-usage.rst b/docs/bigquery-usage.rst index 1b94c6e76698..bb3e68d90060 100644 --- a/docs/bigquery-usage.rst +++ b/docs/bigquery-usage.rst @@ -279,8 +279,8 @@ List jobs for a project: >>> from gcloud import bigquery >>> client = bigquery.Client() >>> jobs, token = client.list_jobs() # API request - >>> [(job.job_id, job.type, job.created, job.state) for job in jobs] - ['e3344fba-09df-4ae0-8337-fddee34b3840', 'insert', (datetime.datetime(2015, 7, 23, 9, 30, 20, 268260, tzinfo=), 'done')] + >>> [(job.name, job.job_type, job.created, job.state) for job in jobs] + ['load-table-job', 'load', (datetime.datetime(2015, 7, 23, 9, 30, 20, 268260, tzinfo=), 'done')] Querying data (synchronous) ~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -331,9 +331,9 @@ Background a query, loading the results into a table: >>> job = client.run_async_query('fullname-age-query-job', query) >>> job.destination_table = table >>> job.write_disposition= 'truncate' - >>> job.job_id - 'e3344fba-09df-4ae0-8337-fddee34b3840' - >>> job.type + >>> job.name + 'fullname-age-query-job' + >>> job.job_type 'query' >>> job.created None @@ -412,9 +412,9 @@ the job locally: >>> job.source_format = 'CSV' >>> job.skip_leading_rows = 1 # count of skipped header rows >>> job.write_disposition = 'truncate' - >>> job.job_id - 'e3344fba-09df-4ae0-8337-fddee34b3840' - >>> job.type + >>> job.name + 'load-from-storage-job' + >>> job.job_type 'load' >>> job.created None @@ -469,10 +469,10 @@ located on Google Cloud Storage. First, create the job locally: ... job.destination_format = 'CSV' ... job.print_header = True ... job.write_disposition = 'truncate' - >>> job.job_id - 'e3344fba-09df-4ae0-8337-fddee34b3840' - >>> job.type - 'load' + >>> job.name + 'extract-person-ages-job' + >>> job.job_type + 'extract' >>> job.created None >>> job.state @@ -523,9 +523,9 @@ First, create the job locally: >>> destination_table = dataset.table(name='person_ages_copy') >>> job = client.copy_table( ... 'copy-table-job', destination_table, source_table) - >>> job.job_id - 'e3344fba-09df-4ae0-8337-fddee34b3840' - >>> job.type + >>> job.name + 'copy-table-job' + >>> job.job_type 'copy' >>> job.created None diff --git a/gcloud/bigquery/job.py b/gcloud/bigquery/job.py index 31fe68bbdd79..dfcac73edd33 100644 --- a/gcloud/bigquery/job.py +++ b/gcloud/bigquery/job.py @@ -128,6 +128,15 @@ def __init__(self, name, client): super(_AsyncJob, self).__init__(client) self.name = name + @property + def job_type(self): + """Type of job + + :rtype: string + :returns: one of 'load', 'copy', 'extract', 'query' + """ + return self._JOB_TYPE + @property def path(self): """URL path for the job's APIs. @@ -146,15 +155,6 @@ def etag(self): """ return self._properties.get('etag') - @property - def job_id(self): - """ID for the job resource. - - :rtype: string, or ``NoneType`` - :returns: the ID (None until set from the server). - """ - return self._properties.get('id') - @property def self_link(self): """URL for the job resource. @@ -288,10 +288,10 @@ def _get_resource_config(cls, resource): '["jobReference"]["jobId"]') name = resource['jobReference']['jobId'] if ('configuration' not in resource or - cls._CONFIG_KEY not in resource['configuration']): + cls._JOB_TYPE not in resource['configuration']): raise KeyError('Resource lacks required configuration: ' - '["configuration"]["%s"]' % cls._CONFIG_KEY) - config = resource['configuration'][cls._CONFIG_KEY] + '["configuration"]["%s"]' % cls._JOB_TYPE) + config = resource['configuration'][cls._JOB_TYPE] return name, config def begin(self, client=None): @@ -403,7 +403,7 @@ class LoadTableFromStorageJob(_AsyncJob): """ _schema = None - _CONFIG_KEY = 'load' + _JOB_TYPE = 'load' def __init__(self, name, destination, source_uris, client, schema=()): super(LoadTableFromStorageJob, self).__init__(name, client) @@ -568,7 +568,7 @@ def _build_resource(self): 'jobId': self.name, }, 'configuration': { - self._CONFIG_KEY: { + self._JOB_TYPE: { 'sourceUris': self.source_uris, 'destinationTable': { 'projectId': self.destination.project, @@ -578,7 +578,7 @@ def _build_resource(self): }, }, } - configuration = resource['configuration'][self._CONFIG_KEY] + configuration = resource['configuration'][self._JOB_TYPE] self._populate_config_resource(configuration) if len(self.schema) > 0: @@ -647,7 +647,7 @@ class CopyJob(_AsyncJob): for the dataset (which requires a project). """ - _CONFIG_KEY = 'copy' + _JOB_TYPE = 'copy' def __init__(self, name, destination, sources, client): super(CopyJob, self).__init__(name, client) @@ -687,7 +687,7 @@ def _build_resource(self): 'jobId': self.name, }, 'configuration': { - self._CONFIG_KEY: { + self._JOB_TYPE: { 'sourceTables': source_refs, 'destinationTable': { 'projectId': self.destination.project, @@ -697,7 +697,7 @@ def _build_resource(self): }, }, } - configuration = resource['configuration'][self._CONFIG_KEY] + configuration = resource['configuration'][self._JOB_TYPE] self._populate_config_resource(configuration) return resource @@ -763,7 +763,7 @@ class ExtractTableToStorageJob(_AsyncJob): :param client: A client which holds credentials and project configuration for the dataset (which requires a project). """ - _CONFIG_KEY = 'extract' + _JOB_TYPE = 'extract' def __init__(self, name, source, destination_uris, client): super(ExtractTableToStorageJob, self).__init__(name, client) @@ -817,13 +817,13 @@ def _build_resource(self): 'jobId': self.name, }, 'configuration': { - self._CONFIG_KEY: { + self._JOB_TYPE: { 'sourceTable': source_ref, 'destinationUris': self.destination_uris, }, }, } - configuration = resource['configuration'][self._CONFIG_KEY] + configuration = resource['configuration'][self._JOB_TYPE] self._populate_config_resource(configuration) return resource @@ -885,7 +885,7 @@ class QueryJob(_AsyncJob): :param client: A client which holds credentials and project configuration for the dataset (which requires a project). """ - _CONFIG_KEY = 'query' + _JOB_TYPE = 'query' def __init__(self, name, query, client): super(QueryJob, self).__init__(name, client) @@ -972,12 +972,12 @@ def _build_resource(self): 'jobId': self.name, }, 'configuration': { - self._CONFIG_KEY: { + self._JOB_TYPE: { 'query': self.query, }, }, } - configuration = resource['configuration'][self._CONFIG_KEY] + configuration = resource['configuration'][self._JOB_TYPE] self._populate_config_resource(configuration) return resource diff --git a/gcloud/bigquery/test_client.py b/gcloud/bigquery/test_client.py index 5df18ddf6eed..aa72834f560f 100644 --- a/gcloud/bigquery/test_client.py +++ b/gcloud/bigquery/test_client.py @@ -233,7 +233,7 @@ def test_list_jobs_defaults(self): for found, expected in zip(jobs, DATA['jobs']): name = expected['jobReference']['jobId'] self.assertTrue(isinstance(found, JOB_TYPES[name])) - self.assertEqual(found.job_id, expected['id']) + self.assertEqual(found.name, name) self.assertEqual(token, TOKEN) self.assertEqual(len(conn._requested), 1) @@ -285,7 +285,7 @@ def test_list_jobs_load_job_wo_sourceUris(self): for found, expected in zip(jobs, DATA['jobs']): name = expected['jobReference']['jobId'] self.assertTrue(isinstance(found, JOB_TYPES[name])) - self.assertEqual(found.job_id, expected['id']) + self.assertEqual(found.name, name) self.assertEqual(token, TOKEN) self.assertEqual(len(conn._requested), 1) diff --git a/gcloud/bigquery/test_job.py b/gcloud/bigquery/test_job.py index ee1fadb85372..58953dbc81d5 100644 --- a/gcloud/bigquery/test_job.py +++ b/gcloud/bigquery/test_job.py @@ -71,7 +71,6 @@ def _makeResource(self, started=False, ended=False): def _verifyInitialReadonlyProperties(self, job): # root elements of resource self.assertEqual(job.etag, None) - self.assertEqual(job.job_id, None) self.assertEqual(job.self_link, None) self.assertEqual(job.user_email, None) @@ -88,8 +87,6 @@ def _verifyInitialReadonlyProperties(self, job): def _verifyReadonlyResourceProperties(self, job, resource): from datetime import timedelta - self.assertEqual(job.job_id, self.JOB_ID) - statistics = resource.get('statistics', {}) if 'creationTime' in statistics: @@ -238,6 +235,7 @@ def test_ctor(self): self.assertTrue(job.destination is table) self.assertEqual(list(job.source_uris), [self.SOURCE1]) self.assertTrue(job._client is client) + self.assertEqual(job.job_type, self.JOB_TYPE) self.assertEqual( job.path, '/projects/%s/jobs/%s' % (self.PROJECT, self.JOB_NAME)) @@ -336,7 +334,6 @@ def test_props_set_by_server(self): load_stats['outputRows'] = 345 self.assertEqual(job.etag, 'ETAG') - self.assertEqual(job.job_id, JOB_ID) self.assertEqual(job.self_link, URL) self.assertEqual(job.user_email, EMAIL) @@ -692,6 +689,7 @@ def test_ctor(self): self.assertTrue(job.destination is destination) self.assertEqual(job.sources, [source]) self.assertTrue(job._client is client) + self.assertEqual(job.job_type, self.JOB_TYPE) self.assertEqual( job.path, '/projects/%s/jobs/%s' % (self.PROJECT, self.JOB_NAME)) @@ -990,6 +988,7 @@ def test_ctor(self): self.assertEqual(job.source, source) self.assertEqual(job.destination_uris, [self.DESTINATION_URI]) self.assertTrue(job._client is client) + self.assertEqual(job.job_type, self.JOB_TYPE) self.assertEqual( job.path, '/projects/%s/jobs/%s' % (self.PROJECT, self.JOB_NAME)) @@ -1297,6 +1296,7 @@ def test_ctor(self): job = self._makeOne(self.JOB_NAME, self.QUERY, client) self.assertEqual(job.query, self.QUERY) self.assertTrue(job._client is client) + self.assertEqual(job.job_type, self.JOB_TYPE) self.assertEqual( job.path, '/projects/%s/jobs/%s' % (self.PROJECT, self.JOB_NAME))