class Scenic::Adapters::Mysql

An adapter for managing MySQL views.

These methods are used interally by Scenic and are not intended for direct use. Methods that alter database schema are intended to be called via {Statements}, while {#refresh_materialized_view} is called via {Scenic.database}.

The methods are documented here for insight into specifics of how Scenic integrates with Postgres and the responsibilities of {Adapters}.

Constants

VERSION

Attributes

connectable[R]

Public Class Methods

new(connectable = ActiveRecord::Base) click to toggle source

Creates an instance of the Scenic Postgres adapter.

This is the default adapter for Scenic. Configuring it via {Scenic.configure} is not required, but the example below shows how one would explicitly set it.

@param [#connection] connectable An object that returns the connection

for Scenic to use. Defaults to `ActiveRecord::Base`.

@example

Scenic.configure do |config|
  config.adapter = Scenic::Adapters::Postgres.new
end
# File lib/scenic/adapters/mysql.rb, line 37
def initialize(connectable = ActiveRecord::Base)
  @connectable = connectable
end

Public Instance Methods

create_materialized_view(name, sql_definition) click to toggle source

Creates a materialized view in the database

@param name The name of the materialized view to create @param sql_definition The SQL schema that defines the materialized view.

This is typically called in a migration via {Statements#create_view}.

@raise [MaterializedViewsNotSupportedError] if the version of Postgres

in use does not support materialized views.

@return [void]

# File lib/scenic/adapters/mysql.rb, line 106
def create_materialized_view(name, sql_definition)
  raise_unless_materialized_views_supported
end
create_view(name, sql_definition) click to toggle source

Creates a view in the database.

This is typically called in a migration via {Statements#create_view}.

@param name The name of the view to create @param sql_definition The SQL schema for the view.

@return [void]

# File lib/scenic/adapters/mysql.rb, line 59
def create_view(name, sql_definition)
  execute "CREATE VIEW #{quote_table_name(name)} AS #{sql_definition};"
end
drop_materialized_view(name) click to toggle source

Drops a materialized view in the database

This is typically called in a migration via {Statements#update_view}.

@param name The name of the materialized view to drop. @raise [MaterializedViewsNotSupportedError] if the version of Postgres

in use does not support materialized views.

@return [void]

# File lib/scenic/adapters/mysql.rb, line 138
def drop_materialized_view(name)
  raise_unless_materialized_views_supported
end
drop_view(name) click to toggle source

Drops the named view from the database

This is typically called in a migration via {Statements#drop_view}.

@param name The name of the view to drop

@return [void]

# File lib/scenic/adapters/mysql.rb, line 91
def drop_view(name)
  execute "DROP VIEW #{quote_table_name(name)};"
end
refresh_materialized_view(name, concurrently: false) click to toggle source

Refreshes a materialized view from its SQL schema.

This is typically called from application code via {Scenic.database}.

@param name The name of the materialized view to refresh. @param concurrently [Boolean] Whether the refreshs hould happen

concurrently or not. A concurrent refresh allows the view to be
refreshed without locking the view for select but requires that the
table have at least one unique index that covers all rows. Attempts to
refresh concurrently without a unique index will raise a descriptive
error.

@raise [MaterializedViewsNotSupportedError] if the version of Postgres

in use does not support materialized views.

@raise [ConcurrentRefreshesNotSupportedError] when attempting a

concurrent refresh on version of Postgres that does not support
concurrent materialized view refreshes.

@example Non-concurrent refresh

Scenic.database.refresh_materialized_view(:search_results)

@example Concurrent refresh

Scenic.database.refresh_materialized_view(:posts, concurrent: true)

@return [void]

# File lib/scenic/adapters/mysql.rb, line 166
def refresh_materialized_view(name, concurrently: false)
  raise_unless_materialized_views_supported
end
update_materialized_view(name, sql_definition) click to toggle source

Updates a materialized view in the database.

Drops and recreates the materialized view. Attempts to maintain all previously existing and still applicable indexes on the materialized view after the view is recreated.

This is typically called in a migration via {Statements#update_view}.

@param name The name of the view to update @param sql_definition The SQL schema for the updated view.

@raise [MaterializedViewsNotSupportedError] if the version of Postgres

in use does not support materialized views.

@return [void]

# File lib/scenic/adapters/mysql.rb, line 125
def update_materialized_view(name, sql_definition)
  raise_unless_materialized_views_supported
end
update_view(name, sql_definition) click to toggle source

Updates a view in the database.

This results in a {#drop_view} followed by a {#create_view}. The explicitness of that two step process is preferred to ‘CREATE OR REPLACE VIEW` because the former ensures that the view you are trying to update did, in fact, already exist. Additionally, `CREATE OR REPLACE VIEW` is allowed only to add new columns to the end of an existing view schema. Existing columns cannot be re-ordered, removed, or have their types changed. Drop and create overcomes this limitation as well.

This is typically called in a migration via {Statements#update_view}.

@param name The name of the view to update @param sql_definition The SQL schema for the updated view.

@return [void]

# File lib/scenic/adapters/mysql.rb, line 79
def update_view(name, sql_definition)
  drop_view(name)
  create_view(name, sql_definition)
end
views() click to toggle source

Returns an array of views in the database.

This collection of views is used by the [Scenic::SchemaDumper] to populate the ‘schema.rb` file.

@return [Array<Scenic::View>]

# File lib/scenic/adapters/mysql.rb, line 47
def views
  Views.new(connection).all
end

Private Instance Methods

connection() click to toggle source
# File lib/scenic/adapters/mysql.rb, line 175
def connection
  Connection.new(connectable.connection)
end
raise_unless_concurrent_refresh_supported() click to toggle source
# File lib/scenic/adapters/mysql.rb, line 185
def raise_unless_concurrent_refresh_supported
  unless connection.supports_concurrent_refreshes?
    raise ConcurrentRefreshesNotSupportedError
  end
end
raise_unless_materialized_views_supported() click to toggle source
# File lib/scenic/adapters/mysql.rb, line 179
def raise_unless_materialized_views_supported
  unless connection.supports_materialized_views?
    raise MaterializedViewsNotSupportedError
  end
end