class ElasticAPM::Normalizers::ActiveRecord::SqlNormalizer

@api private

def cached_adapter_name(adapter_name)

def cached_adapter_name(adapter_name)
  return UNKNOWN if adapter_name.nil? || adapter_name.empty?
  @adapters[adapter_name] ||
    (@adapters[adapter_name] = adapter_name.downcase)
rescue StandardError
  nil
end

def can_attempt_connection_id_lookup?(payload)

def can_attempt_connection_id_lookup?(payload)
  RUBY_ENGINE == "ruby" &&
    payload[:connection_id] &&
    ObjectSpace.respond_to?(:_id2ref)
end

def initialize(*args)

def initialize(*args)
  super
  @summarizer = Sql::Signature::Summarizer.new
  @adapters = {}
end

def normalize(_transaction, _name, payload)

def normalize(_transaction, _name, payload)
  return :skip if SKIP_NAMES.include?(payload[:name])
  name = summarize(payload[:sql]) || payload[:name]
  subtype = subtype_for(payload)
  context =
    Span::Context.new(
      db: { statement: payload[:sql], type: 'sql' },
      destination: { service: { name: subtype, resource: subtype, type: TYPE } }
    )
  [name, TYPE, subtype, ACTION, context]
end

def subtype_for(payload)

def subtype_for(payload)
  if payload[:connection]
    return cached_adapter_name(payload[:connection].adapter_name)
  end
  if can_attempt_connection_id_lookup?(payload)
    begin
      loaded_object = ObjectSpace._id2ref(payload[:connection_id])
      if loaded_object.respond_to?(:adapter_name)
        return cached_adapter_name(loaded_object.adapter_name)
      end
    rescue RangeError # if connection object has somehow been garbage collected
    end
  end
  cached_adapter_name(::ActiveRecord::Base.connection_config[:adapter])
end

def summarize(sql)

def summarize(sql)
  @summarizer.summarize(sql)
end