module Ganeshan::Explainer

Public Instance Methods

exec_query(*args) click to toggle source
Calls superclass method
# File lib/ganeshan/explainer.rb, line 3
def exec_query(*args)
  p args
  _with_explain(sql: args.first, binds: args[2]) do
    super
  end
end

Private Instance Methods

_validate_explain(sql:, exp:) click to toggle source
# File lib/ganeshan/explainer.rb, line 38
def _validate_explain(sql:, exp:)
  Ganeshan::JsonLogger.log(
    sql: sql,
    explain: exp,
  )
end
_with_explain(sql:, binds:) { || ... } click to toggle source
# File lib/ganeshan/explainer.rb, line 12
def _with_explain(sql:, binds:)
  begin
    if Ganeshan.enabled && sql =~ /\A\s*SELECT\b/i
      conn = Ganeshan.connection || raw_connection

      type_casted_binds = if binds
                            type_casted_binds(binds)
                          else
                            []
                          end

      if type_casted_binds.empty?
        exp = conn.query("EXPLAIN #{sql}").to_a
      else
        exp = conn.query("EXPLAIN #{sql}", type_casted_binds).to_a
      end

      _validate_explain(sql: sql, exp: exp)
    end
  rescue StandardError => e
    Ganeshan.logger.error("#{e}\n\t#{e.backtrace.join("\n\t")}")
  end

  yield
end