Skip to content

Commit

Permalink
Caches more schema elements
Browse files Browse the repository at this point in the history
  • Loading branch information
gdavison committed Oct 9, 2024
1 parent 4be391b commit 65192c4
Show file tree
Hide file tree
Showing 18 changed files with 196 additions and 152 deletions.
1 change: 1 addition & 0 deletions internal/service/quicksight/ingestion_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ func TestAccQuickSightIngestion_basic(t *testing.T) {
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{
"ingestion_status",
"ingestion_type",
},
},
Expand Down
12 changes: 6 additions & 6 deletions internal/service/quicksight/schema/visual_bar_chart.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,12 +70,12 @@ func barCharVisualSchema() *schema.Schema {
DiffSuppressFunc: verify.SuppressMissingOptionalConfigurationBlock,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"category_items_limit": itemsLimitConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ItemsLimitConfiguration.html
"category_sort": fieldSortOptionsSchema(fieldSortOptionsMaxItems100), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_FieldSortOptions.html,
"color_items_limit": itemsLimitConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ItemsLimitConfiguration.html
"color_sort": fieldSortOptionsSchema(fieldSortOptionsMaxItems100), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_FieldSortOptions.html
"small_multiples_limit_configuration": itemsLimitConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ItemsLimitConfiguration.html
"small_multiples_sort": fieldSortOptionsSchema(fieldSortOptionsMaxItems100), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_FieldSortOptions.html
"category_items_limit": itemsLimitConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ItemsLimitConfiguration.html
"category_sort": fieldSortOptionsSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_FieldSortOptions.html,
"color_items_limit": itemsLimitConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ItemsLimitConfiguration.html
"color_sort": fieldSortOptionsSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_FieldSortOptions.html
"small_multiples_limit_configuration": itemsLimitConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ItemsLimitConfiguration.html
"small_multiples_sort": fieldSortOptionsSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_FieldSortOptions.html
},
},
},
Expand Down
4 changes: 2 additions & 2 deletions internal/service/quicksight/schema/visual_box_plot.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,8 @@ func boxPlotVisualSchema() *schema.Schema {
DiffSuppressFunc: verify.SuppressMissingOptionalConfigurationBlock,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"category_sort": fieldSortOptionsSchema(fieldSortOptionsMaxItems100), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_FieldSortOptions.html,
"pagination_configuration": paginationConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_PaginationConfiguration.html
"category_sort": fieldSortOptionsSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_FieldSortOptions.html,
"pagination_configuration": paginationConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_PaginationConfiguration.html
},
},
},
Expand Down
8 changes: 4 additions & 4 deletions internal/service/quicksight/schema/visual_combo_chart.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,10 @@ func comboChartVisualSchema() *schema.Schema {
DiffSuppressFunc: verify.SuppressMissingOptionalConfigurationBlock,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"category_items_limit": itemsLimitConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ItemsLimitConfiguration.html
"category_sort": fieldSortOptionsSchema(fieldSortOptionsMaxItems100), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_FieldSortOptions.html,
"color_items_limit": itemsLimitConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ItemsLimitConfiguration.html
"color_sort": fieldSortOptionsSchema(fieldSortOptionsMaxItems100), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_FieldSortOptions.html
"category_items_limit": itemsLimitConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ItemsLimitConfiguration.html
"category_sort": fieldSortOptionsSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_FieldSortOptions.html,
"color_items_limit": itemsLimitConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ItemsLimitConfiguration.html
"color_sort": fieldSortOptionsSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_FieldSortOptions.html
},
},
},
Expand Down
257 changes: 150 additions & 107 deletions internal/service/quicksight/schema/visual_fields.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,135 +10,178 @@ import (
"github.com/hashicorp/terraform-provider-aws/names"
)

const measureFieldsMaxItems5 = 5
const measureFieldsMaxItems20 = 20
const measureFieldsMaxItems40 = 40
const measureFieldsMaxItems200 = 200
const dimensionsFieldMaxItems10 = 10
const dimensionsFieldMaxItems40 = 40
const dimensionsFieldMaxItems200 = 200

func dimensionFieldSchema(maxItems int) *schema.Schema {
return &schema.Schema{ // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DimensionField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: maxItems,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"categorical_dimension_field": { // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_CategoricalDimensionField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: 1,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"column": columnSchema(true), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ColumnIdentifier.html
"field_id": stringLenBetweenSchema(attrRequired, 1, 512),
"format_configuration": stringFormatConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_StringFormatConfiguration.html
"hierarchy_id": stringLenBetweenSchema(attrOptional, 1, 512),
type measureFieldsSize int

const (
measureFieldsMaxItems5 measureFieldsSize = 5
measureFieldsMaxItems20 measureFieldsSize = 20
measureFieldsMaxItems40 measureFieldsSize = 40
measureFieldsMaxItems200 measureFieldsSize = 200
)

type dimensionFieldSize int

const (
dimensionsFieldMaxItems10 dimensionFieldSize = 10
dimensionsFieldMaxItems40 dimensionFieldSize = 40
dimensionsFieldMaxItems200 dimensionFieldSize = 200
)

type dimensionFieldSchemaIdentity dimensionFieldSize

var dimensionFieldSchemaCache syncMap[dimensionFieldSchemaIdentity, *schema.Schema]

func dimensionFieldSchema(maxItems dimensionFieldSize) *schema.Schema {
id := dimensionFieldSchemaIdentity(maxItems)

s, ok := dimensionFieldSchemaCache.Load(id)
if ok {
return s
}

// Use a separate `LoadOrStore` to avoid allocation if item is already in the cache
// Use `LoadOrStore` instead of `Store` in case there is a race
s, _ = dimensionFieldSchemaCache.LoadOrStore(
id,
&schema.Schema{ // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DimensionField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: int(maxItems),
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"categorical_dimension_field": { // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_CategoricalDimensionField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: 1,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"column": columnSchema(true), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ColumnIdentifier.html
"field_id": stringLenBetweenSchema(attrRequired, 1, 512),
"format_configuration": stringFormatConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_StringFormatConfiguration.html
"hierarchy_id": stringLenBetweenSchema(attrOptional, 1, 512),
},
},
},
},
"date_dimension_field": { // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DateDimensionField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: 1,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"column": columnSchema(true), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ColumnIdentifier.html
"field_id": stringLenBetweenSchema(attrRequired, 1, 512),
"date_granularity": stringEnumSchema[awstypes.TimeGranularity](attrOptional),
"format_configuration": dateTimeFormatConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DateTimeFormatConfiguration.html
"hierarchy_id": stringLenBetweenSchema(attrOptional, 1, 512),
"date_dimension_field": { // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DateDimensionField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: 1,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"column": columnSchema(true), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ColumnIdentifier.html
"field_id": stringLenBetweenSchema(attrRequired, 1, 512),
"date_granularity": stringEnumSchema[awstypes.TimeGranularity](attrOptional),
"format_configuration": dateTimeFormatConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DateTimeFormatConfiguration.html
"hierarchy_id": stringLenBetweenSchema(attrOptional, 1, 512),
},
},
},
},
"numerical_dimension_field": { // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_NumericalDimensionField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: 1,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"column": columnSchema(true), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ColumnIdentifier.html
"field_id": stringLenBetweenSchema(attrRequired, 1, 512),
"format_configuration": numberFormatConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_NumberFormatConfiguration.html
"hierarchy_id": stringLenBetweenSchema(attrOptional, 1, 512),
"numerical_dimension_field": { // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_NumericalDimensionField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: 1,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"column": columnSchema(true), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ColumnIdentifier.html
"field_id": stringLenBetweenSchema(attrRequired, 1, 512),
"format_configuration": numberFormatConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_NumberFormatConfiguration.html
"hierarchy_id": stringLenBetweenSchema(attrOptional, 1, 512),
},
},
},
},
},
},
}
)
return s
}

func measureFieldSchema(maxItems int) *schema.Schema {
return &schema.Schema{ // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_MeasureField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: maxItems,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"calculated_measure_field": { // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_CalculatedMeasureField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: 1,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
names.AttrExpression: stringLenBetweenSchema(attrRequired, 1, 4096),
"field_id": stringLenBetweenSchema(attrRequired, 1, 512),
type meaureFieldSchemaIdentity measureFieldsSize

var measureFieldSchemaCache syncMap[meaureFieldSchemaIdentity, *schema.Schema]

func measureFieldSchema(maxItems measureFieldsSize) *schema.Schema {
id := meaureFieldSchemaIdentity(maxItems)

s, ok := measureFieldSchemaCache.Load(id)
if ok {
return s
}

// Use a separate `LoadOrStore` to avoid allocation if item is already in the cache
// Use `LoadOrStore` instead of `Store` in case there is a race
s, _ = measureFieldSchemaCache.LoadOrStore(
id,
&schema.Schema{ // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_MeasureField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: int(maxItems),
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"calculated_measure_field": { // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_CalculatedMeasureField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: 1,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
names.AttrExpression: stringLenBetweenSchema(attrRequired, 1, 4096),
"field_id": stringLenBetweenSchema(attrRequired, 1, 512),
},
},
},
},
"categorical_measure_field": { // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_CategoricalMeasureField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: 1,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"column": columnSchema(true), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ColumnIdentifier.html
"field_id": stringLenBetweenSchema(attrRequired, 1, 512),
"aggregation_function": stringEnumSchema[awstypes.CategoricalAggregationFunction](attrOptional),
"format_configuration": stringFormatConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_StringFormatConfiguration.html
"categorical_measure_field": { // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_CategoricalMeasureField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: 1,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"column": columnSchema(true), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ColumnIdentifier.html
"field_id": stringLenBetweenSchema(attrRequired, 1, 512),
"aggregation_function": stringEnumSchema[awstypes.CategoricalAggregationFunction](attrOptional),
"format_configuration": stringFormatConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_StringFormatConfiguration.html
},
},
},
},
"date_measure_field": { // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DateMeasureField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: 1,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"column": columnSchema(true), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ColumnIdentifier.html
"field_id": stringLenBetweenSchema(attrRequired, 1, 512),
"aggregation_function": stringEnumSchema[awstypes.DateAggregationFunction](attrOptional),
"format_configuration": dateTimeFormatConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DateTimeFormatConfiguration.html
"date_measure_field": { // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DateMeasureField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: 1,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"column": columnSchema(true), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ColumnIdentifier.html
"field_id": stringLenBetweenSchema(attrRequired, 1, 512),
"aggregation_function": stringEnumSchema[awstypes.DateAggregationFunction](attrOptional),
"format_configuration": dateTimeFormatConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DateTimeFormatConfiguration.html
},
},
},
},
"numerical_measure_field": { // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_NumericalMeasureField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: 1,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"column": columnSchema(true), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ColumnIdentifier.html
"field_id": stringLenBetweenSchema(attrRequired, 1, 512),
"aggregation_function": numericalAggregationFunctionSchema(false), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_NumericalAggregationFunction.html
"format_configuration": numberFormatConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_NumberFormatConfiguration.html
"numerical_measure_field": { // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_NumericalMeasureField.html
Type: schema.TypeList,
MinItems: 1,
MaxItems: 1,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"column": columnSchema(true), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ColumnIdentifier.html
"field_id": stringLenBetweenSchema(attrRequired, 1, 512),
"aggregation_function": numericalAggregationFunctionSchema(false), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_NumericalAggregationFunction.html
"format_configuration": numberFormatConfigurationSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_NumberFormatConfiguration.html
},
},
},
},
},
},
}
)
return s
}

func expandDimensionFields(tfList []interface{}) []awstypes.DimensionField {
Expand Down
2 changes: 1 addition & 1 deletion internal/service/quicksight/schema/visual_filled_map.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ func filledMapVisualSchema() *schema.Schema {
DiffSuppressFunc: verify.SuppressMissingOptionalConfigurationBlock,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"category_sort": fieldSortOptionsSchema(fieldSortOptionsMaxItems100), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_FieldSortOptions.html,
"category_sort": fieldSortOptionsSchema(), // https://docs.aws.amazon.com/quicksight/latest/APIReference/API_FieldSortOptions.html,
},
},
},
Expand Down
Loading

0 comments on commit 65192c4

Please sign in to comment.