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