diff --git a/docs/resources/dynamic_table.md b/docs/resources/dynamic_table.md index d2f8851d20..6ca255f397 100644 --- a/docs/resources/dynamic_table.md +++ b/docs/resources/dynamic_table.md @@ -43,8 +43,8 @@ resource "snowflake_dynamic_table" "dt" { - `comment` (String) Specifies a comment for the dynamic table. - `or_replace` (Boolean) Specifies whether to replace the dynamic table if it already exists. -- `refresh_mode` (String) INCREMENTAL if the dynamic table will use incremental refreshes, or FULL if it will recompute the whole table on every refresh. -- `initialize` (String) Specifies the behavior of the initial refresh of the dynamic table. This property cannot be altered after you create the dynamic table. +- `refresh_mode` (String) INCREMENTAL if the dynamic table will use incremental refreshes, or FULL if it will recompute the whole table on every refresh. Specify AUTO to let Snowflake decide. The default is AUTO. +- `initialize` (String) Specifies the behavior of the initial refresh of the dynamic table. This property cannot be altered after you create the dynamic table. Specify ON_CREATE to initialize the dynamic table immeidately, or ON_SCHEDULE to have it initialize at the next tick after creation. The default os ON_CREATE. ### Read-Only diff --git a/pkg/resources/dynamic_table.go b/pkg/resources/dynamic_table.go index a46916a359..1058017eb0 100644 --- a/pkg/resources/dynamic_table.go +++ b/pkg/resources/dynamic_table.go @@ -325,10 +325,10 @@ func CreateDynamicTable(d *schema.ResourceData, meta interface{}) error { request.WithOrReplace(true) } if v, ok := d.GetOk("refresh_mode"); ok { - request.WithRefreshMode(sdk.String(v.(string))) + request.WithRefreshMode(sdk.DynamicTableRefreshMode(v.(string))) } if v, ok := d.GetOk("initialize"); ok { - request.WithInitialize(sdk.String(v.(string))) + request.WithInitialize(sdk.DynamicTableInitialize(v.(string))) } if err := client.DynamicTables.Create(context.Background(), request); err != nil { return err diff --git a/pkg/resources/dynamic_table_acceptance_test.go b/pkg/resources/dynamic_table_acceptance_test.go index 6ebe311616..658c0d8ab9 100644 --- a/pkg/resources/dynamic_table_acceptance_test.go +++ b/pkg/resources/dynamic_table_acceptance_test.go @@ -38,11 +38,11 @@ func TestAcc_DynamicTable_basic(t *testing.T) { variableSet2["comment"] = config.StringVariable("Terraform acceptance test - updated") variableSet3 := m() - variableSet3["initialize"] = config.StringVariable("ON_SCHEDULE") + variableSet3["initialize"] = config.StringVariable(string(sdk.DynamicTableInitializeOnSchedule)) variableSet4 := m() - variableSet4["initialize"] = config.StringVariable("ON_SCHEDULE") // keep the same setting from set 3 - variableSet4["refresh_mode"] = config.StringVariable("FULL") + variableSet4["initialize"] = config.StringVariable(string(sdk.DynamicTableInitializeOnSchedule)) // keep the same setting from set 3 + variableSet4["refresh_mode"] = config.StringVariable(string(sdk.DynamicTableRefreshModeFull)) // used to check whether a dynamic table was replaced var createdOn string @@ -63,8 +63,8 @@ func TestAcc_DynamicTable_basic(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "database", acc.TestDatabaseName), resource.TestCheckResourceAttr(resourceName, "schema", acc.TestSchemaName), resource.TestCheckResourceAttr(resourceName, "warehouse", acc.TestWarehouseName), - resource.TestCheckResourceAttr(resourceName, "initialize", "ON_CREATE"), - resource.TestCheckResourceAttr(resourceName, "refresh_mode", "AUTO"), + resource.TestCheckResourceAttr(resourceName, "initialize", string(sdk.DynamicTableInitializeOnCreate)), + resource.TestCheckResourceAttr(resourceName, "refresh_mode", string(sdk.DynamicTableRefreshModeAuto)), resource.TestCheckResourceAttr(resourceName, "target_lag.#", "1"), resource.TestCheckResourceAttr(resourceName, "target_lag.0.maximum_duration", "2 minutes"), resource.TestCheckResourceAttr(resourceName, "query", fmt.Sprintf("select \"id\" from \"%v\".\"%v\".\"%v\"", acc.TestDatabaseName, acc.TestSchemaName, tableName)), @@ -118,14 +118,7 @@ func TestAcc_DynamicTable_basic(t *testing.T) { ConfigDirectory: config.TestStepDirectory(), ConfigVariables: variableSet3, Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckResourceAttr(resourceName, "database", acc.TestDatabaseName), - resource.TestCheckResourceAttr(resourceName, "schema", acc.TestSchemaName), - resource.TestCheckResourceAttr(resourceName, "initialize", "ON_SCHEDULE"), - resource.TestCheckResourceAttr(resourceName, "refresh_mode", "AUTO"), - resource.TestCheckResourceAttr(resourceName, "target_lag.#", "1"), - resource.TestCheckResourceAttr(resourceName, "target_lag.0.downstream", "true"), - resource.TestCheckResourceAttr(resourceName, "comment", "Terraform acceptance test"), + resource.TestCheckResourceAttr(resourceName, "initialize", string(sdk.DynamicTableInitializeOnSchedule)), resource.TestCheckResourceAttrWith(resourceName, "created_on", func(value string) error { if value == createdOn { @@ -141,14 +134,8 @@ func TestAcc_DynamicTable_basic(t *testing.T) { ConfigDirectory: config.TestStepDirectory(), ConfigVariables: variableSet4, Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckResourceAttr(resourceName, "database", acc.TestDatabaseName), - resource.TestCheckResourceAttr(resourceName, "schema", acc.TestSchemaName), - resource.TestCheckResourceAttr(resourceName, "initialize", "ON_SCHEDULE"), - resource.TestCheckResourceAttr(resourceName, "refresh_mode", "FULL"), - resource.TestCheckResourceAttr(resourceName, "target_lag.#", "1"), - resource.TestCheckResourceAttr(resourceName, "target_lag.0.downstream", "true"), - resource.TestCheckResourceAttr(resourceName, "comment", "Terraform acceptance test"), + resource.TestCheckResourceAttr(resourceName, "initialize", string(sdk.DynamicTableInitializeOnSchedule)), + resource.TestCheckResourceAttr(resourceName, "refresh_mode", string(sdk.DynamicTableRefreshModeFull)), resource.TestCheckResourceAttrWith(resourceName, "created_on", func(value string) error { if value == createdOn { diff --git a/pkg/sdk/dynamic_table.go b/pkg/sdk/dynamic_table.go index 013778c829..56440d06df 100644 --- a/pkg/sdk/dynamic_table.go +++ b/pkg/sdk/dynamic_table.go @@ -17,16 +17,16 @@ type DynamicTables interface { // createDynamicTableOptions is based on https://docs.snowflake.com/en/sql-reference/sql/create-dynamic-table type createDynamicTableOptions struct { - create bool `ddl:"static" sql:"CREATE"` - OrReplace *bool `ddl:"keyword" sql:"OR REPLACE"` - dynamicTable bool `ddl:"static" sql:"DYNAMIC TABLE"` - name SchemaObjectIdentifier `ddl:"identifier"` - targetLag TargetLag `ddl:"parameter,no_quotes" sql:"TARGET_LAG"` - Initialize *string `ddl:"parameter,no_quotes" sql:"INITIALIZE"` - RefreshMode *string `ddl:"parameter,no_quotes" sql:"REFRESH_MODE"` - warehouse AccountObjectIdentifier `ddl:"identifier,equals" sql:"WAREHOUSE"` - Comment *string `ddl:"parameter,single_quotes" sql:"COMMENT"` - query string `ddl:"parameter,no_equals,no_quotes" sql:"AS"` + create bool `ddl:"static" sql:"CREATE"` + OrReplace *bool `ddl:"keyword" sql:"OR REPLACE"` + dynamicTable bool `ddl:"static" sql:"DYNAMIC TABLE"` + name SchemaObjectIdentifier `ddl:"identifier"` + targetLag TargetLag `ddl:"parameter,no_quotes" sql:"TARGET_LAG"` + Initialize *DynamicTableInitialize `ddl:"parameter,no_quotes" sql:"INITIALIZE"` + RefreshMode *DynamicTableRefreshMode `ddl:"parameter,no_quotes" sql:"REFRESH_MODE"` + warehouse AccountObjectIdentifier `ddl:"identifier,equals" sql:"WAREHOUSE"` + Comment *string `ddl:"parameter,single_quotes" sql:"COMMENT"` + query string `ddl:"parameter,no_equals,no_quotes" sql:"AS"` } type TargetLag struct { @@ -76,6 +76,10 @@ const ( DynamicTableRefreshModeFull DynamicTableRefreshMode = "FULL" ) +func (d DynamicTableRefreshMode) ToPointer() *DynamicTableRefreshMode { + return &d +} + var AllDynamicRefreshModes = []DynamicTableRefreshMode{DynamicTableRefreshModeAuto, DynamicTableRefreshModeIncremental, DynamicTableRefreshModeFull} type DynamicTableInitialize string @@ -85,6 +89,10 @@ const ( DynamicTableInitializeOnSchedule DynamicTableInitialize = "ON_SCHEDULE" ) +func (d DynamicTableInitialize) ToPointer() *DynamicTableInitialize { + return &d +} + var AllDynamicTableInitializes = []DynamicTableInitialize{DynamicTableInitializeOnCreate, DynamicTableInitializeOnSchedule} type DynamicTableSchedulingState string diff --git a/pkg/sdk/dynamic_table_dto.go b/pkg/sdk/dynamic_table_dto.go index cdb1154159..2be8a983b7 100644 --- a/pkg/sdk/dynamic_table_dto.go +++ b/pkg/sdk/dynamic_table_dto.go @@ -18,8 +18,8 @@ type CreateDynamicTableRequest struct { query string // required comment *string - refreshMode *string - initialize *string + refreshMode *DynamicTableRefreshMode + initialize *DynamicTableInitialize } type AlterDynamicTableRequest struct { diff --git a/pkg/sdk/dynamic_table_dto_builders.go b/pkg/sdk/dynamic_table_dto_builders.go index 85767fa5fa..3062f1b383 100644 --- a/pkg/sdk/dynamic_table_dto_builders.go +++ b/pkg/sdk/dynamic_table_dto_builders.go @@ -24,13 +24,13 @@ func (s *CreateDynamicTableRequest) WithComment(comment *string) *CreateDynamicT return s } -func (s *CreateDynamicTableRequest) WithRefreshMode(refreshMode *string) *CreateDynamicTableRequest { - s.refreshMode = refreshMode +func (s *CreateDynamicTableRequest) WithRefreshMode(refreshMode DynamicTableRefreshMode) *CreateDynamicTableRequest { + s.refreshMode = &refreshMode return s } -func (s *CreateDynamicTableRequest) WithInitialize(initialize *string) *CreateDynamicTableRequest { - s.initialize = initialize +func (s *CreateDynamicTableRequest) WithInitialize(initialize DynamicTableInitialize) *CreateDynamicTableRequest { + s.initialize = &initialize return s } diff --git a/pkg/sdk/dynamic_table_test.go b/pkg/sdk/dynamic_table_test.go index b7f96b265a..885da8354c 100644 --- a/pkg/sdk/dynamic_table_test.go +++ b/pkg/sdk/dynamic_table_test.go @@ -39,8 +39,8 @@ func TestDynamicTableCreate(t *testing.T) { opts := defaultOpts() opts.OrReplace = Bool(true) opts.Comment = String("comment") - opts.RefreshMode = String("FULL") - opts.Initialize = String("ON_SCHEDULE") + opts.RefreshMode = DynamicTableRefreshModeFull.ToPointer() + opts.Initialize = DynamicTableInitializeOnSchedule.ToPointer() assertOptsValidAndSQLEquals(t, opts, `CREATE OR REPLACE DYNAMIC TABLE %s TARGET_LAG = '1 minutes' INITIALIZE = ON_SCHEDULE REFRESH_MODE = FULL WAREHOUSE = "warehouse_name" COMMENT = 'comment' AS SELECT product_id, product_name FROM staging_table`, id.FullyQualifiedName()) }) } diff --git a/pkg/sdk/testint/dynamic_table_integration_test.go b/pkg/sdk/testint/dynamic_table_integration_test.go index 32c3f7ae3d..cebffbec65 100644 --- a/pkg/sdk/testint/dynamic_table_integration_test.go +++ b/pkg/sdk/testint/dynamic_table_integration_test.go @@ -68,7 +68,7 @@ func TestInt_DynamicTableCreateAndDrop(t *testing.T) { require.Equal(t, name.Name(), entity.Name) require.Equal(t, testWarehouse(t).ID().Name(), entity.Warehouse) require.Equal(t, "DOWNSTREAM", entity.TargetLag) - require.Equal(t, "INCREMENTAL", entity.RefreshMode) + require.Equal(t, sdk.DynamicTableRefreshModeIncremental, entity.RefreshMode) require.Contains(t, entity.Text, "initialize = 'ON_SCHEDULE'") require.Contains(t, entity.Text, "refresh_mode = 'AUTO'") }) @@ -80,9 +80,9 @@ func TestInt_DynamicTableCreateAndDrop(t *testing.T) { } query := "select id from " + tableTest.ID().FullyQualifiedName() comment := random.Comment() - refreshMode := "FULL" - initialize := "ON_SCHEDULE" - err := client.DynamicTables.Create(ctx, sdk.NewCreateDynamicTableRequest(name, testWarehouse(t).ID(), targetLag, query).WithOrReplace(true).WithInitialize(&initialize).WithRefreshMode(&refreshMode).WithComment(&comment)) + refreshMode := sdk.DynamicTableRefreshModeFull + initialize := sdk.DynamicTableInitializeOnSchedule + err := client.DynamicTables.Create(ctx, sdk.NewCreateDynamicTableRequest(name, testWarehouse(t).ID(), targetLag, query).WithOrReplace(true).WithInitialize(initialize).WithRefreshMode(refreshMode).WithComment(&comment)) require.NoError(t, err) t.Cleanup(func() { err = client.DynamicTables.Drop(ctx, sdk.NewDropDynamicTableRequest(name)) @@ -96,7 +96,7 @@ func TestInt_DynamicTableCreateAndDrop(t *testing.T) { require.Equal(t, name.Name(), entity.Name) require.Equal(t, testWarehouse(t).ID().Name(), entity.Warehouse) require.Equal(t, "DOWNSTREAM", entity.TargetLag) - require.Equal(t, "FULL", entity.RefreshMode) + require.Equal(t, sdk.DynamicTableRefreshModeFull, entity.RefreshMode) require.Contains(t, entity.Text, "initialize = 'ON_SCHEDULE'") require.Contains(t, entity.Text, "refresh_mode = 'FULL'") })