44 lines
1.2 KiB
Ruby
44 lines
1.2 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class AddMissingExpressionIndexes < ActiveRecord::Migration[6.0]
|
||
|
include Gitlab::Database::MigrationHelpers
|
||
|
|
||
|
DOWNTIME = false
|
||
|
|
||
|
disable_ddl_transaction!
|
||
|
|
||
|
INDEXES = [
|
||
|
[:namespaces, :index_on_namespaces_lower_name, 'LOWER(name)'],
|
||
|
[:namespaces, :index_on_namespaces_lower_path, 'LOWER(path)'],
|
||
|
[:projects, :index_on_projects_lower_path, 'LOWER(path)'],
|
||
|
[:routes, :index_on_routes_lower_path, 'LOWER(path)'],
|
||
|
[:users, :index_on_users_lower_username, 'LOWER(username)'],
|
||
|
[:users, :index_on_users_lower_email, 'LOWER(email)']
|
||
|
]
|
||
|
|
||
|
def up
|
||
|
# Those indexes had been introduced before, but they haven't been
|
||
|
# captured in structure.sql. For installations that already have it,
|
||
|
# this is a no-op - others will get it retroactively with
|
||
|
# this migration.
|
||
|
|
||
|
tables = Set.new
|
||
|
|
||
|
INDEXES.each do |(table, name, expression)|
|
||
|
unless index_name_exists?(table, name)
|
||
|
add_concurrent_index table, expression, name: name
|
||
|
tables.add(table)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# Rebuild statistics on affected tables only
|
||
|
tables.each do |table|
|
||
|
execute("ANALYZE #{table}")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def down
|
||
|
# no-op
|
||
|
end
|
||
|
end
|