Sha256: b8e0cf3b08523c7212217f1f0595f84c660ed51fb06623bda52921162379f6dd

Contents?: true

Size: 1.98 KB

Versions: 12

Compression:

Stored size: 1.98 KB

Contents

# frozen_string_literal: true

class <%= @migration_class_name %> < ActiveRecord::Migration<%= ActiveRecord::VERSION::MAJOR < 5 ? '' : '[5.0]' %>
  def up
    execute <<-SQL
    CREATE OR REPLACE FUNCTION metka_refresh_<%= view_name %>_materialized_view() RETURNS trigger LANGUAGE plpgsql AS $$
      BEGIN
        IF TG_OP = 'INSERT' AND
           (<%= source_columns.map { |column| "NEW.#{column} IS NOT NULL" }.join(' OR ') %>) THEN
          REFRESH MATERIALIZED VIEW CONCURRENTLY <%= view_name %>;
        END IF;

        IF TG_OP = 'UPDATE' AND
           (<%= source_columns.map { |column| "OLD.#{column} IS DISTINCT FROM NEW.#{column}" }.join(' OR ') %>) THEN
          REFRESH MATERIALIZED VIEW CONCURRENTLY <%= view_name %>;
        END IF;

        IF TG_OP = 'DELETE' AND
           (<%= source_columns.map { |column| "OLD.#{column} IS NOT NULL" }.join(' OR ') %>) THEN
          REFRESH MATERIALIZED VIEW CONCURRENTLY <%= view_name %>;
        END IF;
        RETURN NEW;
      END $$;

    DROP MATERIALIZED VIEW IF EXISTS <%= view_name %>;
    CREATE MATERIALIZED VIEW <%= view_name %> AS
      SELECT
        tag_name,
        COUNT(*) AS taggings_count
      FROM (
        SELECT UNNEST
          (<%= source_columns.join(' || ') %>) AS tag_name
        FROM
          <%= source_table_name %>
      ) subquery
      GROUP BY
        tag_name;

    CREATE UNIQUE INDEX idx_<%= source_table_name %>_<%= source_columns_names %> ON <%= view_name %>(tag_name);

    CREATE TRIGGER metka_on_<%= source_table_name %>_<%= source_columns_names %>
    AFTER UPDATE OR INSERT OR DELETE ON <%= source_table_name %> FOR EACH ROW
    EXECUTE PROCEDURE metka_refresh_<%= view_name %>_materialized_view();
    SQL
  end

  def down
    execute <<-SQL
      DROP TRIGGER IF EXISTS metka_on_<%= source_table_name %>_<%= source_columns_names %> ON <%= source_table_name %>;
      DROP FUNCTION IF EXISTS metka_refresh_<%= view_name %>_materialized_view;
      DROP MATERIALIZED VIEW IF EXISTS <%= view_name %>;
    SQL
  end
end

Version data entries

12 entries across 12 versions & 1 rubygems

Version Path
metka-2.3.4 lib/generators/metka/strategies/materialized_view/templates/migration.rb.erb
metka-2.3.3 lib/generators/metka/strategies/materialized_view/templates/migration.rb.erb
metka-2.3.2 lib/generators/metka/strategies/materialized_view/templates/migration.rb.erb
metka-2.3.1 lib/generators/metka/strategies/materialized_view/templates/migration.rb.erb
metka-2.3.0 lib/generators/metka/strategies/materialized_view/templates/migration.rb.erb
metka-2.2.1 lib/generators/metka/strategies/materialized_view/templates/migration.rb.erb
metka-2.2.0 lib/generators/metka/strategies/materialized_view/templates/migration.rb.erb
metka-2.1.0 lib/generators/metka/strategies/materialized_view/templates/migration.rb.erb
metka-2.0.3 lib/generators/metka/strategies/materialized_view/templates/migration.rb.erb
metka-2.0.2 lib/generators/metka/strategies/materialized_view/templates/migration.rb.erb
metka-2.0.1 lib/generators/metka/strategies/materialized_view/templates/migration.rb.erb
metka-2.0.0 lib/generators/metka/strategies/materialized_view/templates/migration.rb.erb