class ViewData::PG::PrimaryKey::GetColumns

Public Class Methods

build(session: nil) click to toggle source
# File lib/view_data/pg/primary_key/get_columns.rb, line 13
def self.build(session: nil)
  instance = new
  Session.configure(instance, session: session)
  ::Telemetry.configure(instance)
  instance
end
call(table) click to toggle source
# File lib/view_data/pg/primary_key/get_columns.rb, line 20
def self.call(table)
  instance = build()
  instance.(table)
end
register_telemetry_sink(instance) click to toggle source
# File lib/view_data/pg/primary_key/get_columns.rb, line 56
def self.register_telemetry_sink(instance)
  sink = Telemetry::Sink.new
  instance.telemetry.register(sink)
  sink
end

Public Instance Methods

cache() click to toggle source
# File lib/view_data/pg/primary_key/get_columns.rb, line 50
def cache
  @cache ||= Hash.new do |hash, table|
    hash[table] = query(table)
  end
end
call(table) click to toggle source
# File lib/view_data/pg/primary_key/get_columns.rb, line 25
def call(table)
  cache[table]
end
query(table) click to toggle source
# File lib/view_data/pg/primary_key/get_columns.rb, line 29
        def query(table)
          result = session.execute(<<~SQL, [table])
            SELECT
              TEXT(attr.attname) AS column_name
            FROM pg_index AS index
            JOIN pg_attribute AS attr
              ON attr.attrelid = index.indrelid
              AND attr.attnum = ANY(index.indkey)
            WHERE index.indrelid = $1::regclass
            AND index.indisprimary
          SQL

          columns = result.to_a.map do |hash|
            hash['column_name']
          end

          telemetry.record(:columns_queried, Telemetry::Data.new(table, columns))

          columns
        end