Class: QueryOwl::Middleware

Inherits:
Object
  • Object
show all
Defined in:
lib/query_owl/middleware.rb

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ Middleware

Returns a new instance of Middleware.



3
4
5
# File 'lib/query_owl/middleware.rb', line 3

def initialize(app)
  @app = app
end

Instance Method Details

#call(env) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/query_owl/middleware.rb', line 14

def call(env)
  return @app.call(env) unless QueryOwl.config.enabled

  QueryTracker.start!
  EagerLoadTracker.start!
  @app.call(env)
ensure
  queries     = QueryTracker.stop!
  eager_data  = EagerLoadTracker.stop!
  events      = Detector.detect_n_plus_one(queries) +
                Detector.detect_slow_queries(queries) +
                Detector.detect_unused_eager_loads(eager_data)
  Logger.log_events(events)
  Logger.log_summary(events)
  events.each { |e| EventStore.push(e) }
  raise_on_n_plus_one!(events) if QueryOwl.config.raise_on_n_plus_one
end

#raise_on_n_plus_one!(events) ⇒ Object

Raises:



7
8
9
10
11
12
# File 'lib/query_owl/middleware.rb', line 7

def raise_on_n_plus_one!(events)
  event = events.find { |e| e[:type] == :n_plus_one }
  return unless event

  raise NPlusOneError, "N+1 detected: #{event[:sql]} (#{event[:count]} times) #{event[:backtrace].first}"
end