module ActiveRecordViews::Extension::ClassMethods

Public Instance Methods

ensure_populated!() click to toggle source
# File lib/active_record_views/extension.rb, line 90
def ensure_populated!
  ActiveRecordViews.get_view_direct_dependencies(self.connection, self.table_name).each do |class_name|
    klass = class_name.constantize
    klass.ensure_populated!
  end

  if ActiveRecordViews.materialized_view?(self.connection, self.table_name)
    refresh_view! unless view_populated?
  end
end
is_view(*args) click to toggle source
# File lib/active_record_views/extension.rb, line 20
def is_view(*args)
  cattr_accessor :view_options
  self.view_options = args.extract_options!

  raise ArgumentError, "wrong number of arguments (#{args.size} for 0..1)" unless (0..1).cover?(args.size)
  sql = args.shift

  sql ||= begin
    sql_path = ActiveRecordViews.find_sql_file(self.name.underscore)
    ActiveRecordViews.register_for_reload self, sql_path
    ActiveRecordViews.read_sql_file(self, sql_path)
  end

  create_args = [self.table_name, self.name, sql, self.view_options]
  if ActiveRecordViews::Extension.create_enabled
    ActiveRecordViews.create_view self.connection, *create_args
  else
    ActiveRecordViews::Extension.create_queue << create_args
  end
end
refresh_view!(options = {}) click to toggle source
# File lib/active_record_views/extension.rb, line 41
def refresh_view!(options = {})
  options.assert_valid_keys :concurrent

  concurrent = case options.fetch(:concurrent, :auto)
  when false
    false
  when true
    true
  when :auto
    view_options.fetch(:unique_columns, nil) && view_populated? && ActiveRecordViews.supports_concurrent_refresh?(connection)
  else
    raise ArgumentError, 'invalid concurrent option'
  end

  connection.transaction do
    connection.execute "REFRESH MATERIALIZED VIEW#{' CONCURRENTLY' if concurrent} #{connection.quote_table_name self.table_name};"
    connection.execute "UPDATE active_record_views SET refreshed_at = current_timestamp AT TIME ZONE 'UTC' WHERE name = #{connection.quote self.table_name};"
    connection.clear_query_cache
  end
end
refreshed_at() click to toggle source
# File lib/active_record_views/extension.rb, line 76
      def refreshed_at
        value = connection.select_value(<<-SQL.squish)
          SELECT refreshed_at
          FROM active_record_views
          WHERE name = #{connection.quote self.table_name};
        SQL

        if value.is_a? String
          value = ActiveSupport::TimeZone['UTC'].parse(value)
        end

        value
      end
view_populated?() click to toggle source
# File lib/active_record_views/extension.rb, line 62
      def view_populated?
        value = connection.select_value(<<-SQL.squish)
          SELECT ispopulated
          FROM pg_matviews
          WHERE schemaname = 'public' AND matviewname = #{connection.quote self.table_name};
        SQL

        if value.nil?
          raise ArgumentError, 'not a materialized view'
        end

        value
      end