module Mimi::DB::Dictate::SchemaDiff

Constants

DEFAULT_OPTIONS

Public Class Methods

diff(from, to, opts = {}) click to toggle source

Compares two schema definitions

@return [Hash] :columns, :indexes => :from, :to

# File lib/mimi/db/dictate/schema_diff.rb, line 15
def self.diff(from, to, opts = {})
  _options = DEFAULT_OPTIONS.merge(opts)
  result = { table_name: from.table_name, columns: {}, indexes: {} }
  all_column_names = (from.columns.values.map(&:name) + to.columns.values.map(&:name)).uniq
  all_column_names.each do |c|
    if from.columns[c] && to.columns[c].nil?
      result[:columns][c] = { from: from.columns[c], to: nil }
    elsif from.columns[c] && to.columns[c] && !(from.columns[c] == to.columns[c])
      result[:columns][c] = { from: from.columns[c], to: to.columns[c] }
    elsif from.columns[c].nil? && to.columns[c]
      result[:columns][c] = { from: nil, to: to.columns[c] }
    end
  end
  from_indexes = from.indexes.map { |i| [i.columns, i] }.to_h
  to_indexes   = to.indexes.map { |i| [i.columns, i] }.to_h
  all_index_cols = (from_indexes.keys + to_indexes.keys).uniq
  all_index_cols.each do |cc|
    if from_indexes[cc] && to_indexes[cc].nil?
      result[:indexes][cc] = { from: from_indexes[cc], to: nil }
    elsif from_indexes[cc] && to_indexes[cc]
      # index diff is not supported
    elsif from_indexes[cc].nil? && to_indexes[cc]
      result[:indexes][cc] = { from: nil, to: to_indexes[cc]}
    end
  end

  result
end