class Scenic::Adapters::Postgres::Views

Fetches defined views from the postgres connection. @api private

Attributes

connection[R]

Public Class Methods

new(connection) click to toggle source
# File lib/scenic/adapters/postgres/views.rb, line 7
def initialize(connection)
  @connection = connection
end

Public Instance Methods

all() click to toggle source

All of the views that this connection has defined.

This will include materialized views if those are supported by the connection.

@return [Array<Scenic::View>]

# File lib/scenic/adapters/postgres/views.rb, line 17
def all
  views_from_postgres.map(&method(:to_scenic_view))
end

Private Instance Methods

pg_identifier(name) click to toggle source
# File lib/scenic/adapters/postgres/views.rb, line 59
def pg_identifier(name)
  return name if /^[a-zA-Z_][a-zA-Z0-9_]*$/.match?(name)

  pgconn.quote_ident(name)
end
pgconn() click to toggle source
# File lib/scenic/adapters/postgres/views.rb, line 65
def pgconn
  if defined?(PG::Connection)
    PG::Connection
  else
    PGconn
  end
end
to_scenic_view(result) click to toggle source
# File lib/scenic/adapters/postgres/views.rb, line 43
def to_scenic_view(result)
  namespace, viewname = result.values_at "namespace", "viewname"

  namespaced_viewname = if namespace != "public"
    "#{pg_identifier(namespace)}.#{pg_identifier(viewname)}"
  else
    pg_identifier(viewname)
  end

  Scenic::View.new(
    name: namespaced_viewname,
    definition: result["definition"].strip,
    materialized: result["kind"] == "m"
  )
end
views_from_postgres() click to toggle source
# File lib/scenic/adapters/postgres/views.rb, line 25
        def views_from_postgres
          connection.execute(<<-SQL)
            SELECT
              c.relname as viewname,
              pg_get_viewdef(c.oid) AS definition,
              c.relkind AS kind,
              n.nspname AS namespace
            FROM pg_class c
              LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
            WHERE
              c.relkind IN ('m', 'v')
              AND c.relname NOT IN (SELECT extname FROM pg_extension)
              AND c.relname != 'pg_stat_statements_info'
              AND n.nspname = ANY (current_schemas(false))
            ORDER BY c.oid
          SQL
        end