Module: QueryTrace

Defined in:
lib/sql_optimizer/analyze.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.append_features(klass) ⇒ Object



61
62
63
64
65
66
67
68
69
# 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!Object



57
58
59
# File 'lib/sql_optimizer/analyze.rb', line 57

def self.enable!
  ::ActiveRecord::LogSubscriber.send(:include, self)
end

Instance Method Details

#log_info_with_trace(event) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# 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