class Purview::Loaders::Base

Attributes

opts[R]

Public Class Methods

new(opts={}) click to toggle source
# File lib/purview/loaders/base.rb, line 4
def initialize(opts={})
  @opts = opts
end

Public Instance Methods

load(connection, rows, window) click to toggle source
# File lib/purview/loaders/base.rb, line 8
def load(connection, rows, window)
  with_context_logging("`load` for: #{table.name}") do
    with_temporary_table(connection, rows, window) do |temporary_table_name|
      update_result = \
        connection.execute(table_update_sql(window, temporary_table_name))
      delete_result = \
        connection.execute(table_delete_sql(window, temporary_table_name))
      insert_result = \
        connection.execute(table_insert_sql(window, temporary_table_name))
      logger.debug(
        '%d row(s) inserted, %d row(s) updated and %d row(s) deleted in: %s' % [
          insert_result.rows_affected,
          update_result.rows_affected,
          delete_result.rows_affected,
          table.name,
        ]
      )
    end
  end
end

Private Instance Methods

count_column_name() click to toggle source
# File lib/purview/loaders/base.rb, line 37
def count_column_name
  'count'
end
create_temporary_table(connection) click to toggle source
# File lib/purview/loaders/base.rb, line 41
def create_temporary_table(connection)
  database.create_table(
    table,
    :connection => connection,
    :table => temporary_table_opts,
  )
end
database() click to toggle source
# File lib/purview/loaders/base.rb, line 49
def database
  table.database
end
dialect_type() click to toggle source
# File lib/purview/loaders/base.rb, line 53
def dialect_type
  raise %{All "#{Base}(s)" must override the "dialect_type" method}
end
id_in_sql(temporary_table_name) click to toggle source
# File lib/purview/loaders/base.rb, line 57
def id_in_sql(temporary_table_name)
  raise %{All "#{Base}(s)" must override the "id_in_sql" method}
end
in_window_sql(window) click to toggle source
# File lib/purview/loaders/base.rb, line 61
def in_window_sql(window)
  raise %{All "#{Base}(s)" must override the "in_window_sql" method}
end
load_temporary_table(connection, temporary_table_name, rows, window) click to toggle source
# File lib/purview/loaders/base.rb, line 65
def load_temporary_table(connection, temporary_table_name, rows, window)
  with_context_logging("`load_temporary_table` for: #{temporary_table_name}") do
    rows.each_slice(rows_per_slice) do |rows_slice|
      connection.execute(
        temporary_table_insert_sql(
          temporary_table_name,
          rows_slice
        )
      )
    end
  end
end
not_in_window_sql(window) click to toggle source
# File lib/purview/loaders/base.rb, line 78
def not_in_window_sql(window)
  raise %{All "#{Base}(s)" must override the "not_in_window_sql" method}
end
row_values(row) click to toggle source
# File lib/purview/loaders/base.rb, line 82
def row_values(row)
  table.column_names.map { |column_name| quoted(sanitized(row[column_name])) }.join(', ')
end
rows_per_slice() click to toggle source
# File lib/purview/loaders/base.rb, line 86
def rows_per_slice
  opts[:rows_per_slice] || 1000
end
table() click to toggle source
# File lib/purview/loaders/base.rb, line 90
def table
  opts[:table]
end
table_delete_sql(window, temporary_table_name) click to toggle source
# File lib/purview/loaders/base.rb, line 94
def table_delete_sql(window, temporary_table_name)
  raise %{All "#{Base}(s)" must override the "table_delete_sql" method}
end
table_insert_sql(window, temporary_table_name) click to toggle source
# File lib/purview/loaders/base.rb, line 98
def table_insert_sql(window, temporary_table_name)
  raise %{All "#{Base}(s)" must override the "table_insert_sql" method}
end
table_update_sql(window, temporary_table_name) click to toggle source
# File lib/purview/loaders/base.rb, line 102
def table_update_sql(window, temporary_table_name)
  raise %{All "#{Base}(s)" must override the "table_update_sql" method}
end
temporary_table_insert_sql(temporary_table_name, rows) click to toggle source
# File lib/purview/loaders/base.rb, line 106
def temporary_table_insert_sql(temporary_table_name, rows)
  raise %{All "#{Base}(s)" must override the "temporary_table_insert_sql" method}
end
temporary_table_opts() click to toggle source
# File lib/purview/loaders/base.rb, line 110
def temporary_table_opts
  {
    :create_indices => true,
    :name => table.temporary_name,
    :temporary => true,
  }
end
temporary_table_verify_sql(temporary_table_name, rows, window) click to toggle source
# File lib/purview/loaders/base.rb, line 118
def temporary_table_verify_sql(temporary_table_name, rows, window)
  raise %{All "#{Base}(s)" must override the "temporary_table_verify_sql" method}
end
verify_temporary_table(connection, temporary_table_name, rows, window) click to toggle source
# File lib/purview/loaders/base.rb, line 122
def verify_temporary_table(connection, temporary_table_name, rows, window)
  with_context_logging("`verify_temporary_table` for: #{temporary_table_name}") do
    rows_outside_window = connection.execute(
      temporary_table_verify_sql(
        temporary_table_name,
        rows,
        window
      )
    ).rows[0][count_column_name]
    raise Purview::Exceptions::RowsOutsideWindowForTable.new(table, rows_outside_window) \
      unless zero?(rows_outside_window)
  end
end
with_temporary_table(connection, rows, window) { |create_temporary_table(connection).tap do |temporary_table_name| load_temporary_table( connection, temporary_table_name, rows, window ) verify_temporary_table( connection, temporary_table_name, rows, window ) end| ... } click to toggle source
# File lib/purview/loaders/base.rb, line 136
def with_temporary_table(connection, rows, window)
  yield(
    create_temporary_table(connection).tap do |temporary_table_name|
      load_temporary_table(
        connection,
        temporary_table_name,
        rows,
        window
      )
      verify_temporary_table(
        connection,
        temporary_table_name,
        rows,
        window
      )
    end
  )
end