forked from DebaucheryLibrarian/traxxx
59 lines
1.8 KiB
JavaScript
59 lines
1.8 KiB
JavaScript
exports.up = async (knex) => {
|
|
await knex.schema.alterTable('random_campaign', (table) => {
|
|
table.integer('id')
|
|
.notNullable()
|
|
.references('id')
|
|
.inTable('campaigns');
|
|
});
|
|
|
|
await knex.raw(`
|
|
CREATE OR REPLACE FUNCTION get_random_campaign(min_ratio decimal default 0, max_ratio decimal default 1000.0) RETURNS random_campaign AS $$
|
|
SELECT * FROM (
|
|
SELECT DISTINCT ON (CASE WHEN parent_id IS NOT NULL THEN parent_id ELSE entity_id END)
|
|
banner_id, url, entity_id, affiliate_id, parent_id, id
|
|
FROM (
|
|
SELECT
|
|
campaigns.*, entities.parent_id as parent_id
|
|
FROM campaigns
|
|
LEFT JOIN entities ON entities.id = campaigns.entity_id
|
|
LEFT JOIN banners ON banners.id = campaigns.banner_id
|
|
WHERE banner_id IS NOT NULL
|
|
AND ratio >= min_ratio
|
|
AND ratio <= max_ratio
|
|
ORDER BY RANDOM()
|
|
) random_campaigns
|
|
) random_banners
|
|
ORDER BY RANDOM()
|
|
LIMIT 1;
|
|
$$ LANGUAGE SQL STABLE;
|
|
`);
|
|
};
|
|
|
|
exports.down = async (knex) => {
|
|
await knex.schema.alterTable('random_campaign', (table) => {
|
|
table.dropColumn('campaign_id');
|
|
});
|
|
|
|
await knex.raw(`
|
|
CREATE OR REPLACE FUNCTION get_random_campaign(min_ratio decimal default 0, max_ratio decimal default 1000.0) RETURNS random_campaign AS $$
|
|
SELECT * FROM (
|
|
SELECT DISTINCT ON (CASE WHEN parent_id IS NOT NULL THEN parent_id ELSE entity_id END)
|
|
banner_id, url, entity_id, affiliate_id, parent_id
|
|
FROM (
|
|
SELECT
|
|
campaigns.*, entities.parent_id as parent_id
|
|
FROM campaigns
|
|
LEFT JOIN entities ON entities.id = campaigns.entity_id
|
|
LEFT JOIN banners ON banners.id = campaigns.banner_id
|
|
WHERE banner_id IS NOT NULL
|
|
AND ratio >= min_ratio
|
|
AND ratio <= max_ratio
|
|
ORDER BY RANDOM()
|
|
) random_campaigns
|
|
) random_banners
|
|
ORDER BY RANDOM()
|
|
LIMIT 1;
|
|
$$ LANGUAGE SQL STABLE;
|
|
`);
|
|
};
|