gitlab-org--gitlab-foss/rubocop/cop/migration/hash_index.rb
Yorick Peterse a004f9ec8c
Added cop to blacklist the use of hash indexes
These indexes are not recorded in the WAL (at least until PostgreSQL
10) and this isn't worth the minor performance improvement over btree
indexes.
2017-07-14 13:19:00 +02:00

51 lines
1.3 KiB
Ruby

require 'set'
require_relative '../../migration_helpers'
module RuboCop
module Cop
module Migration
# Cop that prevents the use of hash indexes in database migrations
class HashIndex < RuboCop::Cop::Cop
include MigrationHelpers
MSG = 'hash indexes should be avoided at all costs since they are not ' \
'recorded in the PostgreSQL WAL, you should use a btree index instead'.freeze
NAMES = Set.new([:add_index, :index, :add_concurrent_index]).freeze
def on_send(node)
return unless in_migration?(node)
name = node.children[1]
return unless NAMES.include?(name)
opts = node.children.last
return unless opts && opts.type == :hash
opts.each_node(:pair) do |pair|
next unless hash_key_type(pair) == :sym &&
hash_key_name(pair) == :using
if hash_key_value(pair).to_s == 'hash'
add_offense(pair, :expression)
end
end
end
def hash_key_type(pair)
pair.children[0].type
end
def hash_key_name(pair)
pair.children[0].children[0]
end
def hash_key_value(pair)
pair.children[1].children[0]
end
end
end
end
end