module QueryTrace

Public Class Methods

append_features(klass) click to toggle source
Calls superclass method
# File lib/sql_optimizer/analyze.rb, line 61
def self.append_features(klass)
  super
  klass.class_eval do
    unless method_defined?(:log_info_without_trace)
      alias_method :log_info_without_trace, :sql
      alias_method :sql, :log_info_with_trace
    end
  end
end
enable!() click to toggle source
# File lib/sql_optimizer/analyze.rb, line 57
def self.enable!
  ::ActiveRecord::LogSubscriber.send(:include, self)
end

Public Instance Methods

log_info_with_trace(event) click to toggle source
# File lib/sql_optimizer/analyze.rb, line 71
def log_info_with_trace(event)
  log_info_without_trace(event)

  return if event.payload[:name].nil? ||
    event.payload[:name] == 'SCHEMA' ||
    event.payload[:name].include?('SchemaMigration') ||
    %w[BEGIN COMMIT ROLLBACK].include?(event.payload[:sql].to_s) ||
    !ActiveRecord::Base.connection.table_exists?(QueryLog.table_name) ||
    event.payload[:sql].include?('query_logs')

  logger = ActiveRecord::Base.logger
  ActiveRecord::Base.logger = nil
  query_logs = QueryLog.last(2)
  if query_logs.last.present? && query_logs.last.query == event.payload[:sql]
    query_logs.last.update(follow_id:       query_logs.first.id,
                           n_plus_one_size: query_logs.last.n_plus_one_size + 1)
  else
    QueryLog.create(
      query:    event.payload[:sql],
      source:   event.payload[:name],
      duration: event.duration.round(3)
    )
  end
  ActiveRecord::Base.logger = logger
end