lib/generators/metka/strategies/materialized_view/templates/migration.rb.erb in metka-0.1.2 vs lib/generators/metka/strategies/materialized_view/templates/migration.rb.erb in metka-1.0.0
- old
+ new
@@ -1,40 +1,47 @@
# 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 $$
+ CREATE OR REPLACE FUNCTION metka_refresh_<%= view_name %>_materialized_view() RETURNS trigger LANGUAGE plpgsql AS $$
BEGIN
IF TG_OP = 'INSERT' AND NEW.<%= source_column_name %> IS NOT NULL THEN
REFRESH MATERIALIZED VIEW CONCURRENTLY <%= view_name %>;
- ELSIF TG_OP = 'UPDATE' AND OLD.<%= source_column_name %> IS NOT NULL AND NEW.<%= source_column_name %> IS NOT NULL THEN
+ END IF;
+
+ IF TG_OP = 'UPDATE' AND OLD.<%= source_column_name %> != NEW.<%= source_column_name %> THEN
REFRESH MATERIALIZED VIEW CONCURRENTLY <%= view_name %>;
- ELSIF TG_OP = 'DELETE' AND OLD.<%= source_column_name %> IS NOT NULL THEN
+ END IF;
+
+ IF TG_OP = 'DELETE' AND OLD.<%= source_column_name %> IS NOT NULL THEN
REFRESH MATERIALIZED VIEW CONCURRENTLY <%= view_name %>;
END IF;
+ RETURN NEW;
+ END $$;
- RETURN NULL;
- END $$;
+ DROP MATERIALIZED VIEW IF EXISTS <%= view_name %>;
+ CREATE MATERIALIZED VIEW <%= view_name %> AS
+ SELECT UNNEST
+ ( <%= source_column_name %> ) AS <%= source_column_name.singularize %>_name,
+ COUNT ( * ) AS taggings_count
+ FROM
+ <%= source_table_name %>
+ GROUP BY
+ <%= source_column_name.singularize %>_name;
- CREATE OR REPLACE MATERIALZIED VIEW <%= view_name %> AS
+ CREATE UNIQUE INDEX idx_<%= source_table_name %>_<%= source_column_name %> ON <%= view_name %>(<%= source_column_name.singularize %>_name);
- SELECT UNNEST
- ( <%= source_column_name %> ) AS <%= source_column_name.singularize %>_name,
- COUNT ( * ) AS taggings_count
- FROM
- <%= source_table_name %>
- GROUP BY
- <%= source_column_name.singularize %>_name;
-
CREATE TRIGGER metka_on_<%= source_table_name %>
- BEFORE UPDATE OR INSERT OR DELETE ON <%= source_table_name %> FOR EACH ROW
- EXECUTE PROCEDURE metka_refresh_<%= view_name %>_materialized_view();
+ 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 VIEW <%= view_name %>;
+ DROP TRIGGER IF EXISTS metka_on_<%= source_table_name %> ON <%= source_table_name %>;
+ DROP FUNCTION IF EXISTS metka_refresh_<%= view_name %>_materialized_view;
+ DROP MATERIALIZED VIEW IF EXISTS <%= view_name %>;
SQL
end
end