Module: Pipeloader::Trace

Defined in:
lib/pipeloader.rb

Overview

Stash the active dataloader on the connection for the whole response phase, and clear it at the end. This is done at multiplex scope, not per-query, because under Dataloader resolution is deferred to the multiplex’s fiber run loop — a per-query hook would clear the stash before resolvers ever run.

Instance Method Summary collapse

Instance Method Details

#execute_multiplex(multiplex:) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/pipeloader.rb', line 86

def execute_multiplex(multiplex:)
  Pipeloader.reset_stats!
  conn = ActiveRecord::Base.connection
  pg = nil
  # Raises on an unsupported adapter; on SQLite, leaves the stash unset so
  # select_all never pipelines (column projection still applies).
  if Pipeloader.pipelining_supported?(conn)
    conn.pipeloader_dataloader = multiplex.dataloader
    pg = conn.raw_connection
    Pipeloader.begin_request!(pg)
  end
  super
ensure
  conn.pipeloader_dataloader = nil if conn
  Pipeloader.end_request!(pg) if pg
end