class NPlusOneControl::Executor::Collector

Subscribes to ActiveSupport notifications and collect matching queries.

Public Class Methods

new(pattern) click to toggle source
# File lib/n_plus_one_control/executor.rb, line 9
def initialize(pattern)
  @pattern = pattern
end

Public Instance Methods

call() { || ... } click to toggle source
# File lib/n_plus_one_control/executor.rb, line 13
def call
  @queries = []
  ActiveSupport::Notifications
    .subscribed(method(:callback), NPlusOneControl.event) do
    yield
  end
  @queries
end
callback(_name, _start, _finish, _message_id, values) click to toggle source
# File lib/n_plus_one_control/executor.rb, line 22
def callback(_name, _start, _finish, _message_id, values) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/LineLength
  return if %w[CACHE SCHEMA].include? values[:name]

  return unless @pattern.nil? || (values[:sql] =~ @pattern)

  query = values[:sql]

  if NPlusOneControl.backtrace_cleaner && NPlusOneControl.verbose
    source = extract_query_source_location(caller)

    query = "#{query}\n    ↳ #{source.join("\n")}" unless source.empty?
  end

  @queries << query
end

Private Instance Methods

extract_query_source_location(locations) click to toggle source
# File lib/n_plus_one_control/executor.rb, line 40
def extract_query_source_location(locations)
  NPlusOneControl.backtrace_cleaner.call(locations.lazy)
    .take(NPlusOneControl.backtrace_length).to_a
end