Class: AwesomeExplain::Renderers::ActiveRecord

Inherits:
Object
  • Object
show all
Defined in:
lib/awesome_explain/renderers/active_record.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(query, result = nil) ⇒ ActiveRecord

Returns a new instance of ActiveRecord.



6
7
8
9
# File 'lib/awesome_explain/renderers/active_record.rb', line 6

def initialize(query, result = nil)
  @query = query
  @result = result || explain_query
end

Instance Attribute Details

#queryObject (readonly)

Returns the value of attribute query.



4
5
6
# File 'lib/awesome_explain/renderers/active_record.rb', line 4

def query
  @query
end

#resultObject (readonly)

Returns the value of attribute result.



4
5
6
# File 'lib/awesome_explain/renderers/active_record.rb', line 4

def result
  @result
end

#sql_explainObject (readonly)

Returns the value of attribute sql_explain.



4
5
6
# File 'lib/awesome_explain/renderers/active_record.rb', line 4

def sql_explain
  @sql_explain
end

Instance Method Details

#explain_queryObject



11
12
13
14
15
16
17
18
# File 'lib/awesome_explain/renderers/active_record.rb', line 11

def explain_query
  explain = AwesomeExplain::Config.instance.connection.raw_connection.exec(
    "EXPLAIN (ANALYZE true, COSTS true, FORMAT json) #{query.to_sql}"
  )
  explain = explain.map { |h| h.values.first }.join("\n")

  @sql_explain = SqlExplain.new(explain_output: explain)
end

#general_stats_section(t) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/awesome_explain/renderers/active_record.rb', line 62

def general_stats_section(t)
  title = AwesomeExplain::Utils::Color.fg_color :yellow, 'General Stats'
  t << [{ value: title, alignment: :center, colspan: 2}]
  t << :separator
  t << ['Table', 'Count']
  t << :separator
  t << ['Total Rows Planned', plan_stats.total_rows_planned]
  t << ['Total Rows', plan_stats.total_rows]
  t << ['Total Loops', plan_stats.total_loops]
  t << seq_scans_row
  t << ['Indexes Used', plan_stats.index_stats.size]
end

#index_statsObject



42
43
44
# File 'lib/awesome_explain/renderers/active_record.rb', line 42

def index_stats
  @index_stats ||= plan_stats.index_stats
end

#index_stats_section(t) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/awesome_explain/renderers/active_record.rb', line 99

def index_stats_section(t)
  if index_stats.size.positive?
    title = AwesomeExplain::Utils::Color.fg_color :yellow, 'Index Stats'
    t << :separator
    t << [{ value: title, alignment: :center, colspan: 2}]
    t << :separator
    t << ['Index Name', 'Count']
    t << :separator
    index_stats.each do |index, stats|
      t << [index, stats.dig(:count)]
    end
  end
end

#node_type_statsObject



38
39
40
# File 'lib/awesome_explain/renderers/active_record.rb', line 38

def node_type_stats
  @node_type_stats ||= plan_stats.node_type_stats
end

#node_types_section(t) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
# File 'lib/awesome_explain/renderers/active_record.rb', line 87

def node_types_section(t)
  title = AwesomeExplain::Utils::Color.fg_color :yellow, 'Node Type Stats'
  t << :separator
  t << [{ value: title, alignment: :center, colspan: 2}]
  t << :separator
  t << ['Node Type', 'Count']
  t << :separator
  node_type_stats.each do |node_type, stats|
    t << [node_type, stats.dig(:count)]
  end
end

#plan_statsObject



30
31
32
# File 'lib/awesome_explain/renderers/active_record.rb', line 30

def plan_stats
  @plan_stats ||= @sql_explain.tree.plan_stats
end


20
21
22
23
24
25
26
27
28
# File 'lib/awesome_explain/renderers/active_record.rb', line 20

def print
  table = Terminal::Table.new do |t|
    general_stats_section t
    table_stats_section t
    node_types_section t
    index_stats_section t
  end
  puts table
end

#seq_scans_rowObject



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/awesome_explain/renderers/active_record.rb', line 46

def seq_scans_row
  color = plan_stats.seq_scans.positive? ? :cyan : :green

  seq_scans_label = AwesomeExplain::Utils::Color.fg_color(
    color,
    'Seq Scans'
  )

  seq_scans_val = AwesomeExplain::Utils::Color.fg_color(
    color,
    plan_stats.seq_scans.to_s
  )

  [seq_scans_label, seq_scans_val]
end

#table_statsObject



34
35
36
# File 'lib/awesome_explain/renderers/active_record.rb', line 34

def table_stats
  @table_stats ||= plan_stats.table_stats
end

#table_stats_section(t) ⇒ Object



75
76
77
78
79
80
81
82
83
84
85
# File 'lib/awesome_explain/renderers/active_record.rb', line 75

def table_stats_section(t)
  title = AwesomeExplain::Utils::Color.fg_color :yellow, 'Table Stats'
  t << :separator
  t << [{ value: title, alignment: :center, colspan: 2}]
  t << :separator
  t << ['Table', 'Count']
  t << :separator
  table_stats.each do |table_name, stats|
    t << [table_name, stats.dig(:count)]
  end
end