From 3ebc5b2151e14990ca2e6287f95981e53cb57f5a Mon Sep 17 00:00:00 2001 From: claytongentry Date: Sat, 19 Apr 2025 14:11:31 -0400 Subject: [PATCH] Partition Configuration --- lib/manifold/templates/workspace_template.yml | 3 +++ .../terraform/workspace_configuration.rb | 16 ++++++++++++- .../terraform/table_config_builder_spec.rb | 24 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/lib/manifold/templates/workspace_template.yml b/lib/manifold/templates/workspace_template.yml index 1e959cc..0b25da6 100644 --- a/lib/manifold/templates/workspace_template.yml +++ b/lib/manifold/templates/workspace_template.yml @@ -12,6 +12,9 @@ timestamp: interval: HOUR field: timestamp +partitioning: + interval: HOUR + metrics: renders: conditions: diff --git a/lib/manifold/terraform/workspace_configuration.rb b/lib/manifold/terraform/workspace_configuration.rb index 87022fd..f1a772f 100644 --- a/lib/manifold/terraform/workspace_configuration.rb +++ b/lib/manifold/terraform/workspace_configuration.rb @@ -151,13 +151,27 @@ def metrics_table_config(group_name) def build_table_config(table_id, schema_path = nil) schema_path ||= "#{table_id.downcase}.json" - { + config = { "dataset_id" => @name, "project" => "${var.project_id}", "table_id" => table_id, "schema" => "${file(\"${path.module}/tables/#{schema_path}\")}", "depends_on" => ["google_bigquery_dataset.#{@name}"] } + + maybe_apply_partitioning(config, table_id) + end + + def maybe_apply_partitioning(config, table_id) + if @manifold_config&.dig("partitioning", "interval") && table_id != "Dimensions" + interval = @manifold_config["partitioning"]["interval"] + config["time_partitioning"] = { + "type" => interval, + "field" => "timestamp" + } + end + + config end end diff --git a/spec/manifold/terraform/table_config_builder_spec.rb b/spec/manifold/terraform/table_config_builder_spec.rb index ad7bdb5..eceee7d 100644 --- a/spec/manifold/terraform/table_config_builder_spec.rb +++ b/spec/manifold/terraform/table_config_builder_spec.rb @@ -22,6 +22,30 @@ it { is_expected.to include("depends_on" => ["google_bigquery_dataset.#{name}"]) } end + context "when partitioning config is provided" do + subject(:partitioned_configs) { builder_with_partition.build_table_configs } + + let(:partitioning_interval) { "DAY" } + let(:config) { { "partitioning" => { "interval" => partitioning_interval }, "metrics" => { "foo" => {} } } } + let(:builder_with_partition) { described_class.new(name, config) } + + it "does not add time partitioning to dimensions table" do + expect(partitioned_configs["dimensions"]).not_to have_key("time_partitioning") + end + + it "adds time partitioning to manifold table" do + expect(partitioned_configs["manifold"]).to include( + "time_partitioning" => { "type" => partitioning_interval, "field" => "timestamp" } + ) + end + + it "includes time partitioning for metric tables" do + expect(partitioned_configs["foometrics"]).to include( + "time_partitioning" => { "type" => partitioning_interval, "field" => "timestamp" } + ) + end + end + describe "manifold table configuration" do subject(:manifold_config) { configs["manifold"] }