exports.up = async (knex) => knex.raw(` CREATE MATERIALIZED VIEW entities_stats AS WITH RECURSIVE relations AS ( SELECT entities.id, entities.parent_id, count(releases.id) AS releases_count, count(releases.id) AS total_count FROM entities LEFT JOIN releases ON releases.entity_id = entities.id GROUP BY entities.id UNION ALL SELECT entities.id AS entity_id, count(releases.id) AS releases_count, count(releases.id) + relations.total_count AS total_count FROM entities INNER JOIN relations ON relations.id = entities.parent_id LEFT JOIN releases ON releases.entity_id = entities.id GROUP BY entities.id ) SELECT relations.id AS entity_id, relations.releases_count FROM relations; `); exports.down = async (knex) => knex.raw(` DROP MATERIALIZED VIEW entities_stats; `);