Skip to content

Commit

Permalink
Add postgres migrate_drop_column_with_index_spec
Browse files Browse the repository at this point in the history
  • Loading branch information
Genki Sugawara committed Apr 12, 2015
1 parent 8f36fed commit c51d064
Show file tree
Hide file tree
Showing 8 changed files with 385 additions and 3 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ Usage: ridgepole [options]
--enable-mysql-awesome
--mysql-awesome-unsigned-pk
--dump-without-table-options
--index-removed-drop-column
-r, --require LIBS
--log-file LOG_FILE
--verbose
Expand Down
1 change: 1 addition & 0 deletions bin/ridgepole
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ ARGV.options do |opt|
opt.on('', '--enable-mysql-awesome') { options[:enable_mysql_awesome] = true }
opt.on('', '--mysql-awesome-unsigned-pk') { options[:mysql_awesome_unsigned_pk] = true }
opt.on('', '--dump-without-table-options') { options[:dump_without_table_options] = true }
opt.on('', '--index-removed-drop-column') { options[:index_removed_drop_column] = true }
opt.on('-r' , '--require LIBS', Array) {|v| v.each {|i| require i } }
opt.on('' , '--log-file LOG_FILE') {|v| options[:log_file] = v }
opt.on('' , '--verbose') { Ridgepole::Logger.verbose = true }
Expand Down
5 changes: 5 additions & 0 deletions lib/ridgepole/client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@ def initialize(conn_spec, options = {})
@options = options

ActiveRecord::Base.establish_connection(conn_spec)

if not @options.has_key?(:index_removed_drop_column) and Ridgepole::DefaultsLimit.adapter == :postgresql
@options[:index_removed_drop_column] = true
end

Ridgepole::ExecuteExpander.expand_execute(ActiveRecord::Base.connection)
@dumper = Ridgepole::Dumper.new(@options)
@parser = Ridgepole::DSLParser.new(@options)
Expand Down
2 changes: 0 additions & 2 deletions lib/ridgepole/default_limit.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ def default_limit(column_type, options)
default_limit.zero? ? nil : default_limit
end

private

def adapter
ActiveRecord::Base.connection_config.fetch(:adapter).to_sym
rescue ActiveRecord::ConnectionNotEstablished
Expand Down
13 changes: 12 additions & 1 deletion lib/ridgepole/diff.rb
Original file line number Diff line number Diff line change
Expand Up @@ -134,8 +134,19 @@ def scan_definition_change(from, to, from_indices, table_delta)
definition_delta[:delete][column_name] = from_attrs

if from_indices
modified_indices = []

from_indices.each do |name, attrs|
attrs[:column_name].delete(column_name)
if attrs[:column_name].delete(column_name)
modified_indices << name
end
end

# In PostgreSQL, the index is deleted when the column is deleted
if @options[:index_removed_drop_column]
from_indices.reject! do |name, attrs|
modified_indices.include?(name)
end
end

from_indices.reject! do |name, attrs|
Expand Down
1 change: 1 addition & 0 deletions spec/mysql/cli/ridgepole_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
--enable-mysql-awesome
--mysql-awesome-unsigned-pk
--dump-without-table-options
--index-removed-drop-column
-r, --require LIBS
--log-file LOG_FILE
--verbose
Expand Down
185 changes: 185 additions & 0 deletions spec/postgresql/migrate/migrate_drop_column_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
if postgresql?
describe 'Ridgepole::Client#diff -> migrate' do
context 'when drop column' do
let(:actual_dsl) {
<<-RUBY
create_table "clubs", force: :cascade do |t|
t.string "name", limit: 255, default: "", null: false
end
add_index "clubs", ["name"], name: "idx_name", unique: true, using: :btree
create_table "departments", primary_key: "dept_no", force: :cascade do |t|
t.string "dept_name", limit: 40, null: false
end
add_index "departments", ["dept_name"], name: "idx_dept_name", unique: true, using: :btree
create_table "dept_emp", id: false, force: :cascade do |t|
t.integer "emp_no", null: false
t.string "dept_no", limit: 4, null: false
t.date "from_date", null: false
t.date "to_date", null: false
end
add_index "dept_emp", ["dept_no"], name: "idx_dept_emp_dept_no", using: :btree
add_index "dept_emp", ["emp_no"], name: "idx_dept_emp_emp_no", using: :btree
create_table "dept_manager", id: false, force: :cascade do |t|
t.string "dept_no", limit: 4, null: false
t.integer "emp_no", null: false
t.date "from_date", null: false
t.date "to_date", null: false
end
add_index "dept_manager", ["dept_no"], name: "idx_dept_manager_dept_no", using: :btree
add_index "dept_manager", ["emp_no"], name: "idx_dept_manager_emp_no", using: :btree
create_table "employee_clubs", force: :cascade do |t|
t.integer "emp_no", null: false
t.integer "club_id", null: false
end
add_index "employee_clubs", ["emp_no", "club_id"], name: "idx_employee_clubs_emp_no_club_id", using: :btree
create_table "employees", primary_key: "emp_no", force: :cascade do |t|
t.date "birth_date", null: false
t.string "first_name", limit: 14, null: false
t.string "last_name", limit: 16, null: false
t.date "hire_date", null: false
end
create_table "salaries", id: false, force: :cascade do |t|
t.integer "emp_no", null: false
t.integer "salary", null: false
t.date "from_date", null: false
t.date "to_date", null: false
end
add_index "salaries", ["emp_no"], name: "idx_salaries_emp_no", using: :btree
create_table "titles", id: false, force: :cascade do |t|
t.integer "emp_no", null: false
t.string "title", limit: 50, null: false
t.date "from_date", null: false
t.date "to_date"
end
add_index "titles", ["emp_no"], name: "idx_titles_emp_no", using: :btree
RUBY
}

let(:expected_dsl) {
<<-RUBY
create_table "clubs", force: :cascade do |t|
t.string "name", limit: 255, default: "", null: false
end
add_index "clubs", ["name"], name: "idx_name", unique: true, using: :btree
create_table "departments", primary_key: "dept_no", force: :cascade do |t|
t.string "dept_name", limit: 40, null: false
end
add_index "departments", ["dept_name"], name: "idx_dept_name", unique: true, using: :btree
create_table "dept_emp", id: false, force: :cascade do |t|
t.integer "emp_no", null: false
t.string "dept_no", limit: 4, null: false
end
add_index "dept_emp", ["dept_no"], name: "idx_dept_emp_dept_no", using: :btree
add_index "dept_emp", ["emp_no"], name: "idx_dept_emp_emp_no", using: :btree
create_table "dept_manager", id: false, force: :cascade do |t|
t.string "dept_no", limit: 4, null: false
t.integer "emp_no", null: false
end
add_index "dept_manager", ["dept_no"], name: "idx_dept_manager_dept_no", using: :btree
add_index "dept_manager", ["emp_no"], name: "idx_dept_manager_emp_no", using: :btree
create_table "employee_clubs", force: :cascade do |t|
t.integer "emp_no", null: false
t.integer "club_id", null: false
end
add_index "employee_clubs", ["emp_no", "club_id"], name: "idx_employee_clubs_emp_no_club_id", using: :btree
create_table "employees", primary_key: "emp_no", force: :cascade do |t|
t.date "birth_date", null: false
t.string "first_name", limit: 14, null: false
end
create_table "salaries", id: false, force: :cascade do |t|
t.integer "emp_no", null: false
t.integer "salary", null: false
t.date "from_date", null: false
t.date "to_date", null: false
end
add_index "salaries", ["emp_no"], name: "idx_salaries_emp_no", using: :btree
create_table "titles", id: false, force: :cascade do |t|
t.integer "emp_no", null: false
t.string "title", limit: 50, null: false
t.date "from_date", null: false
t.date "to_date"
end
add_index "titles", ["emp_no"], name: "idx_titles_emp_no", using: :btree
RUBY
}

before { subject.diff(actual_dsl).migrate }
subject { client }

it {
delta = subject.diff(expected_dsl)
expect(delta.differ?).to be_truthy
expect(subject.dump).to eq actual_dsl.strip_heredoc.strip
delta.migrate
expect(subject.dump).to eq expected_dsl.strip_heredoc.strip
}

it {
delta = Ridgepole::Client.diff(actual_dsl, expected_dsl, reverse: true)
expect(delta.differ?).to be_truthy
expect(delta.script).to eq <<-RUBY.strip_heredoc.strip
add_column("dept_emp", "from_date", :date, {:null=>false, :after=>"dept_no"})
add_column("dept_emp", "to_date", :date, {:null=>false, :after=>"from_date"})
add_column("dept_manager", "from_date", :date, {:null=>false, :after=>"emp_no"})
add_column("dept_manager", "to_date", :date, {:null=>false, :after=>"from_date"})
add_column("employees", "last_name", :string, {:limit=>16, :null=>false, :after=>"first_name"})
add_column("employees", "hire_date", :date, {:null=>false, :after=>"last_name"})
RUBY
}

it {
delta = client(:bulk_change => true).diff(expected_dsl)
expect(delta.differ?).to be_truthy
expect(subject.dump).to eq actual_dsl.strip_heredoc.strip
expect(delta.script).to eq <<-RUBY.strip_heredoc.strip
change_table("dept_emp", {:bulk => true}) do |t|
t.remove("from_date")
t.remove("to_date")
end
change_table("dept_manager", {:bulk => true}) do |t|
t.remove("from_date")
t.remove("to_date")
end
change_table("employees", {:bulk => true}) do |t|
t.remove("last_name")
t.remove("hire_date")
end
RUBY
delta.migrate
expect(subject.dump).to eq expected_dsl.strip_heredoc.strip
}
end
end
end
Loading

0 comments on commit c51d064

Please sign in to comment.