46 lines
1.8 KiB
JavaScript
46 lines
1.8 KiB
JavaScript
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 ORDER BY tags.priority DESC) 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;
|
|
`);
|
|
};
|