class BeetleETL::TableDiff

Constants

IMPORTER_COLUMNS

Public Instance Methods

dependencies() click to toggle source
# File lib/beetle_etl/steps/table_diff.rb, line 9
def dependencies
  [MapRelations.step_name(table_name)].to_set
end
run() click to toggle source
# File lib/beetle_etl/steps/table_diff.rb, line 13
def run
  %w(create update delete reinstate keep).each do |transition|
    public_send(:"transition_#{transition}")
  end
end
transition_create() click to toggle source
# File lib/beetle_etl/steps/table_diff.rb, line 19
    def transition_create
      database.execute <<-SQL
        UPDATE "#{target_schema}"."#{stage_table_name}" stage_update
        SET
          transition = 'CREATE',
          id = NEXTVAL('#{target_schema}.#{table_name}_id_seq')
        FROM "#{target_schema}"."#{stage_table_name}" stage
        LEFT JOIN "#{target_schema}"."#{table_name}" target ON (
          target.external_id = stage.external_id
          AND target.external_source = '#{external_source}'
        )
        WHERE stage_update.external_id = stage.external_id
          AND target.external_id IS NULL
      SQL
    end
transition_delete() click to toggle source
# File lib/beetle_etl/steps/table_diff.rb, line 55
    def transition_delete
      database.execute <<-SQL
        INSERT INTO "#{target_schema}"."#{stage_table_name}"
          (transition, id)
        SELECT
          'DELETE',
          target.id
        FROM "#{target_schema}"."#{table_name}" target
        LEFT OUTER JOIN "#{target_schema}"."#{stage_table_name}" stage
          ON (stage.external_id = target.external_id)
        WHERE stage.external_id IS NULL
        AND target.external_source = '#{external_source}'
        AND target.deleted_at IS NULL
      SQL
    end
transition_keep() click to toggle source
# File lib/beetle_etl/steps/table_diff.rb, line 87
    def transition_keep
      database.execute <<-SQL
        UPDATE "#{target_schema}"."#{stage_table_name}" stage_update
        SET
          transition = 'KEEP',
          id = target.id
        FROM "#{target_schema}"."#{stage_table_name}" stage
        JOIN "#{target_schema}"."#{table_name}" target ON (
          target.external_id = stage.external_id
          AND target.external_source = '#{external_source}'
          AND target.deleted_at IS NULL
          AND
            (#{target_record_columns.join(', ')})
            IS NOT DISTINCT FROM
            (#{stage_record_columns.join(', ')})
        )
        WHERE stage_update.external_id = stage.external_id
      SQL
    end
transition_reinstate() click to toggle source
# File lib/beetle_etl/steps/table_diff.rb, line 71
    def transition_reinstate
      database.execute <<-SQL
        UPDATE "#{target_schema}"."#{stage_table_name}" stage_update
        SET
          transition = 'REINSTATE',
          id = target.id
        FROM "#{target_schema}"."#{stage_table_name}" stage
        JOIN "#{target_schema}"."#{table_name}" target ON (
          target.external_id = stage.external_id
          AND target.external_source = '#{external_source}'
          AND target.deleted_at IS NOT NULL
        )
        WHERE stage_update.external_id = stage.external_id
      SQL
    end
transition_update() click to toggle source
# File lib/beetle_etl/steps/table_diff.rb, line 35
    def transition_update
      database.execute <<-SQL
        UPDATE "#{target_schema}"."#{stage_table_name}" stage_update
        SET
          transition = 'UPDATE',
          id = target.id
        FROM "#{target_schema}"."#{stage_table_name}" stage
        JOIN "#{target_schema}"."#{table_name}" target ON (
          target.external_id = stage.external_id
          AND target.external_source = '#{external_source}'
          AND target.deleted_at IS NULL
          AND
            (#{target_record_columns.join(', ')})
            IS DISTINCT FROM
            (#{stage_record_columns.join(', ')})
        )
        WHERE stage_update.external_id = stage.external_id
      SQL
    end

Private Instance Methods

data_columns() click to toggle source
# File lib/beetle_etl/steps/table_diff.rb, line 117
def data_columns
  table_columns - ignored_columns
end
ignored_columns() click to toggle source
# File lib/beetle_etl/steps/table_diff.rb, line 125
def ignored_columns
  importer_columns + [:id] + table_columns.select do |column_name|
    column_name.to_s.index(/^external_.+_id$/)
  end
end
importer_columns() click to toggle source
# File lib/beetle_etl/steps/table_diff.rb, line 131
def importer_columns
  IMPORTER_COLUMNS
end
prefixed_columns(columns, prefix) click to toggle source
# File lib/beetle_etl/steps/table_diff.rb, line 135
def prefixed_columns(columns, prefix)
  columns.map { |column| %Q("#{prefix}"."#{column}") }
end
stage_record_columns() click to toggle source
# File lib/beetle_etl/steps/table_diff.rb, line 113
def stage_record_columns
  prefixed_columns(data_columns, 'stage')
end
table_columns() click to toggle source
# File lib/beetle_etl/steps/table_diff.rb, line 121
def table_columns
  @table_columns ||= database.column_names(target_schema, stage_table_name)
end
target_record_columns() click to toggle source
# File lib/beetle_etl/steps/table_diff.rb, line 109
def target_record_columns
  prefixed_columns(data_columns, 'target')
end