42 lines
1.3 KiB
Ruby
42 lines
1.3 KiB
Ruby
# 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
|