Sha256: 621beed6ee53c6d823a60611918b7985168cd9fe288f3ed66fe4e242500b914a

Contents?: true

Size: 1.59 KB

Versions: 1

Compression:

Stored size: 1.59 KB

Contents

module RubyPGExtras
  class IndexInfo
    def self.call(table_name = nil)
      new.call(table_name)
    end

    def call(table_name = nil)
      indexes_data.select do |index_data|
        if table_name == nil
          true
        else
          index_data.fetch("tablename") == table_name
        end
      end.sort_by do |index_data|
        index_data.fetch("tablename")
      end.map do |index_data|
        index_name = index_data.fetch("indexname")

        {
          index_name: index_name,
          table_name: index_data.fetch("tablename"),
          columns: index_data.fetch("columns").split(',').map(&:strip),
          index_size: index_size_data.find do |el|
            el.fetch("name") == index_name
          end.fetch("size", "N/A"),
          index_scans:  index_scans_data.find do |el|
            el.fetch("index") == index_name
          end.fetch("index_scans", "N/A"),
          null_frac: null_indexes_data.find do |el|
            el.fetch("index") == index_name
          end&.fetch("null_frac", "N/A").strip || "0.00%"
        }
      end
    end

    def index_size_data
      @_index_size_data ||= query_module.index_size(in_format: :hash)
    end

    def null_indexes_data
      @_null_indexes_data ||= query_module.null_indexes(
        in_format: :hash,
        args: { min_relation_size_mb: 0 }
      )
    end

    def index_scans_data
      @_index_scans_data ||= query_module.index_scans(in_format: :hash)
    end

    def indexes_data
      @_indexes_data ||= query_module.indexes(in_format: :hash)
    end

    private

    def query_module
      RubyPGExtras
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ruby-pg-extras-3.2.3 lib/ruby-pg-extras/index_info.rb