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