class TableSync::Receiving::Model::Sequel

Attributes

raw_model[R]
schema[R]
table[R]

Public Class Methods

new(table_name) click to toggle source
# File lib/table_sync/receiving/model/sequel.rb, line 7
def initialize(table_name)
  @raw_model = Class.new(::Sequel::Model(table_name)).tap(&:unrestrict_primary_key)

  model_naming = ::TableSync::NamingResolver::Sequel.new(
    table_name: table_name,
    db: @raw_model.db,
  )

  @table = model_naming.table.to_sym
  @schema = model_naming.schema.to_sym
end

Public Instance Methods

after_commit(&block) click to toggle source
# File lib/table_sync/receiving/model/sequel.rb, line 59
def after_commit(&block)
  db.after_commit(&block)
end
columns() click to toggle source
# File lib/table_sync/receiving/model/sequel.rb, line 19
def columns
  dataset.columns
end
destroy(data:, target_keys:, version_key:) click to toggle source
# File lib/table_sync/receiving/model/sequel.rb, line 43
def destroy(data:, target_keys:, version_key:)
  sanitized_data = data.map { |attr| attr.select { |key, _value| target_keys.include?(key) } }
  sanitized_data = type_cast(sanitized_data)
  result = dataset.returning.where(::Sequel.|(*sanitized_data)).delete

  if result.size > data.size
    raise TableSync::DestroyError.new(data: data, target_keys: target_keys, result: result)
  end

  result
end
primary_keys() click to toggle source
# File lib/table_sync/receiving/model/sequel.rb, line 23
def primary_keys
  [raw_model.primary_key].flatten
end
transaction(&block) click to toggle source
# File lib/table_sync/receiving/model/sequel.rb, line 55
def transaction(&block)
  db.transaction(&block)
end
upsert(data:, target_keys:, version_key:, default_values:) click to toggle source
# File lib/table_sync/receiving/model/sequel.rb, line 27
def upsert(data:, target_keys:, version_key:, default_values:)
  qualified_version = ::Sequel.qualify(raw_model.table_name, version_key)
  version_condition = ::Sequel.function(:coalesce, qualified_version, 0) <
                      ::Sequel.qualify(:excluded, version_key)

  upd_spec = update_spec(data.first.keys - target_keys)
  data.map! { |d| default_values.merge(d) }

  insert_data = type_cast(data)

  dataset
    .returning
    .insert_conflict(target: target_keys, update: upd_spec, update_where: version_condition)
    .multi_insert(insert_data)
end

Private Instance Methods

dataset() click to toggle source
# File lib/table_sync/receiving/model/sequel.rb, line 67
def dataset
  raw_model.dataset
end
db() click to toggle source
# File lib/table_sync/receiving/model/sequel.rb, line 71
def db
  dataset.db
end
type_cast(data) click to toggle source
# File lib/table_sync/receiving/model/sequel.rb, line 75
def type_cast(data)
  data.map { |d| raw_model.new(d).values.keep_if { |k| d.key?(k) } }
end
update_spec(keys) click to toggle source
# File lib/table_sync/receiving/model/sequel.rb, line 79
def update_spec(keys)
  keys.map { |key| [key, ::Sequel[:excluded][key]] }.to_h
end