class NoBrainer::QueryRunner::MissingIndex

Public Instance Methods

call(env) click to toggle source
# File lib/no_brainer/query_runner/missing_index.rb, line 2
def call(env)
  @runner.call(env)
rescue RuntimeError => e
  if match_data = /^Index `(.+)` was not found on table `(.+)\.(.+)`\.$/.match(e.message)
    _, index_name, db_name, table_name = *match_data

    model = NoBrainer::Document.all.select { |m| m.table_name == table_name }.first
    index = model.indexes.values.select { |i| i.aliased_name == index_name.to_sym }.first if model
    index_name = index.name if index

    if model.try(:pk_name).try(:to_s) == index_name.to_s
      err_msg  = "Please update the primary key `#{index_name}` in the table `#{db_name}.#{table_name}`."
    else
      err_msg  = "Please run `NoBrainer.sync_indexes' or `rake nobrainer:sync_indexes' to create the index `#{index_name}`"
      err_msg += " in the table `#{db_name}.#{table_name}`."
      err_msg += " Read http://nobrainer.io/docs/indexes for more information."
    end

    raise NoBrainer::Error::MissingIndex.new(err_msg)
  end
  raise
end