class GroongaSchema::Differ

Public Class Methods

new(from, to) click to toggle source

@param from [Schema] The original schema. @param to [Schema] The changed schema.

# File lib/groonga-schema/differ.rb, line 23
def initialize(from, to)
  @from = from
  @to = to
end

Public Instance Methods

diff() click to toggle source
# File lib/groonga-schema/differ.rb, line 28
def diff
  diff = Diff.new
  diff_plugins(diff)
  diff_tables(diff)
  diff_columns(diff)
  diff
end

Private Instance Methods

diff_changed_column(diff, to_column) click to toggle source
# File lib/groonga-schema/differ.rb, line 105
def diff_changed_column(diff, to_column)
  table_name = to_column.table_name
  name = to_column.name

  diff.changed_columns[table_name] ||= {}
  diff.changed_columns[table_name][name] = to_column

  to_column.related_columns.each do |related_column|
    related_table_name = related_column.table_name
    related_name = related_column.name
    diff.changed_columns[related_table_name] ||= {}
    diff.changed_columns[related_table_name][related_name] = related_column
  end
end
diff_changed_table(diff, to_table) click to toggle source
# File lib/groonga-schema/differ.rb, line 63
def diff_changed_table(diff, to_table)
  diff.changed_tables[to_table.name] = to_table

  to_table.related_tables.each do |table|
    diff.changed_tables[table.name] = table
  end

  to_table.related_columns.each do |column|
    table_name = column.table_name
    diff.changed_columns[table_name] ||= {}
    diff.changed_columns[table_name][column.name] = column
  end
end
diff_columns(diff) click to toggle source
# File lib/groonga-schema/differ.rb, line 77
def diff_columns(diff)
  @from.columns.each do |table_name, from_columns|
    to_columns = @to.columns[table_name]
    next if to_columns.nil?

    from_columns.each do |name, from_column|
      to_column = to_columns[name]
      if to_column.nil?
        diff.removed_columns[table_name] ||= {}
        diff.removed_columns[table_name][name] = from_column
      elsif from_column != to_column
        diff_changed_column(diff, to_column)
      end
    end
  end

  @to.columns.each do |table_name, to_columns|
    from_columns = @from.columns[table_name] || {}
    to_columns.each do |name, to_column|
      from_column = from_columns[name]
      if from_column.nil?
        diff.added_columns[table_name] ||= {}
        diff.added_columns[table_name][name] = to_column
      end
    end
  end
end
diff_plugins(diff) click to toggle source
# File lib/groonga-schema/differ.rb, line 37
def diff_plugins(diff)
  diff.removed_plugins.concat(@from.plugins - @to.plugins)
  diff.added_plugins.concat(@to.plugins - @from.plugins)
end
diff_tables(diff) click to toggle source
# File lib/groonga-schema/differ.rb, line 42
def diff_tables(diff)
  from_tables = @from.tables
  to_tables = @to.tables

  from_tables.each do |name, from_table|
    to_table = to_tables[name]
    if to_table.nil?
      diff.removed_tables[from_table.name] = from_table
    elsif from_table != to_table
      diff_changed_table(diff, to_table)
    end
  end

  to_tables.each do |name, to_table|
    from_table = from_tables[name]
    if from_table.nil?
      diff.added_tables[name] = to_table
    end
  end
end