View Source Vtc.Ecto.Postgres.PgFramestamp.Migrations (vtc v0.13.0)

Migrations for adding framestamp types, functions and constraints to a Postgres database.

Link to this section Summary

Full

Adds raw SQL queries to a migration for creating the database types, associated functions, casts, operators, and operator families.

Pg Constraints

Creates basic constraints for a PgFramestamp / Framestamp database field.

Pg Types

Up to two schemas are created as detailed by the Configuring Database Objects section above.

Adds framestamp composite type.

Pg Operators

Creates a custom :framestamp, :framestamp = operator that returns true if the real-world seconds values for both framestamps are equal.

Creates a custom :framestamp, :framestamp > operator.

Creates a custom :framestamp, :framestamp >= operator.

Creates a custom :framestamp, :framestamp < operator.

Creates a custom :framestamp, :framestamp <= operator.

Creates a custom :framestamp, :framestamp != operator that returns true if the real-world seconds values for both framestamps are not equal.

Creates a custom :framestamp, :framestamp <> operator that returns true if the real-world seconds values for both framestamps are not equal.

Creates a custom :framestamp, :framestamp === operator that returns true if both the real-world seconds values and the framerates for both framestamps are equal.

Creates a custom :framestamp, :framestamp !=== operator that returns true if a and b do not have the same real-world-seconds, framerate playback, or framerate tags.

Pg Operator Classes

Creates a B-tree operator class to support indexing on comparison operations.

Pg Functions

Creates framestamp_private.new(seconds, rate) that rounds seconds to the nearest whole frame based on rate and returns a constructed framestamp.

Pg Private Functions

Creates framestamp_private.cmp(a, b) used in the PgTimecode b-tree operator class.

Creates framestamp_private.eq(a, b) that backs the = operator.

Creates framestamp_private.gt(a, b) that backs the > operator.

Creates framestamp_private.gte(a, b) that backs the >= operator.

Creates framestamp_private.lt(a, b) that backs the < operator.

Creates framestamp_private.lte(a, b) that backs the <= operator.

Creates framestamp_private.neq(a, b) that backs the <> operator.

Creates framestamp_private.strict_eq(a, b) that backs the === operator.

Creates framestamp_private.strict_neq(a, b) that backs the !=== operator.

Functions

Returns the config-qualified name of the function for this type.

Link to this section Full

@spec create_all() :: :ok

Adds raw SQL queries to a migration for creating the database types, associated functions, casts, operators, and operator families.

Safe to run multiple times when new functionality is added in updates to this library. Existing values will be skipped.

types-created

Types Created

Calling this macro creates the following type definitions:

CREATE TYPE framestamp AS (
  seconds rational,
  rate framerate
);

schemas-created

Schemas Created

Up to two schemas are created as detailed by the Configuring Database Objects section below.

configuring-database-objects

Configuring Database Objects

To change where supporting functions are created, add the following to your Repo confiugration:

config :vtc, Vtc.Test.Support.Repo,
  adapter: Ecto.Adapters.Postgres,
  ...
  vtc: [
    pg_framestamp: [
      functions_schema: :framestamp,
      functions_private_schema: :framestamp_private,
      functions_prefix: "framestamp"
    ]
  ]

Option definitions are as follows:

  • functions_schema: The schema for "public" functions that will have backwards compatibility guarantees and application code support. Default: :public.

  • functions_private_schema: The schema for for developer-only "private" functions that support the functions in the "framestamp" schema. Will NOT have backwards compatibility guarantees NOR application code support. Default: :public.

  • functions_prefix: A prefix to add before all functions. Defaults to "framestamp" for any function created in the "public" schema, and "" otherwise.

examples

Examples

defmodule MyMigration do
  use Ecto.Migration

  alias Vtc.Ecto.Postgres.PgFramestamp
  require PgFramestamp.Migrations

  def change do
    PgFramestamp.Migrations.create_all()
  end
end

Link to this section Pg Constraints

Link to this function

create_field_constraints(table, field)

View Source
@spec create_field_constraints(atom(), atom()) :: :ok

Creates basic constraints for a PgFramestamp / Framestamp database field.

constraints-created

Constraints created:

  • {field}_rate_positive: Checks that the playback speed is positive.

  • {field}_rate_ntsc_tags: Checks that both drop and non_drop are not set at the same time.

  • {field}_rate_ntsc_valid: Checks that NTSC framerates are mathematically sound, i.e., that the rate is equal to (round(rate.playback) * 1000) / 1001.

  • {field}_rate_ntsc_drop_valid: Checks that NTSC, drop-frame framerates are valid, i.e, are cleanly divisible by 30_000/1001.

  • {field_name}_seconds_divisible_by_rate: Checks that the seconds value of the framestamp is cleanly divisible by the rate.playback value.

examples

Examples

create table("my_table", primary_key: false) do
  add(:id, :uuid, primary_key: true, null: false)
  add(:a, Framestamp.type())
  add(:b, Framestamp.type())
end

PgRational.migration_add_field_constraints(:my_table, :a)
PgRational.migration_add_field_constraints(:my_table, :b)

Link to this section Pg Types

Link to this function

create_function_schemas()

View Source
@spec create_function_schemas() :: :ok

Up to two schemas are created as detailed by the Configuring Database Objects section above.

Link to this function

create_type_framestamp()

View Source
@spec create_type_framestamp() :: :ok

Adds framestamp composite type.

Link to this section Pg Operators

@spec create_op_eq() :: :ok

Creates a custom :framestamp, :framestamp = operator that returns true if the real-world seconds values for both framestamps are equal.

@spec create_op_gt() :: :ok

Creates a custom :framestamp, :framestamp > operator.

@spec create_op_gte() :: :ok

Creates a custom :framestamp, :framestamp >= operator.

@spec create_op_lt() :: :ok

Creates a custom :framestamp, :framestamp < operator.

@spec create_op_lte() :: :ok

Creates a custom :framestamp, :framestamp <= operator.

@spec create_op_neq2() :: :ok

Creates a custom :framestamp, :framestamp != operator that returns true if the real-world seconds values for both framestamps are not equal.

@spec create_op_neq() :: :ok

Creates a custom :framestamp, :framestamp <> operator that returns true if the real-world seconds values for both framestamps are not equal.

@spec create_op_strict_eq() :: :ok

Creates a custom :framestamp, :framestamp === operator that returns true if both the real-world seconds values and the framerates for both framestamps are equal.

@spec create_op_strict_neq() :: :ok

Creates a custom :framestamp, :framestamp !=== operator that returns true if a and b do not have the same real-world-seconds, framerate playback, or framerate tags.

Link to this section Pg Operator Classes

@spec create_op_class_btree() :: :ok

Creates a B-tree operator class to support indexing on comparison operations.

Link to this section Pg Functions

Link to this function

create_func_with_seconds()

View Source
@spec create_func_with_seconds() :: :ok

Creates framestamp_private.new(seconds, rate) that rounds seconds to the nearest whole frame based on rate and returns a constructed framestamp.

Link to this section Pg Private Functions

@spec create_func_cmp() :: :ok

Creates framestamp_private.cmp(a, b) used in the PgTimecode b-tree operator class.

@spec create_func_eq() :: :ok

Creates framestamp_private.eq(a, b) that backs the = operator.

@spec create_func_gt() :: :ok

Creates framestamp_private.gt(a, b) that backs the > operator.

@spec create_func_gte() :: :ok

Creates framestamp_private.gte(a, b) that backs the >= operator.

@spec create_func_lt() :: :ok

Creates framestamp_private.lt(a, b) that backs the < operator.

@spec create_func_lte() :: :ok

Creates framestamp_private.lte(a, b) that backs the <= operator.

@spec create_func_neq() :: :ok

Creates framestamp_private.neq(a, b) that backs the <> operator.

@spec create_func_strict_eq() :: :ok

Creates framestamp_private.strict_eq(a, b) that backs the === operator.

Link to this function

create_func_strict_neq()

View Source
@spec create_func_strict_neq() :: :ok

Creates framestamp_private.strict_neq(a, b) that backs the !=== operator.

Link to this section Functions

@spec function(atom(), Ecto.Repo.t()) :: String.t()

Returns the config-qualified name of the function for this type.