Module: ActiveRecord::Materialized::ViewIncrementalClassMethods::ClassMethods

Extended by:
T::Sig
Included in:
ActiveRecord::Materialized::ViewConfigurationClassMethods::ClassMethods
Defined in:
lib/activerecord/materialized/view_incremental_class_methods.rb

Overview

The incremental-maintenance DSL methods available on a ActiveRecord::Materialized::View subclass.

Instance Method Summary collapse

Instance Method Details

#aggregate_analysisObject



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

def aggregate_analysis
  AggregateAnalysis.new(view_class.resolved_source)
end

#delta_maintaining?Boolean

Returns:

  • (Boolean)


78
79
80
# File 'lib/activerecord/materialized/view_incremental_class_methods.rb', line 78

def delta_maintaining?
  resolved_refresh_mode != :full && view_class.materialized? && aggregate_analysis.delta_maintainable?
end

#incremental_from(&block) ⇒ Object



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

def incremental_from(&block)
  @incremental_source_definition = T.let(block, T.nilable(SourceDefinition))
end

#incremental_key_columnsObject



116
117
118
119
120
121
122
# File 'lib/activerecord/materialized/view_incremental_class_methods.rb', line 116

def incremental_key_columns
  columns = T.let(
    T.unsafe(self).instance_variable_get(:@incremental_key_columns),
    T.nilable(T::Array[String])
  )
  columns.nil? ? [] : columns
end

#incremental_keys(*columns) ⇒ Object



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

def incremental_keys(*columns)
  @incremental_key_columns = T.let(columns.map(&:to_s), T.nilable(T::Array[String]))
end

#incremental_source_override?Boolean

Returns:

  • (Boolean)


83
84
85
# File 'lib/activerecord/materialized/view_incremental_class_methods.rb', line 83

def incremental_source_override?
  !@incremental_source_definition.nil?
end

#incrementally_maintainable?Boolean

Returns:

  • (Boolean)


66
67
68
# File 'lib/activerecord/materialized/view_incremental_class_methods.rb', line 66

def incrementally_maintainable?
  resolved_refresh_mode != :full && view_definition.incrementally_maintainable?
end

#maintenance_key_columnsObject



59
60
61
62
63
# File 'lib/activerecord/materialized/view_incremental_class_methods.rb', line 59

def maintenance_key_columns
  return incremental_key_columns if incremental_key_columns.any?

  view_definition.group_key_columns
end

#record_summary_delta!(change) ⇒ Object



103
104
105
106
# File 'lib/activerecord/materialized/view_incremental_class_methods.rb', line 103

def record_summary_delta!(change)
  summary = SummaryDeltaBuilder.new(change, aggregate_analysis, maintenance_key_columns).build
  MaintenanceStore.new(view_class).merge!(summary) unless summary.empty?
end

#record_write_change!(change) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/activerecord/materialized/view_incremental_class_methods.rb', line 88

def record_write_change!(change)
  return record_summary_delta!(change) if delta_maintaining?
  return unless incrementally_maintainable?

  delta = MaintenanceDeltaBuilder.new(change, maintenance_key_columns).build
  record_write_delta!(delta)

  # On a cold view the written partitions are no longer current; drop them
  # from the fresh set until re-maintained.
  return if view_class.materialized? || delta.full_partition?

  PartitionState.new(view_class).mark_stale!(delta.key_tuples)
end

#record_write_delta!(delta) ⇒ Object



109
110
111
112
113
# File 'lib/activerecord/materialized/view_incremental_class_methods.rb', line 109

def record_write_delta!(delta)
  return unless incrementally_maintainable?

  MaintenanceStore.new(view_class).merge!(delta)
end

#refresh_mode(mode) ⇒ Object



27
28
29
# File 'lib/activerecord/materialized/view_incremental_class_methods.rb', line 27

def refresh_mode(mode)
  T.unsafe(self).instance_variable_set(:@refresh_mode, mode.to_sym)
end

#resolved_incremental_sourceObject



125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/activerecord/materialized/view_incremental_class_methods.rb', line 125

def resolved_incremental_source
  unless incremental_source_override?
    Kernel.raise ArgumentError,
                 "incremental_from override is not configured for #{view_class.name || view_class.view_key}"
  end

  view_class.send(
    :resolve_source_definition,
    @incremental_source_definition,
    "incremental_from is required for #{view_class.name || view_class.view_key}"
  )
end

#resolved_refresh_modeObject



42
43
44
45
46
47
48
# File 'lib/activerecord/materialized/view_incremental_class_methods.rb', line 42

def resolved_refresh_mode
  mode = T.let(
    T.unsafe(self).instance_variable_get(:@refresh_mode),
    T.nilable(RefreshMode)
  )
  mode || :incremental
end

#view_classObject



22
23
24
# File 'lib/activerecord/materialized/view_incremental_class_methods.rb', line 22

def view_class
  T.cast(self, T.class_of(View))
end

#view_definitionObject



51
52
53
54
55
56
# File 'lib/activerecord/materialized/view_incremental_class_methods.rb', line 51

def view_definition
  ViewDefinition.new(
    view_class.resolved_source,
    explicit_group_keys: incremental_key_columns.presence
  )
end