Skip to content

Commit 0fff495

Browse files
committed
Generate Metrics Tables
1 parent 76ba0e7 commit 0fff495

File tree

3 files changed

+89
-0
lines changed

3 files changed

+89
-0
lines changed

lib/manifold/api/schema_manager.rb

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ def write_schemas(tables_directory)
1717
tables_directory.mkpath
1818
write_dimensions_schema(tables_directory)
1919
write_manifold_schema(tables_directory)
20+
write_metrics_schemas(tables_directory)
2021
end
2122

2223
# Returns the dimensions schema structure
@@ -52,6 +53,35 @@ def write_manifold_schema(tables_directory)
5253
manifold_path.write(manifold_schema_json.concat("\n"))
5354
end
5455

56+
def write_metrics_schemas(tables_directory)
57+
return unless @manifold_yaml["metrics"]
58+
59+
@manifold_yaml["metrics"].each do |group_name, group_config|
60+
metrics_table_path = tables_directory.join("metrics_#{group_name}.json")
61+
metrics_table_schema = metrics_table_schema(group_name, group_config)
62+
metrics_table_path.write(JSON.pretty_generate(metrics_table_schema).concat("\n"))
63+
@logger.info("Generated metrics table schema for '#{group_name}'.")
64+
end
65+
end
66+
67+
def metrics_table_schema(group_name, group_config)
68+
[
69+
{ "type" => "STRING", "name" => "id", "mode" => "REQUIRED" },
70+
{ "type" => "TIMESTAMP", "name" => "timestamp", "mode" => "REQUIRED" },
71+
{ "type" => "RECORD", "name" => "metrics", "mode" => "REQUIRED",
72+
"fields" => [metrics_group_field(group_name, group_config)] }
73+
]
74+
end
75+
76+
def metrics_group_field(group_name, group_config)
77+
{
78+
"name" => group_name,
79+
"type" => "RECORD",
80+
"mode" => "NULLABLE",
81+
"fields" => group_metrics_fields(group_config)
82+
}
83+
end
84+
5585
def dimensions_fields
5686
@dimensions_fields ||= @vectors.filter_map do |vector|
5787
@logger.info("Loading vector schema for '#{vector}'.")

spec/manifold/api/workspace_spec.rb

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,39 @@
178178
expect(schema_fields[:metrics]["mode"]).to eq("REQUIRED")
179179
end
180180

181+
it "generates a metrics table schema file for each metrics group" do
182+
expect(workspace.tables_directory.join("metrics_taps.json")).to be_file
183+
end
184+
185+
it "includes required id field in metrics table schema" do
186+
metrics_schema = parse_metrics_schema("taps")
187+
expect(metrics_schema).to include(
188+
{ "type" => "STRING", "name" => "id", "mode" => "REQUIRED" }
189+
)
190+
end
191+
192+
it "includes required timestamp field in metrics table schema" do
193+
metrics_schema = parse_metrics_schema("taps")
194+
expect(metrics_schema).to include(
195+
{ "type" => "TIMESTAMP", "name" => "timestamp", "mode" => "REQUIRED" }
196+
)
197+
end
198+
199+
it "includes required metrics field in metrics table schema" do
200+
metrics_schema = parse_metrics_schema("taps")
201+
metrics_field = metrics_schema.find { |f| f["name"] == "metrics" }
202+
expect(metrics_field["type"]).to eq("RECORD")
203+
expect(metrics_field["mode"]).to eq("REQUIRED")
204+
end
205+
206+
it "includes the correct metrics group in the metrics table schema" do
207+
metrics_schema = parse_metrics_schema("taps")
208+
metrics_field = metrics_schema.find { |f| f["name"] == "metrics" }
209+
group_field = metrics_field["fields"].first
210+
expect(group_field["name"]).to eq("taps")
211+
expect(group_field["type"]).to eq("RECORD")
212+
end
213+
181214
shared_examples "breakout metrics" do |breakout_name|
182215
let(:breakout) do
183216
schema_fields[:metrics]["fields"]
@@ -244,6 +277,10 @@ def get_dimension(field)
244277
dimensions = parse_dimensions_schema.find { |f| f["name"] == "dimensions" }
245278
dimensions["fields"].find { |f| f["name"] == field }
246279
end
280+
281+
def parse_metrics_schema(group_name)
282+
JSON.parse(workspace.tables_directory.join("metrics_#{group_name}.json").read)
283+
end
247284
end
248285

249286
context "when the manifold configuration is missing" do

spec/manifold/terraform/workspace_configuration_spec.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,18 @@
103103
expect(dimensions_routine_details[:sql_content]).to include(source_sql)
104104
end
105105
end
106+
107+
context "when metrics configuration is present" do
108+
before do
109+
config.manifold_config = manifold_config
110+
end
111+
112+
it "includes metrics table configurations" do
113+
expect(json["resource"]["google_bigquery_table"]).to include(
114+
"metrics_taps" => expected_metrics_table("taps")
115+
)
116+
end
117+
end
106118
end
107119

108120
context "when manifold configuration is present" do
@@ -208,6 +220,16 @@ def expected_routine_config
208220
}
209221
end
210222

223+
def expected_metrics_table(group_name)
224+
{
225+
"dataset_id" => name,
226+
"project" => "${var.project_id}",
227+
"table_id" => "Metrics_#{group_name}",
228+
"schema" => "${file(\"${path.module}/tables/metrics_#{group_name}.json\")}",
229+
"depends_on" => ["google_bigquery_dataset.#{name}"]
230+
}
231+
end
232+
211233
def setup_merge_vector_config
212234
Pathname.pwd.join("lib/routines").mkpath
213235
Pathname.pwd.join("lib/routines/select_pages.sql").write(source_sql)

0 commit comments

Comments
 (0)