From 6ec2bb218335acf791af859852fc6c8e9bea7a08 Mon Sep 17 00:00:00 2001 From: Alvaro Viebrantz Date: Tue, 16 Jan 2024 13:23:12 -0400 Subject: [PATCH] feat(bigquery): Add support for AllowNonIncrementalDefinition and Staleness on MaterializedView (#8673) --- bigquery/table.go | 38 +++++++++++++++++++++++++++++--------- bigquery/table_test.go | 21 +++++++++++++-------- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/bigquery/table.go b/bigquery/table.go index 9082b0f3aa8..25068e55868 100644 --- a/bigquery/table.go +++ b/bigquery/table.go @@ -326,19 +326,33 @@ type MaterializedViewDefinition struct { // RefreshInterval defines the maximum frequency, in millisecond precision, // at which this this materialized view will be refreshed. RefreshInterval time.Duration + + // AllowNonIncrementalDefinition for materialized view definition. + // The default value is false. + AllowNonIncrementalDefinition bool + + // MaxStaleness of data that could be returned when materialized + // view is queried. + MaxStaleness *IntervalValue } func (mvd *MaterializedViewDefinition) toBQ() *bq.MaterializedViewDefinition { if mvd == nil { return nil } + maxStaleness := "" + if mvd.MaxStaleness != nil { + maxStaleness = mvd.MaxStaleness.String() + } return &bq.MaterializedViewDefinition{ - EnableRefresh: mvd.EnableRefresh, - Query: mvd.Query, - LastRefreshTime: mvd.LastRefreshTime.UnixNano() / 1e6, - RefreshIntervalMs: int64(mvd.RefreshInterval) / 1e6, + EnableRefresh: mvd.EnableRefresh, + Query: mvd.Query, + LastRefreshTime: mvd.LastRefreshTime.UnixNano() / 1e6, + RefreshIntervalMs: int64(mvd.RefreshInterval) / 1e6, + AllowNonIncrementalDefinition: mvd.AllowNonIncrementalDefinition, + MaxStaleness: maxStaleness, // force sending the bool in all cases due to how Go handles false. - ForceSendFields: []string{"EnableRefresh"}, + ForceSendFields: []string{"EnableRefresh", "AllowNonIncrementalDefinition"}, } } @@ -346,11 +360,17 @@ func bqToMaterializedViewDefinition(q *bq.MaterializedViewDefinition) *Materiali if q == nil { return nil } + var maxStaleness *IntervalValue + if q.MaxStaleness != "" { + maxStaleness, _ = ParseInterval(q.MaxStaleness) + } return &MaterializedViewDefinition{ - EnableRefresh: q.EnableRefresh, - Query: q.Query, - LastRefreshTime: unixMillisToTime(q.LastRefreshTime), - RefreshInterval: time.Duration(q.RefreshIntervalMs) * time.Millisecond, + EnableRefresh: q.EnableRefresh, + Query: q.Query, + LastRefreshTime: unixMillisToTime(q.LastRefreshTime), + RefreshInterval: time.Duration(q.RefreshIntervalMs) * time.Millisecond, + AllowNonIncrementalDefinition: q.AllowNonIncrementalDefinition, + MaxStaleness: maxStaleness, } } diff --git a/bigquery/table_test.go b/bigquery/table_test.go index 27761502015..41b7fe32946 100644 --- a/bigquery/table_test.go +++ b/bigquery/table_test.go @@ -29,6 +29,7 @@ func TestBQToTableMetadata(t *testing.T) { aTimeMillis := aTime.UnixNano() / 1e6 aDurationMillis := int64(1800000) aDuration := time.Duration(aDurationMillis) * time.Millisecond + aStalenessValue, _ := ParseInterval("8:0:0") for _, test := range []struct { in *bq.Table want *TableMetadata @@ -53,10 +54,12 @@ func TestBQToTableMetadata(t *testing.T) { OldestEntryTime: uint64(aTimeMillis), }, MaterializedView: &bq.MaterializedViewDefinition{ - EnableRefresh: true, - Query: "mat view query", - LastRefreshTime: aTimeMillis, - RefreshIntervalMs: aDurationMillis, + EnableRefresh: true, + Query: "mat view query", + LastRefreshTime: aTimeMillis, + RefreshIntervalMs: aDurationMillis, + AllowNonIncrementalDefinition: true, + MaxStaleness: "8:0:0", }, TimePartitioning: &bq.TimePartitioning{ ExpirationMs: 7890, @@ -116,10 +119,12 @@ func TestBQToTableMetadata(t *testing.T) { NumLongTermBytes: 23, NumRows: 7, MaterializedView: &MaterializedViewDefinition{ - EnableRefresh: true, - Query: "mat view query", - LastRefreshTime: aTime, - RefreshInterval: aDuration, + EnableRefresh: true, + Query: "mat view query", + LastRefreshTime: aTime, + RefreshInterval: aDuration, + AllowNonIncrementalDefinition: true, + MaxStaleness: aStalenessValue, }, TimePartitioning: &TimePartitioning{ Type: DayPartitioningType,