Module: Scenic::Statements

Defined in:
lib/scenic/statements.rb

Overview

Methods that are made available in migrations for managing Scenic views.

Instance Method Summary collapse

Instance Method Details

#create_view(name, version: 1, sql_definition: nil, materialized: false) ⇒ Object

Create a new database view.

Examples:

Create from db/views/searches_v02.sql

create_view(:searches, version: 2)

Create from provided SQL string

create_view(:active_users, sql_definition: "  SELECT * FROM users WHERE users.active = 't'\n")

Parameters:

  • name (String, Symbol)

    The name of the database view.

  • version (Fixnum) (defaults to: 1)

    The version number of the view, used to find the definition file in db/views. This defaults to 1 if not provided.

  • sql_definition (String) (defaults to: nil)

    The SQL query for the view schema. If both sql_defintiion and version are provided, sql_definition takes prescedence.

  • materialized (Boolean) (defaults to: false)

    Set to true to create a materialized view. Defaults to false.

Returns:

  • The database response from executing the create statement.



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/scenic/statements.rb', line 24

def create_view(name, version: 1, sql_definition: nil, materialized: false)
  if version.blank? && sql_definition.nil?
    raise(
      ArgumentError,
      "view_definition or version_number must be specified"
    )
  end

  sql_definition ||= definition(name, version)

  if materialized
    Scenic.database.create_materialized_view(name, sql_definition)
  else
    Scenic.database.create_view(name, sql_definition)
  end
end

#drop_view(name, revert_to_version: nil, materialized: false) ⇒ Object

Drop a database view by name.

Examples:

Drop a view, rolling back to version 3 on rollback

drop_view(:users_who_recently_logged_in, revert_to_version: 3)

Parameters:

  • name (String, Symbol)

    The name of the database view.

  • revert_to_version (Fixnum) (defaults to: nil)

    Used to reverse the drop_view command on rake db:rollback. The provided version will be passed as the version argument to #create_view.

  • materialized (Boolean) (defaults to: false)

    Set to true if dropping a meterialized view. defaults to false.

Returns:

  • The database response from executing the drop statement.



54
55
56
57
58
59
60
# File 'lib/scenic/statements.rb', line 54

def drop_view(name, revert_to_version: nil, materialized: false)
  if materialized
    Scenic.database.drop_materialized_view(name)
  else
    Scenic.database.drop_view(name)
  end
end

#update_view(name, version: nil, revert_to_version: nil, materialized: false) ⇒ Object

Update a database view to a new version.

The existing view is dropped and recreated using the supplied version parameter.

Examples:

update_view :engagement_reports, version: 3, revert_to_version: 2

Parameters:

  • name (String, Symbol)

    The name of the database view.

  • version (Fixnum) (defaults to: nil)

    The version number of the view.

  • revert_to_version (Fixnum) (defaults to: nil)

    The version number to rollback to on rake db rollback

  • materialized (Boolean) (defaults to: false)

    Must be false. Updating a meterialized view causes indexes on it to be dropped. For this reason you should explicitly use #drop_view followed by #create_view and recreate applicable indexes. Setting this to true will raise an error.

Returns:

  • The database response from executing the create statement.



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/scenic/statements.rb', line 80

def update_view(name, version: nil, revert_to_version: nil, materialized: false)
  if version.blank?
    raise ArgumentError, "version is required"
  end

  if materialized
    raise ArgumentError, "Updating materialized views is not supported "\
      "because it would cause any indexes to be dropped. Please use "\
      "'drop_view' followed by 'create_view', being sure to also recreate "\
      "any previously-existing indexes."
  end

  drop_view name,
    revert_to_version: revert_to_version,
    materialized: materialized
  create_view(name, version: version, materialized: materialized)
end