Skip to content

Commit 3c9b034

Browse files
committed
Correcting syntax, adding test to test_query.py
Slight tidy up.
1 parent 53aad82 commit 3c9b034

File tree

4 files changed

+70
-6
lines changed

4 files changed

+70
-6
lines changed

google/cloud/bigquery/job/base.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,33 @@ def __setattr__(self, name, value):
171171
)
172172
super(_JobConfig, self).__setattr__(name, value)
173173

174+
@property
175+
def jobtimeout_ms(self):
176+
""" Optional parameter. Job timeout in milliseconds. If this time limit is exceeded, BigQuery might attempt to stop the job.
177+
178+
https://cloud.google.com/bigquery/docs/reference/rest/v2/Job#JobConfiguration.FIELDS.job_timeout_ms
179+
180+
e.g.
181+
job_config = bigquery.QueryJobConfig( jobtimeout = 5000 )
182+
183+
or
184+
185+
job_config.jobtimeout = 5000
186+
Raises:
187+
ValueError: If ``value`` type is invalid.
188+
"""
189+
190+
# None as this is an optional parameter.
191+
return None
192+
193+
@jobtimeout_ms.setter
194+
def jobtimeout(self, value):
195+
if not isinstance(value, int):
196+
raise ValueError("Pass an int for jobTimeoutMs, e.g. 5000")
197+
198+
""" Docs indicate a string is expected by the API """
199+
self._properties["jobTimeoutMs"] = str(value)
200+
174201
@property
175202
def labels(self):
176203
"""Dict[str, str]: Labels for the job.

google/cloud/bigquery/model.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from google.cloud.bigquery import _helpers
2626
from google.cloud.bigquery import standard_sql
2727
from google.cloud.bigquery.encryption_configuration import EncryptionConfiguration
28+
import google.cloud.bigquery.model
2829

2930

3031
class Model:
@@ -167,9 +168,23 @@ def training_runs(self) -> Sequence[Dict[str, Any]]:
167168
168169
Read-only.
169170
"""
171+
170172
return typing.cast(
171173
Sequence[Dict[str, Any]], self._properties.get("trainingRuns", [])
172174
)
175+
176+
@property
177+
def transform_columns(self) -> Sequence[Dict[str, Any]]:
178+
179+
"""
180+
Output only. This field will be populated if a TRANSFORM clause was used to train a model. TRANSFORM clause (if used) takes featureColumns as input and outputs transformColumns. transformColumns then are used to train the model.
181+
https://cloud.google.com/bigquery/docs/reference/rest/v2/models#Model.FIELDS.transform_columns
182+
Read-only.
183+
"""
184+
185+
return self._properties.get("transformColumns", [])
186+
187+
173188

174189
@property
175190
def feature_columns(self) -> Sequence[standard_sql.StandardSqlField]:
@@ -258,7 +273,7 @@ def friendly_name(self, value: Optional[str]):
258273
# TODO: Consider using typing.TypedDict when only Python 3.8+ is supported.
259274
self._properties["friendlyName"] = value # type: ignore
260275

261-
@property
276+
# @property
262277
def labels(self) -> Dict[str, str]:
263278
"""Labels for the table.
264279
@@ -268,8 +283,8 @@ def labels(self) -> Dict[str, str]:
268283
"""
269284
return self._properties.setdefault("labels", {})
270285

271-
@labels.setter
272-
def labels(self, value: Optional[Dict[str, str]]):
286+
# @labels.setter
287+
def set_labels(self, value: Optional[Dict[str, str]]):
273288
if value is None:
274289
value = {}
275290
self._properties["labels"] = value
@@ -433,6 +448,20 @@ def __repr__(self):
433448
self.project, self.dataset_id, self.model_id
434449
)
435450

451+
class TransformColumn:
452+
"""
453+
"""
454+
455+
def __init__(self, resource:Dict[str, Any]):
456+
self._properties = resource
457+
self.name = resource.get("name")
458+
not_resourced = resource.get("type")
459+
if not_resourced is None:
460+
self.type_ = None
461+
else:
462+
self.type_= standard_sql.StandardSqlDataType.from_api_repr(not_resourced)
463+
self.transform_sql = resource.get("transformSQL")
464+
436465

437466
def _model_arg_to_model_ref(value, default_project=None):
438467
"""Helper to convert a string or Model to ModelReference.
@@ -444,3 +473,5 @@ def _model_arg_to_model_ref(value, default_project=None):
444473
if isinstance(value, Model):
445474
return value.reference
446475
return value
476+
477+

tests/unit/job/test_query.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ def test_ctor_defaults(self):
244244
self.assertIsNone(job.destination_encryption_configuration)
245245
self.assertIsNone(job.range_partitioning)
246246
self.assertIsNone(job.time_partitioning)
247+
self.assertIsNone(job.timeout_ms) ////
247248
self.assertIsNone(job.clustering_fields)
248249
self.assertIsNone(job.schema_update_options)
249250

@@ -689,6 +690,10 @@ def test_ddl_target_table(self):
689690
self.assertEqual(job.ddl_target_table.dataset_id, "ddl_ds")
690691
self.assertEqual(job.ddl_target_table.project, self.PROJECT)
691692

693+
def test_jobtimeout_ms(self):
694+
self.assertIsInstance(job.timeout_ms, value)
695+
self.assertEquals(job.value.int)
696+
692697
def test_num_dml_affected_rows(self):
693698
num_rows = 1234
694699
client = _make_client(project=self.PROJECT)

tests/unit/model/test_model.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -349,9 +349,9 @@ def test_set_labels(object_under_test):
349349

350350

351351
def test_replace_labels(object_under_test):
352-
assert object_under_test.labels == {}
353-
object_under_test.labels = {"data_owner": "someteam"}
354-
assert object_under_test.labels == {"data_owner": "someteam"}
352+
assert object_under_test.labels() =={}
353+
object_under_test.set_labels({"data_owner": "someteam"})
354+
assert object_under_test.labels() == {"data_owner": "someteam"}
355355
labels = {}
356356
object_under_test.labels = labels
357357
assert object_under_test.labels is labels
@@ -380,6 +380,7 @@ def test_repr(target_class):
380380
)
381381

382382

383+
383384
def test_to_api_repr(target_class):
384385
model = target_class("my-proj.my_dset.my_model")
385386
resource = {

0 commit comments

Comments
 (0)