Class: NPlusOneControl::Executor::Collector

Inherits:
Object
  • Object
show all
Defined in:
lib/n_plus_one_control/executor.rb

Overview

Subscribes to ActiveSupport notifications and collect matching queries.

Instance Method Summary collapse

Constructor Details

#initialize(pattern) ⇒ Collector

Returns a new instance of Collector.



9
10
11
# File 'lib/n_plus_one_control/executor.rb', line 9

def initialize(pattern)
  @pattern = pattern
end

Instance Method Details

#callObject



13
14
15
16
17
18
19
20
# 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) ⇒ Object

rubocop:disable Metrics/CyclomaticComplexity,Metrics/LineLength



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 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 if values[:sql].match?(NPlusOneControl.ignore)

  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