exports.up = async function(knex) { await knex.schema.createMaterializedView('media_sfw', (view) => { view.as(knex('media').select('id').where('is_sfw', true)); }); await knex.raw('CREATE UNIQUE INDEX media_sfw_id ON media_sfw(id)'); await knex.raw(` CREATE OR REPLACE FUNCTION get_random_sfw_media_id() RETURNS varchar AS $$ SELECT id FROM media_sfw ORDER BY random() LIMIT 1; $$ LANGUAGE sql STABLE; `); }; exports.down = async function(knex) { await knex.raw(` CREATE OR REPLACE FUNCTION get_random_sfw_media_id() RETURNS varchar AS $$ SELECT id FROM media WHERE is_sfw = true ORDER BY random() LIMIT 1; $$ LANGUAGE sql STABLE; `); await knex.schema.dropMaterializedView('media_sfw'); };