class RailsRedshiftReplicator::Replicable
Attributes
options[R]
replication_field[R]
replication_type[R]
source_table[R]
table_name[R]
target_table[R]
tracking_deleted[R]
Public Class Methods
new(replication_type, options = {})
click to toggle source
@param replication_type
[String, Symbol] @param options [Hash] Replication options @option options [String, Symbol] :source_table name of the source table to replicate @option options [String, Symbol] :target_table name of the target table on redshift @option options [String, Symbol] :replication_field name of the replication field
# File lib/rails_redshift_replicator/replicable.rb, line 13 def initialize(replication_type, options = {}) @replication_type = replication_type @options = options @source_table = options[:source_table].to_s @target_table = (options[:target_table] || source_table).to_s replication_field = options[:replication_field] || exporter_class.replication_field @replication_field = replication_field && replication_field.to_s @tracking_deleted = delete_tracking_enabled? if tracking_deleted trigger.after(:delete) do "INSERT INTO rails_redshift_replicator_deleted_ids(source_table, object_id) VALUES('#{source_table}', OLD.id);" end end end
Public Instance Methods
analyze()
click to toggle source
# File lib/rails_redshift_replicator/replicable.rb, line 119 def analyze RailsRedshiftReplicator.analyze(target_table) end
delete_tracking_enabled?()
click to toggle source
# File lib/rails_redshift_replicator/replicable.rb, line 33 def delete_tracking_enabled? RailsRedshiftReplicator.enable_delete_tracking && (options[:enable_delete_tracking].blank? || options[:enable_delete_tracking]) && table_supports_tracking? end
deleter()
click to toggle source
# File lib/rails_redshift_replicator/replicable.rb, line 123 def deleter RailsRedshiftReplicator::Deleter.new(self) end
export()
click to toggle source
# File lib/rails_redshift_replicator/replicable.rb, line 65 def export @last_replication = nil if last_replication.blank? || (last_replication && last_replication.imported?) perform_export else if max_retries_reached? last_replication.cancel! perform_export else resume_replication end end end
exporter_class()
click to toggle source
# File lib/rails_redshift_replicator/replicable.rb, line 127 def exporter_class @exporter_class ||= begin "RailsRedshiftReplicator::Exporters::#{replication_type.to_s.classify}".constantize rescue raise StandardError.new I18n.t(:missing_replicator_type, scope: :rails_redshift_replicator) end end
import()
click to toggle source
# File lib/rails_redshift_replicator/replicable.rb, line 48 def import @last_replication = nil if last_replication.present? if last_replication.uploaded? perform_import elsif last_replication.imported? RailsRedshiftReplicator.logger.info I18n.t(:nothing_to_import, table_name: source_table, scope: :rails_redshift_replicator) elsif max_retries_reached? last_replication.cancel! else resume_replication end else RailsRedshiftReplicator.logger.info I18n.t(:nothing_to_import, table_name: source_table, scope: :rails_redshift_replicator) end end
importer_class()
click to toggle source
# File lib/rails_redshift_replicator/replicable.rb, line 135 def importer_class @importer_class ||= begin "RailsRedshiftReplicator::Importers::#{replication_type.to_s.classify}".constantize rescue raise StandardError.new I18n.t(:missing_replicator_type, scope: :rails_redshift_replicator) end end
last_replication()
click to toggle source
# File lib/rails_redshift_replicator/replicable.rb, line 96 def last_replication @last_replication ||= RailsRedshiftReplicator::Replication.from_table(source_table).last end
log_resuming(action)
click to toggle source
# File lib/rails_redshift_replicator/replicable.rb, line 111 def log_resuming(action) RailsRedshiftReplicator.logger.info I18n.t(:resuming_replication, table_name: source_table, action: action, state: last_replication.state, scope: :rails_redshift_replicator) end
max_retries_reached?()
click to toggle source
# File lib/rails_redshift_replicator/replicable.rb, line 87 def max_retries_reached? if RailsRedshiftReplicator.max_retries && (RailsRedshiftReplicator.max_retries == last_replication.retries) RailsRedshiftReplicator.logger.warn I18n.t(:max_retries_reached, id: last_replication, table_name: source_table, scope: :rails_redshift_replicator) return true else false end end
perform_export(replication = nil)
click to toggle source
# File lib/rails_redshift_replicator/replicable.rb, line 79 def perform_export(replication = nil) exporter_class.new(self, replication).export_and_upload end
perform_import()
click to toggle source
# File lib/rails_redshift_replicator/replicable.rb, line 83 def perform_import importer_class.new(last_replication).import end
replicate()
click to toggle source
# File lib/rails_redshift_replicator/replicable.rb, line 43 def replicate export import end
reset_last_record()
click to toggle source
# File lib/rails_redshift_replicator/replicable.rb, line 28 def reset_last_record last_imported_replication = RailsRedshiftReplicator::Replication.from_table(source_table).with_state(:imported).last last_imported_replication && last_imported_replication.update_attribute(:last_record, nil) end
resume_replication()
click to toggle source
# File lib/rails_redshift_replicator/replicable.rb, line 100 def resume_replication last_replication.increment! :retries, 1 if last_replication.state.in? %w(enqueued exporting exported uploading) log_resuming('export') perform_export(last_replication) else log_resuming('import') perform_import end end
table_supports_tracking?()
click to toggle source
# File lib/rails_redshift_replicator/replicable.rb, line 39 def table_supports_tracking? ActiveRecord::Base.connection.columns(source_table).map(&:name).include? "id" end
vacuum()
click to toggle source
# File lib/rails_redshift_replicator/replicable.rb, line 115 def vacuum RailsRedshiftReplicator.vacuum(target_table) end