lib/generators/metka/strategies/materialized_view/templates/migration.rb.erb in metka-1.0.3 vs lib/generators/metka/strategies/materialized_view/templates/migration.rb.erb in metka-2.0.0
- old
+ new
@@ -3,44 +3,51 @@
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 NEW.<%= source_column_name %> IS NOT NULL THEN
+ 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 OLD.<%= source_column_name %> != NEW.<%= source_column_name %> THEN
+ 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 OLD.<%= source_column_name %> IS NOT NULL THEN
+ 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 UNNEST
- ( <%= source_column_name %> ) AS <%= source_column_name.singularize %>_name,
- COUNT ( * ) AS taggings_count
- FROM
- <%= source_table_name %>
+ SELECT
+ tag_name,
+ COUNT(*) AS taggings_count
+ FROM (
+ SELECT UNNEST
+ (<%= source_columns.join(' || ') %>) AS tag_name
+ FROM
+ <%= source_table_name %>
+ ) subquery
GROUP BY
- <%= source_column_name.singularize %>_name;
+ tag_name;
- CREATE UNIQUE INDEX idx_<%= source_table_name %>_<%= source_column_name %> ON <%= view_name %>(<%= source_column_name.singularize %>_name);
+ CREATE UNIQUE INDEX idx_<%= source_table_name %>_<%= source_columns_names %> ON <%= view_name %>(tag_name);
- CREATE TRIGGER metka_on_<%= source_table_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 %> ON <%= source_table_name %>;
+ 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