Skip to content

Commit f22eff2

Browse files
Gaurang033Linchin
andauthored
feat: add support dataset.max_time_travel_hours (#1683)
* feat: add support dataset.max_time_travel_hours * Update tests/unit/test_create_dataset.py * Update tests/unit/test_create_dataset.py * Update google/cloud/bigquery/dataset.py * update test_create_dataset_with_max_time_travel_hours --------- Co-authored-by: Lingqing Gan <[email protected]>
1 parent 49bfd12 commit f22eff2

File tree

3 files changed

+109
-0
lines changed

3 files changed

+109
-0
lines changed

google/cloud/bigquery/dataset.py

+23
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,7 @@ class Dataset(object):
525525
"friendly_name": "friendlyName",
526526
"default_encryption_configuration": "defaultEncryptionConfiguration",
527527
"storage_billing_model": "storageBillingModel",
528+
"max_time_travel_hours": "maxTimeTravelHours",
528529
"default_rounding_mode": "defaultRoundingMode",
529530
}
530531

@@ -533,6 +534,28 @@ def __init__(self, dataset_ref) -> None:
533534
dataset_ref = DatasetReference.from_string(dataset_ref)
534535
self._properties = {"datasetReference": dataset_ref.to_api_repr(), "labels": {}}
535536

537+
@property
538+
def max_time_travel_hours(self):
539+
"""
540+
Optional[int]: Defines the time travel window in hours. The value can
541+
be from 48 to 168 hours (2 to 7 days), and in multiple of 24 hours
542+
(48, 72, 96, 120, 144, 168).
543+
The default value is 168 hours if this is not set.
544+
"""
545+
return self._properties.get("maxTimeTravelHours")
546+
547+
@max_time_travel_hours.setter
548+
def max_time_travel_hours(self, hours):
549+
if not isinstance(hours, int):
550+
raise ValueError(f"max_time_travel_hours must be an integer. Got {hours}")
551+
if hours < 2 * 24 or hours > 7 * 24:
552+
raise ValueError(
553+
"Time Travel Window should be from 48 to 168 hours (2 to 7 days)"
554+
)
555+
if hours % 24 != 0:
556+
raise ValueError("Time Travel Window should be multiple of 24")
557+
self._properties["maxTimeTravelHours"] = hours
558+
536559
@property
537560
def default_rounding_mode(self):
538561
"""Union[str, None]: defaultRoundingMode of the dataset as set by the user

tests/system/test_client.py

+7
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,11 @@ def test_create_dataset(self):
238238
self.assertEqual(dataset.dataset_id, DATASET_ID)
239239
self.assertEqual(dataset.project, Config.CLIENT.project)
240240

241+
def test_create_dataset_max_time_travel_hours(self):
242+
DATASET_ID = _make_dataset_id("create_ci_dataset")
243+
dataset = self.temp_dataset(DATASET_ID, max_time_travel_hours=24 * 2)
244+
self.assertEqual(int(dataset.max_time_travel_hours), 24 * 2)
245+
241246
def test_get_dataset(self):
242247
dataset_id = _make_dataset_id("get_dataset")
243248
client = Config.CLIENT
@@ -2299,6 +2304,8 @@ def temp_dataset(self, dataset_id, *args, **kwargs):
22992304
dataset = Dataset(dataset_ref)
23002305
if kwargs.get("location"):
23012306
dataset.location = kwargs.get("location")
2307+
if kwargs.get("max_time_travel_hours"):
2308+
dataset.max_time_travel_hours = kwargs.get("max_time_travel_hours")
23022309
if kwargs.get("default_rounding_mode"):
23032310
dataset.default_rounding_mode = kwargs.get("default_rounding_mode")
23042311

tests/unit/test_create_dataset.py

+79
Original file line numberDiff line numberDiff line change
@@ -466,3 +466,82 @@ def test_create_dataset_with_default_rounding_mode_if_value_is_in_possible_value
466466
},
467467
timeout=DEFAULT_TIMEOUT,
468468
)
469+
470+
471+
def test_create_dataset_with_max_time_travel_hours(PROJECT, DS_ID, LOCATION):
472+
path = "/projects/%s/datasets" % PROJECT
473+
max_time_travel_hours = 24 * 3
474+
475+
resource = {
476+
"datasetReference": {"projectId": PROJECT, "datasetId": DS_ID},
477+
"etag": "etag",
478+
"id": "{}:{}".format(PROJECT, DS_ID),
479+
"location": LOCATION,
480+
"maxTimeTravelHours": max_time_travel_hours,
481+
}
482+
client = make_client(location=LOCATION)
483+
conn = client._connection = make_connection(resource)
484+
485+
ds_ref = DatasetReference(PROJECT, DS_ID)
486+
before = Dataset(ds_ref)
487+
before.max_time_travel_hours = max_time_travel_hours
488+
after = client.create_dataset(before)
489+
assert after.dataset_id == DS_ID
490+
assert after.project == PROJECT
491+
assert after.max_time_travel_hours == max_time_travel_hours
492+
493+
conn.api_request.assert_called_once_with(
494+
method="POST",
495+
path=path,
496+
data={
497+
"datasetReference": {"projectId": PROJECT, "datasetId": DS_ID},
498+
"labels": {},
499+
"location": LOCATION,
500+
"maxTimeTravelHours": max_time_travel_hours,
501+
},
502+
timeout=DEFAULT_TIMEOUT,
503+
)
504+
505+
506+
def test_create_dataset_with_max_time_travel_hours_not_multiple_of_24(
507+
PROJECT, DS_ID, LOCATION
508+
):
509+
ds_ref = DatasetReference(PROJECT, DS_ID)
510+
dataset = Dataset(ds_ref)
511+
with pytest.raises(ValueError) as e:
512+
dataset.max_time_travel_hours = 50
513+
assert str(e.value) == "Time Travel Window should be multiple of 24"
514+
515+
516+
def test_create_dataset_with_max_time_travel_hours_is_less_than_2_days(
517+
PROJECT, DS_ID, LOCATION
518+
):
519+
ds_ref = DatasetReference(PROJECT, DS_ID)
520+
dataset = Dataset(ds_ref)
521+
with pytest.raises(ValueError) as e:
522+
dataset.max_time_travel_hours = 24
523+
assert (
524+
str(e.value)
525+
== "Time Travel Window should be from 48 to 168 hours (2 to 7 days)"
526+
)
527+
528+
529+
def test_create_dataset_with_max_time_travel_hours_is_greater_than_7_days(
530+
PROJECT, DS_ID, LOCATION
531+
):
532+
ds_ref = DatasetReference(PROJECT, DS_ID)
533+
dataset = Dataset(ds_ref)
534+
with pytest.raises(ValueError) as e:
535+
dataset.max_time_travel_hours = 192
536+
assert (
537+
str(e.value)
538+
== "Time Travel Window should be from 48 to 168 hours (2 to 7 days)"
539+
)
540+
541+
542+
def test_create_dataset_with_max_time_travel_hours_is_not_int(PROJECT, DS_ID, LOCATION):
543+
ds_ref = DatasetReference(PROJECT, DS_ID)
544+
dataset = Dataset(ds_ref)
545+
with pytest.raises(ValueError) as e:
546+
dataset.max_time_travel_hours = "50"
547+
assert str(e.value) == "max_time_travel_hours must be an integer. Got 50"

0 commit comments

Comments
 (0)