Sha256: 49180bdb0bfb2d4b89ede170a9eeb0c7a8199e282cec270d90a4849a853e2389

Contents?: true

Size: 1.74 KB

Versions: 6

Compression:

Stored size: 1.74 KB

Contents

# frozen_string_literal: true

module Mimi
  module DB
    module Dictate
      module SchemaDiff
        DEFAULT_OPTIONS = {
        }.freeze

        #
        # Compares two schema definitions
        #
        # @return [Hash] :columns, :indexes => :from, :to
        #
        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
      end # module SchemaDiff
    end # module Dictate
  end # module DB
end # module Mimi

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
mimi-db-0.3.5 lib/mimi/db/dictate/schema_diff.rb
mimi-db-0.3.4 lib/mimi/db/dictate/schema_diff.rb
mimi-db-0.3.3 lib/mimi/db/dictate/schema_diff.rb
mimi-db-0.3.2 lib/mimi/db/dictate/schema_diff.rb
mimi-db-0.3.1 lib/mimi/db/dictate/schema_diff.rb
mimi-db-0.3.0 lib/mimi/db/dictate/schema_diff.rb