Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Jérome Perrin
gitlab-ce
Commits
793b9a5c
Commit
793b9a5c
authored
May 16, 2017
by
Valery Sizov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Improve migration for Multipple issue assignee feature
parent
43befaf2
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
206 additions
and
14 deletions
+206
-14
app/services/members/authorized_destroy_service.rb
app/services/members/authorized_destroy_service.rb
+2
-2
db/migrate/20170320173259_migrate_assignees.rb
db/migrate/20170320173259_migrate_assignees.rb
+0
-8
db/migrate/20170516153305_migrate_assignee_to_separate_table.rb
...rate/20170516153305_migrate_assignee_to_separate_table.rb
+83
-0
db/migrate/20170516183131_add_indices_to_issue_assignees.rb
db/migrate/20170516183131_add_indices_to_issue_assignees.rb
+41
-0
db/post_migrate/20170516165238_cleanup_trigger_for_issues.rb
db/post_migrate/20170516165238_cleanup_trigger_for_issues.rb
+39
-0
db/post_migrate/20170516181025_add_constraints_to_issue_assignees_table.rb
...0170516181025_add_constraints_to_issue_assignees_table.rb
+37
-0
db/schema.rb
db/schema.rb
+4
-4
No files found.
app/services/members/authorized_destroy_service.rb
View file @
793b9a5c
...
@@ -29,7 +29,7 @@ module Members
...
@@ -29,7 +29,7 @@ module Members
issue_ids
=
IssuesFinder
.
new
(
user
,
group_id:
member
.
source_id
,
assignee_id:
member
.
user_id
).
issue_ids
=
IssuesFinder
.
new
(
user
,
group_id:
member
.
source_id
,
assignee_id:
member
.
user_id
).
execute
.
pluck
(
:id
)
execute
.
pluck
(
:id
)
IssueAssignee
.
de
stroy
_all
(
issue_id:
issue_ids
,
user_id:
member
.
user_id
)
IssueAssignee
.
de
lete
_all
(
issue_id:
issue_ids
,
user_id:
member
.
user_id
)
MergeRequestsFinder
.
new
(
user
,
group_id:
member
.
source_id
,
assignee_id:
member
.
user_id
).
MergeRequestsFinder
.
new
(
user
,
group_id:
member
.
source_id
,
assignee_id:
member
.
user_id
).
execute
.
execute
.
...
@@ -37,7 +37,7 @@ module Members
...
@@ -37,7 +37,7 @@ module Members
else
else
project
=
member
.
source
project
=
member
.
source
IssueAssignee
.
de
stroy
_all
(
IssueAssignee
.
de
lete
_all
(
user_id:
member
.
user_id
,
user_id:
member
.
user_id
,
issue_id:
project
.
issues
.
opened
.
assigned_to
(
member
.
user
).
select
(
:id
)
issue_id:
project
.
issues
.
opened
.
assigned_to
(
member
.
user
).
select
(
:id
)
)
)
...
...
db/migrate/20170320173259_migrate_assignees.rb
View file @
793b9a5c
...
@@ -37,16 +37,8 @@ class MigrateAssignees < ActiveRecord::Migration
...
@@ -37,16 +37,8 @@ class MigrateAssignees < ActiveRecord::Migration
users
.
project
(
"true"
).
where
(
users
[
:id
].
eq
(
table
[
:assignee_id
])).
exists
.
not
users
.
project
(
"true"
).
where
(
users
[
:id
].
eq
(
table
[
:assignee_id
])).
exists
.
not
))
))
end
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
end
def
down
def
down
execute
<<-
EOF
DELETE FROM issue_assignees
EOF
end
end
end
end
db/migrate/20170516153305_migrate_assignee_to_separate_table.rb
0 → 100644
View file @
793b9a5c
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
class
MigrateAssigneeToSeparateTable
<
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", "remove_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" or "remove_concurrent_index" methods make sure
# that either of them 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 or removing fails
# and can be retried or reverted easily.
#
# To disable transactions uncomment the following line and remove these
# comments:
# disable_ddl_transaction!
def
up
drop_table
(
:issue_assignees
)
if
table_exists?
(
:issue_assignees
)
if
Gitlab
::
Database
.
mysql?
execute
<<-
EOF
CREATE TABLE issue_assignees AS
SELECT assignee_id AS user_id, id AS issue_id FROM issues WHERE assignee_id IS NOT NULL
EOF
else
ActiveRecord
::
Base
.
transaction
do
execute
(
'LOCK TABLE issues IN EXCLUSIVE MODE'
)
execute
<<-
EOF
CREATE TABLE issue_assignees AS
SELECT assignee_id AS user_id, id AS issue_id FROM issues WHERE assignee_id IS NOT NULL
EOF
execute
<<-
EOF
CREATE OR REPLACE FUNCTION replicate_assignee_id()
RETURNS trigger AS
$BODY$
BEGIN
if OLD.assignee_id IS NOT NULL THEN
DELETE FROM issue_assignees WHERE issue_id = OLD.id;
END IF;
if NEW.assignee_id IS NOT NULL THEN
INSERT INTO issue_assignees (user_id, issue_id) VALUES (NEW.assignee_id, NEW.id);
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql'
VOLATILE;
CREATE TRIGGER replicate_assignee_id
BEFORE INSERT OR UPDATE OF assignee_id
ON issues
FOR EACH ROW EXECUTE PROCEDURE replicate_assignee_id();
EOF
end
end
end
def
down
drop_table
(
:issue_assignees
)
if
table_exists?
(
:issue_assignees
)
if
Gitlab
::
Database
.
postgresql?
execute
<<-
EOF
DROP TRIGGER IF EXISTS replicate_assignee_id ON issues;
DROP FUNCTION IF EXISTS replicate_assignee_id();
EOF
end
end
end
db/migrate/20170516183131_add_indices_to_issue_assignees.rb
0 → 100644
View file @
793b9a5c
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
class
AddIndicesToIssueAssignees
<
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", "remove_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" or "remove_concurrent_index" methods make sure
# that either of them 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 or removing fails
# and can be retried or reverted easily.
#
# To disable transactions uncomment the following line and remove these
# comments:
disable_ddl_transaction!
def
up
add_concurrent_index
:issue_assignees
,
[
:issue_id
,
:user_id
],
unique:
true
,
name:
'index_issue_assignees_on_issue_id_and_user_id'
add_concurrent_index
:issue_assignees
,
:user_id
,
name:
'index_issue_assignees_on_user_id'
add_concurrent_foreign_key
:issue_assignees
,
:users
,
column: :user_id
,
on_delete: :cascade
add_concurrent_foreign_key
:issue_assignees
,
:issues
,
column: :issue_id
,
on_delete: :cascade
end
def
down
remove_foreign_key
:issue_assignees
,
column: :user_id
remove_foreign_key
:issue_assignees
,
column: :issue_id
remove_concurrent_index
:issue_assignees
,
[
:issue_id
,
:user_id
]
if
index_exists?
(
:issue_assignees
,
[
:issue_id
,
:user_id
])
remove_concurrent_index
:issue_assignees
,
:user_id
if
index_exists?
(
:issue_assignees
,
:user_id
)
end
end
db/post_migrate/20170516165238_cleanup_trigger_for_issues.rb
0 → 100644
View file @
793b9a5c
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
class
CleanupTriggerForIssues
<
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", "remove_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" or "remove_concurrent_index" methods make sure
# that either of them 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 or removing fails
# and can be retried or reverted easily.
#
# To disable transactions uncomment the following line and remove these
# comments:
disable_ddl_transaction!
def
up
if
Gitlab
::
Database
.
postgresql?
execute
<<-
EOF
DROP TRIGGER IF EXISTS replicate_assignee_id ON issues;
DROP FUNCTION IF EXISTS replicate_assignee_id();
EOF
end
end
def
down
end
end
db/
migrate/20170320171632_create
_issue_assignees_table.rb
→
db/
post_migrate/20170516181025_add_constraints_to
_issue_assignees_table.rb
View file @
793b9a5c
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
# for more information on how to write migrations for GitLab.
class
Create
IssueAssigneesTable
<
ActiveRecord
::
Migration
class
AddConstraintsTo
IssueAssigneesTable
<
ActiveRecord
::
Migration
include
Gitlab
::
Database
::
MigrationHelpers
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.
# Set this constant to true if this migration requires downtime.
DOWNTIME
=
false
DOWNTIME
=
false
...
@@ -14,27 +12,26 @@ class CreateIssueAssigneesTable < ActiveRecord::Migration
...
@@ -14,27 +12,26 @@ class CreateIssueAssigneesTable < ActiveRecord::Migration
# migration requires downtime.
# migration requires downtime.
# DOWNTIME_REASON = ''
# DOWNTIME_REASON = ''
# When using the methods "add_concurrent_index" or "add_column_with_default"
# When using the methods "add_concurrent_index", "remove_concurrent_index" or
# you must disable the use of transactions as these methods can not run in an
# "add_column_with_default" you must disable the use of transactions
# existing transaction. When using "add_concurrent_index" make sure that this
# as these methods can not run in an existing transaction.
# method is the _only_ method called in the migration, any other changes
# When using "add_concurrent_index" or "remove_concurrent_index" methods make sure
# should go in a separate migration. This ensures that upon failure _only_ the
# that either of them is the _only_ method called in the migration,
# index creation fails and can be retried or reverted easily.
# any other changes should go in a separate migration.
# This ensures that upon failure _only_ the index creation or removing fails
# and can be retried or reverted easily.
#
#
# To disable transactions uncomment the following line and remove these
# To disable transactions uncomment the following line and remove these
# comments:
# comments:
# disable_ddl_transaction!
# disable_ddl_transaction!
def
up
def
up
create_table
:issue_assignees
do
|
t
|
change_column
:issue_assignees
,
:issue_id
,
:integer
,
null:
false
t
.
references
:user
,
foreign_key:
{
on_delete: :cascade
},
index:
true
,
null:
false
change_column
:issue_assignees
,
:user_id
,
:integer
,
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
end
def
down
def
down
drop_table
:issue_assignees
change_column
:issue_assignees
,
:issue_id
,
:integer
change_column
:issue_assignees
,
:user_id
,
:integer
end
end
end
end
db/schema.rb
View file @
793b9a5c
...
@@ -11,7 +11,7 @@
...
@@ -11,7 +11,7 @@
#
#
# It's strongly recommended that you check this file into your version control system.
# It's strongly recommended that you check this file into your version control system.
ActiveRecord
::
Schema
.
define
(
version:
2017051
1101000
)
do
ActiveRecord
::
Schema
.
define
(
version:
2017051
6183131
)
do
# These are extensions that must be enabled in order to support this database
# These are extensions that must be enabled in order to support this database
enable_extension
"plpgsql"
enable_extension
"plpgsql"
...
@@ -459,7 +459,7 @@ ActiveRecord::Schema.define(version: 20170511101000) do
...
@@ -459,7 +459,7 @@ ActiveRecord::Schema.define(version: 20170511101000) do
add_index
"identities"
,
[
"user_id"
],
name:
"index_identities_on_user_id"
,
using: :btree
add_index
"identities"
,
[
"user_id"
],
name:
"index_identities_on_user_id"
,
using: :btree
create_table
"issue_assignees"
,
force: :cascade
do
|
t
|
create_table
"issue_assignees"
,
id:
false
,
force: :cascade
do
|
t
|
t
.
integer
"user_id"
,
null:
false
t
.
integer
"user_id"
,
null:
false
t
.
integer
"issue_id"
,
null:
false
t
.
integer
"issue_id"
,
null:
false
end
end
...
@@ -1423,8 +1423,8 @@ ActiveRecord::Schema.define(version: 20170511101000) do
...
@@ -1423,8 +1423,8 @@ ActiveRecord::Schema.define(version: 20170511101000) do
add_foreign_key
"ci_triggers"
,
"users"
,
column:
"owner_id"
,
name:
"fk_e8e10d1964"
,
on_delete: :cascade
add_foreign_key
"ci_triggers"
,
"users"
,
column:
"owner_id"
,
name:
"fk_e8e10d1964"
,
on_delete: :cascade
add_foreign_key
"ci_variables"
,
"projects"
,
name:
"fk_ada5eb64b3"
,
on_delete: :cascade
add_foreign_key
"ci_variables"
,
"projects"
,
name:
"fk_ada5eb64b3"
,
on_delete: :cascade
add_foreign_key
"container_repositories"
,
"projects"
add_foreign_key
"container_repositories"
,
"projects"
add_foreign_key
"issue_assignees"
,
"issues"
,
on_delete: :cascade
add_foreign_key
"issue_assignees"
,
"issues"
,
name:
"fk_b7d881734a"
,
on_delete: :cascade
add_foreign_key
"issue_assignees"
,
"users"
,
on_delete: :cascade
add_foreign_key
"issue_assignees"
,
"users"
,
name:
"fk_5e0c8d9154"
,
on_delete: :cascade
add_foreign_key
"issue_metrics"
,
"issues"
,
on_delete: :cascade
add_foreign_key
"issue_metrics"
,
"issues"
,
on_delete: :cascade
add_foreign_key
"label_priorities"
,
"labels"
,
on_delete: :cascade
add_foreign_key
"label_priorities"
,
"labels"
,
on_delete: :cascade
add_foreign_key
"label_priorities"
,
"projects"
,
on_delete: :cascade
add_foreign_key
"label_priorities"
,
"projects"
,
on_delete: :cascade
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment