class PGTrunk::Operations::Statistics::CreateStatistics

@private

Public Instance Methods

invert() click to toggle source
# File lib/pg_trunk/operations/statistics/create_statistics.rb, line 146
def invert
  irreversible!("if_not_exists: true") if if_not_exists
  DropStatistics.new(**to_h)
end
to_sql(version) click to toggle source
# File lib/pg_trunk/operations/statistics/create_statistics.rb, line 140
def to_sql(version)
  check_version!(version)

  [create_statistics, *create_comment, register_object].join(" ")
end

Private Instance Methods

check_version!(version) click to toggle source
# File lib/pg_trunk/operations/statistics/create_statistics.rb, line 153
    def check_version!(version)
      raise <<~ERROR.squish if version < "14" && expressions.present?
        Statistics for expressions are supported in PostgreSQL v14+"
      ERROR

      raise <<~ERROR.squish if version < "12" && kinds.include?(:mcv)
        The `mcv` kind is supported in PostgreSQL v12+
      ERROR
    end
create_comment() click to toggle source
# File lib/pg_trunk/operations/statistics/create_statistics.rb, line 172
def create_comment
  return if comment.blank?

  "COMMENT ON STATISTICS #{name.to_sql} IS $comment$#{comment}$comment$;"
end
create_statistics() click to toggle source
# File lib/pg_trunk/operations/statistics/create_statistics.rb, line 163
def create_statistics
  sql = "CREATE STATISTICS"
  sql << " IF NOT EXISTS" if if_not_exists
  sql << " #{name.to_sql}"
  sql << " (#{kinds.join(',')})" if kinds.present?
  sql << " ON #{parts.join(', ')}"
  sql << "FROM #{table.to_sql};"
end
register_object() click to toggle source
# File lib/pg_trunk/operations/statistics/create_statistics.rb, line 178
    def register_object
      <<~SQL
        INSERT INTO pg_trunk(oid, classid)
        SELECT s.oid, 'pg_statistic_ext'::regclass
        FROM pg_statistic_ext s
          JOIN pg_class t ON t.oid = s.stxrelid
        WHERE s.stxname = #{name.quoted}
          AND s.stxnamespace = #{name.namespace}
          AND t.relname = #{table.quoted}
          AND t.relnamespace = #{table.namespace}
        ON CONFLICT DO NOTHING;
      SQL
    end