summaryrefslogtreecommitdiff
path: root/db/migrate
diff options
context:
space:
mode:
authorJacob Schatz <jschatz@gitlab.com>2017-05-05 19:17:28 +0000
committerJacob Schatz <jschatz@gitlab.com>2017-05-05 19:17:28 +0000
commitaa874a1cd6fc94f6291a59fb414f3b09b3337c0d (patch)
tree1fbc687d9732273715115d0b945f329ce1d41a17 /db/migrate
parent0c5b7f8475926a5c97d42649dd12f4b4a32071d4 (diff)
parent933447e0da19f9d0be8574185500cabb5d7ab012 (diff)
downloadgitlab-ce-aa874a1cd6fc94f6291a59fb414f3b09b3337c0d.tar.gz
Merge branch 'mia_backort' into 'master'
Backport of Multiple Assignees feature See merge request !11089
Diffstat (limited to 'db/migrate')
-rw-r--r--db/migrate/20170320171632_create_issue_assignees_table.rb40
-rw-r--r--db/migrate/20170320173259_migrate_assignees.rb52
2 files changed, 92 insertions, 0 deletions
diff --git a/db/migrate/20170320171632_create_issue_assignees_table.rb b/db/migrate/20170320171632_create_issue_assignees_table.rb
new file mode 100644
index 00000000000..23b8da37b6d
--- /dev/null
+++ b/db/migrate/20170320171632_create_issue_assignees_table.rb
@@ -0,0 +1,40 @@
+# See http://doc.gitlab.com/ce/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class CreateIssueAssigneesTable < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ INDEX_NAME = 'index_issue_assignees_on_issue_id_and_user_id'
+
+ # Set this constant to true if this migration requires downtime.
+ DOWNTIME = false
+
+ # When a migration requires downtime you **must** uncomment the following
+ # constant and define a short and easy to understand explanation as to why the
+ # migration requires downtime.
+ # DOWNTIME_REASON = ''
+
+ # When using the methods "add_concurrent_index" or "add_column_with_default"
+ # you must disable the use of transactions as these methods can not run in an
+ # existing transaction. When using "add_concurrent_index" make sure that this
+ # method is the _only_ method called in the migration, any other changes
+ # should go in a separate migration. This ensures that upon failure _only_ the
+ # index creation fails and can be retried or reverted easily.
+ #
+ # To disable transactions uncomment the following line and remove these
+ # comments:
+ # disable_ddl_transaction!
+
+ def up
+ create_table :issue_assignees do |t|
+ t.references :user, foreign_key: { on_delete: :cascade }, index: true, null: false
+ t.references :issue, foreign_key: { on_delete: :cascade }, null: false
+ end
+
+ add_index :issue_assignees, [:issue_id, :user_id], unique: true, name: INDEX_NAME
+ end
+
+ def down
+ drop_table :issue_assignees
+ end
+end
diff --git a/db/migrate/20170320173259_migrate_assignees.rb b/db/migrate/20170320173259_migrate_assignees.rb
new file mode 100644
index 00000000000..ba8edbd7d32
--- /dev/null
+++ b/db/migrate/20170320173259_migrate_assignees.rb
@@ -0,0 +1,52 @@
+# See http://doc.gitlab.com/ce/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class MigrateAssignees < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ # Set this constant to true if this migration requires downtime.
+ DOWNTIME = false
+
+ # When a migration requires downtime you **must** uncomment the following
+ # constant and define a short and easy to understand explanation as to why the
+ # migration requires downtime.
+ # DOWNTIME_REASON = ''
+
+ # When using the methods "add_concurrent_index" or "add_column_with_default"
+ # you must disable the use of transactions as these methods can not run in an
+ # existing transaction. When using "add_concurrent_index" make sure that this
+ # method is the _only_ method called in the migration, any other changes
+ # should go in a separate migration. This ensures that upon failure _only_ the
+ # index creation fails and can be retried or reverted easily.
+ #
+ # To disable transactions uncomment the following line and remove these
+ # comments:
+ disable_ddl_transaction!
+
+ def up
+ # Optimisation: this accounts for most of the invalid assignee IDs on GitLab.com
+ update_column_in_batches(:issues, :assignee_id, nil) do |table, query|
+ query.where(table[:assignee_id].eq(0))
+ end
+
+ users = Arel::Table.new(:users)
+
+ update_column_in_batches(:issues, :assignee_id, nil) do |table, query|
+ query.where(table[:assignee_id].not_eq(nil)\
+ .and(
+ users.project("true").where(users[:id].eq(table[:assignee_id])).exists.not
+ ))
+ end
+
+ execute <<-EOF
+ INSERT INTO issue_assignees(issue_id, user_id)
+ SELECT id, assignee_id FROM issues WHERE assignee_id IS NOT NULL
+ EOF
+ end
+
+ def down
+ execute <<-EOF
+ DELETE FROM issue_assignees
+ EOF
+ end
+end