modules/udf/main.tf (110 lines of code) (raw):

/** * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ module "bq_find_in_set" { source = "terraform-google-modules/gcloud/google" version = "~> 3.0" enabled = var.add_udfs platform = "linux" additional_components = ["bq"] create_cmd_entrypoint = "bq" destroy_cmd_entrypoint = "bq" create_cmd_body = <<EOT --project_id ${var.project_id} query --use_legacy_sql=false "CREATE FUNCTION IF NOT EXISTS ${var.dataset_id}.find_in_set(str STRING, strList STRING) AS ( CASE WHEN STRPOS(str, ',') > 0 THEN 0 ELSE ( WITH list AS ( SELECT ROW_NUMBER() OVER() id, l FROM UNNEST(SPLIT(strList, ',')) l ) (SELECT id FROM list WHERE l = str) ) END );" EOT destroy_cmd_body = "--project_id ${var.project_id} query --use_legacy_sql=false \"DROP FUNCTION IF EXISTS ${var.dataset_id}.find_in_set\"" } module "bq_check_protocol" { source = "terraform-google-modules/gcloud/google" version = "~> 3.0" enabled = var.add_udfs platform = "linux" additional_components = ["bq"] create_cmd_entrypoint = "bq" destroy_cmd_entrypoint = "bq" create_cmd_body = <<EOT --project_id ${var.project_id} query --use_legacy_sql=false "CREATE FUNCTION IF NOT EXISTS ${var.dataset_id}.check_protocol(url STRING) AS ( CASE WHEN REGEXP_CONTAINS(url, '^[a-zA-Z]+://') THEN url ELSE CONCAT('http://', url) END );" EOT destroy_cmd_body = "--project_id ${var.project_id} query --use_legacy_sql=false \"DROP FUNCTION IF EXISTS ${var.dataset_id}.check_protocol\"" } module "bq_parse_url" { source = "terraform-google-modules/gcloud/google" version = "~> 3.0" enabled = module.bq_check_protocol.wait != "" && var.add_udfs platform = "linux" additional_components = ["bq"] create_cmd_entrypoint = "bq" destroy_cmd_entrypoint = "bq" create_cmd_body = <<EOT --project_id ${var.project_id} query --use_legacy_sql=false "CREATE FUNCTION IF NOT EXISTS ${var.dataset_id}.parse_url(url STRING, part STRING) AS ( CASE -- Return HOST part of the URL. WHEN part = 'HOST' THEN SPLIT(\`${var.project_id}\`.${var.dataset_id}.check_protocol(url), '/')[OFFSET(2)] WHEN part = 'REF' THEN IF(REGEXP_CONTAINS(url, '#'), SPLIT(\`${var.project_id}\`.${var.dataset_id}.check_protocol (url), '#')[OFFSET(1)], NULL) WHEN part = 'PROTOCOL' THEN RTRIM(REGEXP_EXTRACT(url, '^[a-zA-Z]+://'), '://') ELSE '' END );" EOT destroy_cmd_body = "--project_id ${var.project_id} query --use_legacy_sql=false \"DROP FUNCTION IF EXISTS ${var.dataset_id}.parse_url\"" } module "bq_csv_to_struct" { source = "terraform-google-modules/gcloud/google" version = "~> 3.0" enabled = var.add_udfs platform = "linux" additional_components = ["bq"] create_cmd_entrypoint = "bq" destroy_cmd_entrypoint = "bq" create_cmd_body = <<EOT --project_id ${var.project_id} query --use_legacy_sql=false "CREATE FUNCTION IF NOT EXISTS ${var.dataset_id}.csv_to_struct(strList STRING) AS ( CASE WHEN REGEXP_CONTAINS(strList, ',') OR REGEXP_CONTAINS(strList, ':') THEN (ARRAY( WITH list AS ( SELECT l FROM UNNEST(SPLIT(TRIM(strList), ',')) l WHERE REGEXP_CONTAINS(l, ':') ) SELECT AS STRUCT TRIM(SPLIT(l, ':')[OFFSET(0)]) AS key, TRIM(SPLIT(l, ':')[OFFSET(1)]) as value FROM list )) ELSE NULL END );" EOT destroy_cmd_body = "--project_id ${var.project_id} query --use_legacy_sql=false \"DROP FUNCTION IF EXISTS ${var.dataset_id}.csv_to_struct\"" }