const config = require('config'); exports.up = async (knex) => { await knex.raw(` CREATE MATERIALIZED VIEW releases_summaries AS ( SELECT releases.id as release_id, channels.slug as channel_slug, channels.type as channel_type, networks.slug as network_slug, networks.type as network_type, parent_networks.slug as parent_network_slug, parent_networks.type as parent_network_type, studios.showcased IS NOT false AND (channels.showcased IS NOT false OR COALESCE(studios.showcased, false) = true) AND (networks.showcased IS NOT false OR COALESCE(channels.showcased, false) = true OR COALESCE(studios.showcased, false) = true) AS showcased, releases.effective_date, releases.created_at, array_agg(tags.slug) FILTER (WHERE tags.slug IS NOT NULL) AS tags FROM releases LEFT JOIN releases_tags ON releases_tags.release_id = releases.id LEFT JOIN tags ON tags.id = releases_tags.tag_id LEFT JOIN entities AS channels ON channels.id = releases.entity_id LEFT JOIN entities AS studios ON studios.id = releases.studio_id LEFT JOIN entities AS networks ON networks.id = channels.parent_id LEFT JOIN entities AS parent_networks ON parent_networks.id = networks.parent_id GROUP BY releases.id, studios.showcased, channels.showcased, channels.slug, channels.type, networks.showcased, networks.slug, networks.type, parent_networks.slug, parent_networks.type ); COMMENT ON MATERIALIZED VIEW releases_summaries IS E'@foreignKey (release_id) references releases (id)'; GRANT ALL ON ALL TABLES IN SCHEMA public TO :visitor; `, { visitor: knex.raw(config.database.query.user), }); }; exports.down = async (knex) => { await knex.raw(` DROP MATERIALIZED VIEW IF EXISTS releases_summaries; `); };