module SpringOnion::Explainer

Public Instance Methods

execute(*args) click to toggle source
Calls superclass method
# File lib/spring_onion/explainer.rb, line 5
def execute(*args)
  _with_explain(sql: args.first) do
    super
  end
end

Private Instance Methods

_validate_explain(sql:, exp:, trace:) click to toggle source
# File lib/spring_onion/explainer.rb, line 32
def _validate_explain(sql:, exp:, trace:)
  warnings = SpringOnion.warnings
  warning_names_by_index = {}

  exp.each_with_index do |row, i|
    warning_names = warnings.select do |_name, validator|
      validator.call(row)
    end.keys

    warning_names_by_index[i] = warning_names unless warning_names.empty?
  end

  return if !SpringOnion.log_all && warning_names_by_index.empty?

  SpringOnion::JsonLogger.log(
    sql: sql,
    explain: exp,
    warnings: warning_names_by_index,
    trace: trace
  )
end
_with_explain(sql:) { || ... } click to toggle source
# File lib/spring_onion/explainer.rb, line 13
def _with_explain(sql:)
  begin
    if SpringOnion.enabled && sql =~ /\A\s*SELECT\b/i && SpringOnion.sql_filter.call(sql)
      trace = SpringOnion.source_filter.call(caller)

      unless trace.length.zero?
        conn = SpringOnion.connection || raw_connection
        exp = conn.query("EXPLAIN #{sql}", as: :hash).to_a
        exp.each { |r| r.delete('id') }
        _validate_explain(sql: sql, exp: exp, trace: trace)
      end
    end
  rescue StandardError => e
    SpringOnion.logger.error("#{e}\n\t#{e.backtrace.join("\n\t")}")
  end

  yield
end