class ArJdbc::MySQL::ExplainSupport::ExplainPrettyPrinter

@private

Public Instance Methods

pp(result, elapsed) click to toggle source

Pretty prints the result of a EXPLAIN in a way that resembles the output of the MySQL shell:

----————--------——----------------———---------——-------————-+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | ----————--------——----------------———---------——-------————-+ | 1 | SIMPLE | users | const | PRIMARY | PRIMARY | 4 | const | 1 | | | 1 | SIMPLE | posts | ALL | NULL | NULL | NULL | NULL | 1 | Using where | ----————--------——----------------———---------——-------————-+ 2 rows in set (0.00 sec)

This is an exercise in Ruby hyperrealism :).

# File lib/arjdbc/mysql/explain_support.rb, line 30
def pp(result, elapsed)
  widths = compute_column_widths(result)
  separator = build_separator(widths)

  pp = []

  pp << separator
  pp << build_cells(result.columns, widths)
  pp << separator

  result.rows.each do |row|
    pp << build_cells(row, widths)
  end

  pp << separator
  pp << build_footer(result.rows.length, elapsed)

  pp.join(sep = "\n") << sep
end

Private Instance Methods

build_cells(items, widths) click to toggle source
# File lib/arjdbc/mysql/explain_support.rb, line 65
def build_cells(items, widths)
  cells = []
  items.each_with_index do |item, i|
    item = 'NULL' if item.nil?
    justifier = item.is_a?(Numeric) ? 'rjust' : 'ljust'
    cells << item.to_s.send(justifier, widths[i])
  end
  "|#{cells.join(' | ')}|"
end
build_separator(widths) click to toggle source
# File lib/arjdbc/mysql/explain_support.rb, line 61
def build_separator(widths)
  padding = 1; "+#{widths.map { |w| '-' * (w + (padding * 2 )) }.join('+')}+"
end
compute_column_widths(result) click to toggle source
# File lib/arjdbc/mysql/explain_support.rb, line 52
def compute_column_widths(result)
  [].tap do |widths|
    result.columns.each_with_index do |column, i|
      cells_in_column = [column] + result.rows.map {|r| r[i].nil? ? 'NULL' : r[i].to_s}
      widths << cells_in_column.map(&:length).max
    end
  end
end