class LolDba::IndexFinder

Public Class Methods

check_for_indexes() click to toggle source
# File lib/lol_dba/index_finding/index_finder.rb, line 9
def self.check_for_indexes
  eager_load_if_needed

  required_indexes = Hash.new([])

  model_classes.each do |model_class|
    unless model_class.descends_from_active_record?
      index_name = [model_class.inheritance_column, model_class.base_class.primary_key].sort
      required_indexes[model_class.base_class.table_name] += [index_name]
    end
    reflections = model_class.reflections.stringify_keys
    reflections.each_pair do |reflection_name, reflection_options|
      begin
        clazz = RelationInspectorFactory.for(reflection_options.macro)
        next unless clazz.present?
        inspector = clazz.new(model_class, reflection_options,
                              reflection_name)
        columns = inspector.relation_columns

        unless columns.nil? || reflection_options.options.include?(:class)
          required_indexes[inspector.table_name.to_s] += [columns]
        end
      rescue StandardError => exception
        LolDba::ErrorLogging.log(model_class, reflection_options, exception)
      end
    end
  end

  missing_indexes(required_indexes)
end
eager_load_if_needed() click to toggle source
# File lib/lol_dba/index_finding/index_finder.rb, line 79
def self.eager_load_if_needed
  Rails.application.eager_load! if defined?(Rails) && !Rails.env.test?
end
existing_indexes(table_name) click to toggle source
# File lib/lol_dba/index_finding/index_finder.rb, line 54
def self.existing_indexes(table_name)
  table_indexes(table_name) + primary_key(table_name)
end
missing_indexes(indexes_required) click to toggle source
# File lib/lol_dba/index_finding/index_finder.rb, line 40
def self.missing_indexes(indexes_required)
  missing_indexes = {}
  indexes_required.each do |table_name, foreign_keys|
    next if foreign_keys.blank? || !tables.include?(table_name.to_s)
    keys_to_add = foreign_keys.uniq - existing_indexes(table_name)
    missing_indexes[table_name] = keys_to_add unless keys_to_add.empty?
  end
  missing_indexes
end
model_classes() click to toggle source
# File lib/lol_dba/index_finding/index_finder.rb, line 69
def self.model_classes
  ActiveRecord::Base.descendants.select do |obj|
    Class == obj.class && session_store?(obj)
  end
end
primary_key(table_name) click to toggle source
# File lib/lol_dba/index_finding/index_finder.rb, line 65
def self.primary_key(table_name)
  Array(ActiveRecord::Base.connection.primary_key(table_name.to_s))
end
run() click to toggle source
# File lib/lol_dba/index_finding/index_finder.rb, line 3
def self.run
  missing_indexes = check_for_indexes
  MigrationFormatter.new(missing_indexes).puts_migration_content
  missing_indexes.any?
end
session_store?(obj) click to toggle source
# File lib/lol_dba/index_finding/index_finder.rb, line 75
def self.session_store?(obj)
  !defined?(ActiveRecord::SessionStore::Session) || obj != ActiveRecord::SessionStore::Session
end
table_indexes(table_name) click to toggle source
# File lib/lol_dba/index_finding/index_finder.rb, line 58
def self.table_indexes(table_name)
  indexes = ActiveRecord::Base.connection.indexes(table_name.to_sym)
  indexes.collect do |index|
    index.columns.size > 1 ? index.columns.sort : index.columns.first
  end
end
tables() click to toggle source
# File lib/lol_dba/index_finding/index_finder.rb, line 50
def self.tables
  LolDba::RailsCompatibility.tables
end