Module: ActiveRecord::Materialized::Tasks

Defined in:
lib/activerecord/materialized/tasks.rb

Overview

Defines the materialized:* rake tasks (refresh_all, refresh_stale, rebuild, verify, warm_up).

Constant Summary collapse

DEFINITIONS =
{
  refresh_all: "Refresh all registered materialized views",
  refresh_stale: "Refresh stale materialized views",
  enqueue_refreshes: "Enqueue a background RefreshJob per stale view (fleet fan-out; run from one owner)",
  rebuild: "Rebuild (fully materialize) all registered materialized views",
  verify: "Verify materialized view cache tables match their source relations",
  audit: "Verify materialized view contents against their source relations (data drift)",
  reconcile: "Reconcile stale materialized views: verify contents and repair drift (scoped)",
  enqueue_reconciles: "Enqueue a background ReconcileJob per stale view (fleet fan-out; run from one owner)",
  warm_up: "Materialize each view's configured warm_up partitions"
}.freeze

Class Method Summary collapse

Class Method Details

.define!Object



19
20
21
22
23
24
25
26
27
28
29
# File 'lib/activerecord/materialized/tasks.rb', line 19

def self.define!
  application = ::Rake.application
  application.instance_eval do
    namespace :materialized do
      DEFINITIONS.each do |task_name, description|
        desc description
        task(task_name => :environment) { Tasks.run!(task_name) }
      end
    end
  end
end

.run!(task_name) ⇒ Object

Each task name maps by convention to its run_<task_name>! module method.



32
33
34
# File 'lib/activerecord/materialized/tasks.rb', line 32

def self.run!(task_name)
  public_send(:"run_#{task_name}!")
end

.run_audit!Object



57
58
59
60
# File 'lib/activerecord/materialized/tasks.rb', line 57

def self.run_audit!
  ActiveRecord::Materialized.verify_data!
  Rails.logger.debug { "Audited data for #{Registry.all.size} materialized view(s)." }
end

.run_enqueue_reconciles!Object



76
77
78
79
# File 'lib/activerecord/materialized/tasks.rb', line 76

def self.run_enqueue_reconciles!
  keys = ActiveRecord::Materialized.enqueue_stale_reconciles!
  Rails.logger.debug { "Enqueued #{keys.size} reconcile job(s) for stale view(s)." }
end

.run_enqueue_refreshes!Object



71
72
73
74
# File 'lib/activerecord/materialized/tasks.rb', line 71

def self.run_enqueue_refreshes!
  keys = ActiveRecord::Materialized.enqueue_stale_refreshes!
  Rails.logger.debug { "Enqueued #{keys.size} refresh job(s) for stale view(s)." }
end

.run_rebuild!Object



47
48
49
50
# File 'lib/activerecord/materialized/tasks.rb', line 47

def self.run_rebuild!
  Registry.rebuild_all!
  Rails.logger.debug { "Rebuilt #{Registry.all.size} materialized view(s)." }
end

.run_reconcile!Object



62
63
64
65
66
67
68
69
# File 'lib/activerecord/materialized/tasks.rb', line 62

def self.run_reconcile!
  results = ActiveRecord::Materialized.reconcile_stale!
  repaired = results.sum(&:repaired_partition_count)
  failed = results.count(&:failed?)
  Rails.logger.debug do
    "Reconciled #{results.size} stale view(s); repaired #{repaired} partition(s); #{failed} failed."
  end
end

.run_refresh_all!Object



36
37
38
39
# File 'lib/activerecord/materialized/tasks.rb', line 36

def self.run_refresh_all!
  Registry.refresh_all!
  Rails.logger.debug { "Refreshed #{Registry.all.size} materialized view(s)." }
end

.run_refresh_stale!Object



41
42
43
44
45
# File 'lib/activerecord/materialized/tasks.rb', line 41

def self.run_refresh_stale!
  stale = Registry.stale_views
  stale.each(&:refresh!)
  Rails.logger.debug { "Refreshed #{stale.size} stale materialized view(s)." }
end

.run_verify!Object



52
53
54
55
# File 'lib/activerecord/materialized/tasks.rb', line 52

def self.run_verify!
  ActiveRecord::Materialized.verify_schema!
  Rails.logger.debug { "Verified #{Registry.all.size} materialized view schema(s)." }
end

.run_warm_up!Object



81
82
83
84
# File 'lib/activerecord/materialized/tasks.rb', line 81

def self.run_warm_up!
  Registry.warm_up_all!
  Rails.logger.debug { "Warmed up #{Registry.all.size} materialized view(s)." }
end