module OccamsRecord::Measureable

Measure the time each query takes. Useful for figuring out which query is the slow one when you're doing a bunch of eager loads.

orders = OccamsRecord.

query(Order.all).
eager_load(:customer).
...
measure { |x|
  puts "Total time: #{x.total_time} sec"
  x.queries.each { |q|
    puts "Table: #{q.table_name} (#{q.time} sec)"
    puts q.sql
  }
}.
run

Public Instance Methods

measure(&block) click to toggle source

Track the run time of each query, and the total run time of everything combined.

@yield [OccamsRecord::Measurements] @return self

# File lib/occams-record/measureable.rb, line 28
def measure(&block)
  @measurements ||= []
  @measurement_results_block = block
  self
end

Private Instance Methods

measure!(table_name, sql) { || ... } click to toggle source
# File lib/occams-record/measureable.rb, line 40
def measure!(table_name, sql)
  result = nil
  time = Benchmark.realtime { result = yield }
  @measurements << Measurement.new(table_name, sql, time)
  result
end
measure?() click to toggle source
# File lib/occams-record/measureable.rb, line 36
def measure?
  !@measurements.nil?
end
record_start_time!() click to toggle source
# File lib/occams-record/measureable.rb, line 47
def record_start_time!
  @start_time = Time.now if top_level_measurer?
end
top_level_measurer?() click to toggle source
# File lib/occams-record/measureable.rb, line 59
def top_level_measurer?
  defined?(@measurement_results_block) && !@measurement_results_block.nil?
end
yield_measurements!() click to toggle source
# File lib/occams-record/measureable.rb, line 51
def yield_measurements!
  if top_level_measurer?
    total_time = Time.now - @start_time
    measurements = Measurements.new(total_time, @measurements.sort_by(&:time))
    @measurement_results_block.call(measurements)
  end
end