Skip to content

Commit 22a666c

Browse files
authored
feat(bigquery): expose dataset MaxTimeTravelHours (#7706)
1 parent 3b8bfb4 commit 22a666c

File tree

3 files changed

+37
-4
lines changed

3 files changed

+37
-4
lines changed

bigquery/dataset.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ type DatasetMetadata struct {
5858
// More information: https://cloud.google.com/bigquery/docs/reference/standard-sql/collation-concepts
5959
DefaultCollation string
6060

61+
// MaxTimeTravelHours represents the number of hours for the max time travel for all tables
62+
// in the dataset. Durations are rounded towards zero for the nearest hourly value.
63+
MaxTimeTravelHours time.Duration
64+
6165
// Storage billing model to be used for all tables in the dataset.
6266
// Can be set to PHYSICAL. Default is LOGICAL.
6367
// Once you create a dataset with storage billing model set to physical bytes, you can't change it back to using logical bytes again.
@@ -131,6 +135,10 @@ type DatasetMetadataToUpdate struct {
131135
// created in the dataset.
132136
DefaultCollation optional.String
133137

138+
// MaxTimeTravelHours represents the number of hours for the max time travel for all tables
139+
// in the dataset. Durations are rounded towards zero for the nearest hourly value.
140+
MaxTimeTravelHours optional.Duration
141+
134142
// Storage billing model to be used for all tables in the dataset.
135143
// Can be set to PHYSICAL. Default is LOGICAL.
136144
// Once you change a dataset's storage billing model to use physical bytes, you can't change it back to using logical bytes again.
@@ -208,6 +216,7 @@ func (dm *DatasetMetadata) toBQ() (*bq.Dataset, error) {
208216
ds.DefaultTableExpirationMs = int64(dm.DefaultTableExpiration / time.Millisecond)
209217
ds.DefaultPartitionExpirationMs = int64(dm.DefaultPartitionExpiration / time.Millisecond)
210218
ds.DefaultCollation = dm.DefaultCollation
219+
ds.MaxTimeTravelHours = int64(dm.MaxTimeTravelHours / time.Hour)
211220
ds.StorageBillingModel = string(dm.StorageBillingModel)
212221
ds.Labels = dm.Labels
213222
var err error
@@ -295,6 +304,7 @@ func bqToDatasetMetadata(d *bq.Dataset, c *Client) (*DatasetMetadata, error) {
295304
DefaultTableExpiration: time.Duration(d.DefaultTableExpirationMs) * time.Millisecond,
296305
DefaultPartitionExpiration: time.Duration(d.DefaultPartitionExpirationMs) * time.Millisecond,
297306
DefaultCollation: d.DefaultCollation,
307+
MaxTimeTravelHours: time.Duration(d.MaxTimeTravelHours) * time.Hour,
298308
StorageBillingModel: d.StorageBillingModel,
299309
DefaultEncryptionConfig: bqToEncryptionConfig(d.DefaultEncryptionConfiguration),
300310
Description: d.Description,
@@ -385,6 +395,15 @@ func (dm *DatasetMetadataToUpdate) toBQ() (*bq.Dataset, error) {
385395
ds.DefaultCollation = optional.ToString(dm.DefaultCollation)
386396
forceSend("DefaultCollation")
387397
}
398+
if dm.MaxTimeTravelHours != nil {
399+
dur := optional.ToDuration(dm.MaxTimeTravelHours)
400+
if dur == 0 {
401+
// Send a null to delete the field.
402+
ds.NullFields = append(ds.NullFields, "MaxTimeTravelHours")
403+
} else {
404+
ds.MaxTimeTravelHours = int64(dur / time.Hour)
405+
}
406+
}
388407
if dm.StorageBillingModel != nil {
389408
ds.StorageBillingModel = optional.ToString(dm.StorageBillingModel)
390409
forceSend("StorageBillingModel")

bigquery/dataset_integration_test.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ func TestIntegration_DatasetUpdateETags(t *testing.T) {
159159
check(md3, "", "")
160160
}
161161

162-
func TestIntegration_DatasetUpdateDefaultExpiration(t *testing.T) {
162+
func TestIntegration_DatasetUpdateDefaultExpirationAndMaxTimeTravel(t *testing.T) {
163163
if client == nil {
164164
t.Skip("Integration tests skipped")
165165
}
@@ -168,13 +168,21 @@ func TestIntegration_DatasetUpdateDefaultExpiration(t *testing.T) {
168168
if err != nil {
169169
t.Fatal(err)
170170
}
171+
wantExpiration := time.Hour
172+
wantTimeTravel := 48 * time.Hour
171173
// Set the default expiration time.
172-
md, err := dataset.Update(ctx, DatasetMetadataToUpdate{DefaultTableExpiration: time.Hour}, "")
174+
md, err := dataset.Update(ctx, DatasetMetadataToUpdate{
175+
DefaultTableExpiration: wantExpiration,
176+
MaxTimeTravelHours: wantTimeTravel,
177+
}, "")
173178
if err != nil {
174179
t.Fatal(err)
175180
}
176-
if md.DefaultTableExpiration != time.Hour {
177-
t.Fatalf("got %s, want 1h", md.DefaultTableExpiration)
181+
if got := md.DefaultTableExpiration; got != wantExpiration {
182+
t.Fatalf("DefaultTableExpiration want %s got %s", wantExpiration, md.DefaultTableExpiration)
183+
}
184+
if got := md.MaxTimeTravelHours; got != wantTimeTravel {
185+
t.Fatalf("MaxTimeTravelHours want %s got %s", wantTimeTravel, md.MaxTimeTravelHours)
178186
}
179187
// Omitting DefaultTableExpiration doesn't change it.
180188
md, err = dataset.Update(ctx, DatasetMetadataToUpdate{Name: "xyz"}, "")

bigquery/dataset_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ func TestDatasetToBQ(t *testing.T) {
322322
Name: "name",
323323
Description: "desc",
324324
DefaultTableExpiration: time.Hour,
325+
MaxTimeTravelHours: time.Duration(181 * time.Minute),
325326
DefaultPartitionExpiration: 24 * time.Hour,
326327
DefaultEncryptionConfig: &EncryptionConfig{
327328
KMSKeyName: "some_key",
@@ -342,6 +343,7 @@ func TestDatasetToBQ(t *testing.T) {
342343
FriendlyName: "name",
343344
Description: "desc",
344345
DefaultTableExpirationMs: 60 * 60 * 1000,
346+
MaxTimeTravelHours: 3,
345347
DefaultPartitionExpirationMs: 24 * 60 * 60 * 1000,
346348
DefaultEncryptionConfiguration: &bq.EncryptionConfiguration{
347349
KmsKeyName: "some_key",
@@ -397,6 +399,7 @@ func TestBQToDatasetMetadata(t *testing.T) {
397399
FriendlyName: "name",
398400
Description: "desc",
399401
DefaultTableExpirationMs: 60 * 60 * 1000,
402+
MaxTimeTravelHours: 3,
400403
DefaultPartitionExpirationMs: 24 * 60 * 60 * 1000,
401404
DefaultEncryptionConfiguration: &bq.EncryptionConfiguration{
402405
KmsKeyName: "some_key",
@@ -428,6 +431,7 @@ func TestBQToDatasetMetadata(t *testing.T) {
428431
Name: "name",
429432
Description: "desc",
430433
DefaultTableExpiration: time.Hour,
434+
MaxTimeTravelHours: time.Duration(3 * time.Hour),
431435
DefaultPartitionExpiration: 24 * time.Hour,
432436
DefaultEncryptionConfig: &EncryptionConfig{
433437
KMSKeyName: "some_key",
@@ -467,6 +471,7 @@ func TestDatasetMetadataToUpdateToBQ(t *testing.T) {
467471
Name: "name",
468472
DefaultTableExpiration: time.Hour,
469473
DefaultPartitionExpiration: 24 * time.Hour,
474+
MaxTimeTravelHours: time.Duration(181 * time.Minute),
470475
StorageBillingModel: PhysicalStorageBillingModel,
471476
DefaultEncryptionConfig: &EncryptionConfig{
472477
KMSKeyName: "some_key",
@@ -483,6 +488,7 @@ func TestDatasetMetadataToUpdateToBQ(t *testing.T) {
483488
Description: "desc",
484489
FriendlyName: "name",
485490
DefaultTableExpirationMs: 60 * 60 * 1000,
491+
MaxTimeTravelHours: 3,
486492
DefaultPartitionExpirationMs: 24 * 60 * 60 * 1000,
487493
StorageBillingModel: string(PhysicalStorageBillingModel),
488494
DefaultEncryptionConfiguration: &bq.EncryptionConfiguration{

0 commit comments

Comments
 (0)