frankfurter/db/migrate/017_create_rollup_tables.rb

54 lines
1.7 KiB
Ruby
Raw Permalink Normal View History

2026-05-21 01:38:14 -06:00
# frozen_string_literal: true
Sequel.migration do
up do
create_table(:weekly_rates) do
column :bucket_date, :date, null: false
String :provider, null: false
String :base, null: false
String :quote, null: false
Float :rate, null: false
primary_key [:provider, :bucket_date, :base, :quote]
index [:bucket_date, :quote]
end
create_table(:monthly_rates) do
column :bucket_date, :date, null: false
String :provider, null: false
String :base, null: false
String :quote, null: false
Float :rate, null: false
primary_key [:provider, :bucket_date, :base, :quote]
index [:bucket_date, :quote]
end
# Backfill weekly_rates
week_num = Sequel.cast(Sequel.function(:strftime, "%W", :date), Integer)
day_offset = Sequel.join(["+", week_num * 7, " days"])
year_start = Sequel.function(:strftime, "%Y-01-01", :date)
week_bucket = Sequel.function(:date, Sequel.function(:strftime, "%Y-%m-%d", year_start, day_offset))
self[:weekly_rates].insert(
[:bucket_date, :provider, :base, :quote, :rate],
self[:rates].select(week_bucket, :provider, :base, :quote, Sequel.function(:avg, :rate))
.group(:provider, :base, :quote, week_bucket),
)
# Backfill monthly_rates
month_bucket = Sequel.function(:strftime, "%Y-%m-01", :date)
self[:monthly_rates].insert(
[:bucket_date, :provider, :base, :quote, :rate],
self[:rates].select(month_bucket, :provider, :base, :quote, Sequel.function(:avg, :rate))
.group(:provider, :base, :quote, month_bucket),
)
end
down do
drop_table(:weekly_rates)
drop_table(:monthly_rates)
end
end