Class: Chronos::Rails::ActiveRecordQueryInspector

Inherits:
Object
  • Object
show all
Defined in:
lib/chronos/rails/active_record_query_inspector.rb

Overview

Performs bounded, read-only ActiveRecord index, statistics, and query-plan inspection.

Examples:

inspector.call(sql, , :plan => false)

Constant Summary collapse

GUARD_KEY =
:__chronos_query_inspection
MAX_PLAN_NODES =
20

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.suppressed?Boolean

Returns:

  • (Boolean)


21
22
23
24
25
# File 'lib/chronos/rails/active_record_query_inspector.rb', line 21

def self.suppressed?
  Thread.current[GUARD_KEY] == true
rescue StandardError
  false
end

Instance Method Details

#call(raw_sql, query, options = {}) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/chronos/rails/active_record_query_inspector.rb', line 27

def call(raw_sql, query, options = {})
  connection = options[:connection]
  return {} unless eligible?(raw_sql, query, connection)

  previous = Thread.current[GUARD_KEY]
  Thread.current[GUARD_KEY] = true
  guarded = true
  result = {"errors" => []}
  capture(result) { result["indexes"] = indexes(connection, table(query)) }
  if options[:statistics] == true
    capture(result) { result["statistics"] = statistics(connection, table(query)) }
  end
  if options[:plan] == true
    capture(result) do
      plan_result = plan(connection, raw_sql, adapter_name(connection))
      result["errors"].concat(Array(plan_result.delete("errors")))
      result["plan"] = plan_result
    end
  end
  result.delete("errors") if result["errors"].empty?
  result
rescue StandardError => error
  {"errors" => [safe_error_class(error)]}
ensure
  Thread.current[GUARD_KEY] = previous if guarded
end