7 changed files with 239 additions and 9 deletions
@ -0,0 +1,49 @@
|
||||
# frozen_string_literal: true |
||||
|
||||
class AddIndexToWebauthnCredentialsUserIdNickname < ActiveRecord::Migration[7.0] |
||||
disable_ddl_transaction! |
||||
|
||||
def up |
||||
add_index_to_table |
||||
rescue ActiveRecord::RecordNotUnique |
||||
remove_duplicates_and_reindex |
||||
end |
||||
|
||||
def down |
||||
remove_index_from_table |
||||
end |
||||
|
||||
private |
||||
|
||||
def remove_duplicates_and_reindex |
||||
deduplicate_records |
||||
reindex_records |
||||
rescue ActiveRecord::RecordNotUnique |
||||
retry |
||||
end |
||||
|
||||
def reindex_records |
||||
remove_index_from_table |
||||
add_index_to_table |
||||
end |
||||
|
||||
def add_index_to_table |
||||
add_index :webauthn_credentials, [:user_id, :nickname], unique: true, algorithm: :concurrently |
||||
end |
||||
|
||||
def remove_index_from_table |
||||
remove_index :webauthn_credentials, [:user_id, :nickname] |
||||
end |
||||
|
||||
def deduplicate_records |
||||
safety_assured do |
||||
execute <<~SQL.squish |
||||
DELETE FROM webauthn_credentials |
||||
WHERE id NOT IN ( |
||||
SELECT DISTINCT ON(user_id, nickname) id FROM webauthn_credentials |
||||
ORDER BY user_id, nickname, id ASC |
||||
) |
||||
SQL |
||||
end |
||||
end |
||||
end |
||||
@ -0,0 +1,49 @@
|
||||
# frozen_string_literal: true |
||||
|
||||
class AddIndexToAccountAliasUriAccountId < ActiveRecord::Migration[7.0] |
||||
disable_ddl_transaction! |
||||
|
||||
def up |
||||
add_index_to_table |
||||
rescue ActiveRecord::RecordNotUnique |
||||
remove_duplicates_and_reindex |
||||
end |
||||
|
||||
def down |
||||
remove_index_from_table |
||||
end |
||||
|
||||
private |
||||
|
||||
def remove_duplicates_and_reindex |
||||
deduplicate_records |
||||
reindex_records |
||||
rescue ActiveRecord::RecordNotUnique |
||||
retry |
||||
end |
||||
|
||||
def reindex_records |
||||
remove_index_from_table |
||||
add_index_to_table |
||||
end |
||||
|
||||
def add_index_to_table |
||||
add_index :account_aliases, [:account_id, :uri], unique: true, algorithm: :concurrently |
||||
end |
||||
|
||||
def remove_index_from_table |
||||
remove_index :account_aliases, [:account_id, :uri] |
||||
end |
||||
|
||||
def deduplicate_records |
||||
safety_assured do |
||||
execute <<~SQL.squish |
||||
DELETE FROM account_aliases |
||||
WHERE id NOT IN ( |
||||
SELECT DISTINCT ON(account_id, uri) id FROM account_aliases |
||||
ORDER BY account_id, uri, id ASC |
||||
) |
||||
SQL |
||||
end |
||||
end |
||||
end |
||||
@ -0,0 +1,49 @@
|
||||
# frozen_string_literal: true |
||||
|
||||
class AddIndexToCustomFilterStatusesStatusCustomFilter < ActiveRecord::Migration[7.0] |
||||
disable_ddl_transaction! |
||||
|
||||
def up |
||||
add_index_to_table |
||||
rescue ActiveRecord::RecordNotUnique |
||||
remove_duplicates_and_reindex |
||||
end |
||||
|
||||
def down |
||||
remove_index_from_table |
||||
end |
||||
|
||||
private |
||||
|
||||
def remove_duplicates_and_reindex |
||||
deduplicate_records |
||||
reindex_records |
||||
rescue ActiveRecord::RecordNotUnique |
||||
retry |
||||
end |
||||
|
||||
def reindex_records |
||||
remove_index_from_table |
||||
add_index_to_table |
||||
end |
||||
|
||||
def add_index_to_table |
||||
add_index :custom_filter_statuses, [:status_id, :custom_filter_id], unique: true, algorithm: :concurrently |
||||
end |
||||
|
||||
def remove_index_from_table |
||||
remove_index :custom_filter_statuses, [:status_id, :custom_filter_id] |
||||
end |
||||
|
||||
def deduplicate_records |
||||
safety_assured do |
||||
execute <<~SQL.squish |
||||
DELETE FROM custom_filter_statuses |
||||
WHERE id NOT IN ( |
||||
SELECT DISTINCT ON(status_id, custom_filter_id) id FROM custom_filter_statuses |
||||
ORDER BY status_id, custom_filter_id, id ASC |
||||
) |
||||
SQL |
||||
end |
||||
end |
||||
end |
||||
@ -0,0 +1,49 @@
|
||||
# frozen_string_literal: true |
||||
|
||||
class AddIndexToIdentitiesUidProvider < ActiveRecord::Migration[7.0] |
||||
disable_ddl_transaction! |
||||
|
||||
def up |
||||
add_index_to_table |
||||
rescue ActiveRecord::RecordNotUnique |
||||
remove_duplicates_and_reindex |
||||
end |
||||
|
||||
def down |
||||
remove_index_from_table |
||||
end |
||||
|
||||
private |
||||
|
||||
def remove_duplicates_and_reindex |
||||
deduplicate_records |
||||
reindex_records |
||||
rescue ActiveRecord::RecordNotUnique |
||||
retry |
||||
end |
||||
|
||||
def reindex_records |
||||
remove_index_from_table |
||||
add_index_to_table |
||||
end |
||||
|
||||
def add_index_to_table |
||||
add_index :identities, [:uid, :provider], unique: true, algorithm: :concurrently |
||||
end |
||||
|
||||
def remove_index_from_table |
||||
remove_index :identities, [:uid, :provider] |
||||
end |
||||
|
||||
def deduplicate_records |
||||
safety_assured do |
||||
execute <<~SQL.squish |
||||
DELETE FROM identities |
||||
WHERE id NOT IN ( |
||||
SELECT DISTINCT ON(uid, provider) id FROM identities |
||||
ORDER BY uid, provider, id ASC |
||||
) |
||||
SQL |
||||
end |
||||
end |
||||
end |
||||
Loading…
Reference in new issue