frankfurter/lib/tasks/rollups.rake

43 lines
1.3 KiB
Ruby
Raw Normal View History

2026-05-21 01:38:14 -06:00
# frozen_string_literal: true
desc "Rebuild weekly and monthly rollups (all or one provider)"
task "rollups:rebuild", [:provider] do |_t, args|
require "bucket"
require "db"
require "log"
require "provider"
if args[:provider]
provider = Provider.detect { |p| p.key.casecmp(args[:provider]).zero? }
abort "Unknown provider: #{args[:provider]}" unless provider
rebuild_rollups(DB[:rates].where(provider: provider.key), provider.key)
else
rebuild_rollups(DB[:rates])
end
end
def rebuild_rollups(source, provider = nil)
scope = provider ? { provider: } : {}
label = provider || "all"
DB.transaction do
DB[:weekly_rates].where(scope).delete
DB[:monthly_rates].where(scope).delete
DB[:weekly_rates].insert(
[:bucket_date, :provider, :base, :quote, :rate],
source.select(Bucket.week, :provider, :base, :quote, Sequel.function(:avg, :rate))
.group(:provider, :base, :quote, Bucket.week),
)
DB[:monthly_rates].insert(
[:bucket_date, :provider, :base, :quote, :rate],
source.select(Bucket.month, :provider, :base, :quote, Sequel.function(:avg, :rate))
.group(:provider, :base, :quote, Bucket.month),
)
Log.info("#{label}: rebuilt #{DB[:weekly_rates].where(scope).count} weekly, " \
"#{DB[:monthly_rates].where(scope).count} monthly rollup rows")
end
end