Module: ActiveRecord::Materialized::ViewIncrementalClassMethods::ClassMethods
- Extended by:
- T::Sig
- 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
- #aggregate_analysis ⇒ Object
- #delta_maintaining? ⇒ Boolean
- #incremental_from(&block) ⇒ Object
- #incremental_key_columns ⇒ Object
- #incremental_keys(*columns) ⇒ Object
- #incremental_source_override? ⇒ Boolean
- #incrementally_maintainable? ⇒ Boolean
- #maintenance_key_columns ⇒ Object
- #record_summary_delta!(change) ⇒ Object
- #record_write_change!(change) ⇒ Object
- #record_write_delta!(delta) ⇒ Object
- #refresh_mode(mode) ⇒ Object
- #resolved_incremental_source ⇒ Object
- #resolved_refresh_mode ⇒ Object
- #view_class ⇒ Object
- #view_definition ⇒ Object
Instance Method Details
#aggregate_analysis ⇒ Object
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
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_columns ⇒ Object
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
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
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_columns ⇒ Object
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_source ⇒ Object
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_mode ⇒ Object
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_class ⇒ Object
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_definition ⇒ Object
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 |