diff --git a/representatives_recommendations/migrations/0007_fix_underflow.py b/representatives_recommendations/migrations/0007_fix_underflow.py new file mode 100644 index 0000000000000000000000000000000000000000..8510fd85c9f6911495b69bf05ff24a87e25594d0 --- /dev/null +++ b/representatives_recommendations/migrations/0007_fix_underflow.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('representatives_recommendations', '0006_score_formula'), + ] + + operations = [ + migrations.RunSQL( + """ + CREATE FUNCTION decay_score( + score NUMERIC, + vote_date timestamp with time zone, + decay_num NUMERIC, + decay_denom NUMERIC, + exponent NUMERIC, + decimals integer) + RETURNS NUMERIC AS $$ + SELECT ROUND( + CAST( + $1 * EXP( + GREATEST( + -700, + LEAST( + 700, + -(($3 * EXTRACT(days FROM CURRENT_DATE - $2) / $4) ^ (2 * $5)) + ) + ) + ) + AS NUMERIC + ), + $6 + ) + $$ LANGUAGE SQL; + """ + ), + + migrations.RunSQL( + """ + CREATE OR REPLACE VIEW "representatives_recommendations_votescores" + AS SELECT + representatives_votes_vote.id, + representatives_votes_vote."position", + representatives_votes_vote.proposal_id, + representatives_votes_vote.representative_id, + decay_score( + CAST(CASE + WHEN representatives_votes_vote."position"::text = representatives_recommendations_recommendation.recommendation::text THEN representatives_recommendations_recommendation.weight + ELSE 0 - representatives_recommendations_recommendation.weight + END AS NUMERIC), + representatives_votes_proposal.datetime, + decay_num.value, + decay_denom.value, + exponent.value, + decimals.value + ) AS score + FROM representatives_votes_vote + JOIN (SELECT CAST(TO_NUMBER(value, '99999') AS NUMERIC) AS value FROM memopol_settings_setting WHERE key = 'SCORE_DECAY_NUM') decay_num ON 1=1 + JOIN (SELECT CAST(TO_NUMBER(value, '99999') AS NUMERIC) AS value FROM memopol_settings_setting WHERE key = 'SCORE_DECAY_DENOM') decay_denom ON 1=1 + JOIN (SELECT CAST(TO_NUMBER(value, '99999') AS NUMERIC) AS value FROM memopol_settings_setting WHERE key = 'SCORE_EXPONENT') exponent ON 1=1 + JOIN (SELECT CAST(TO_NUMBER(value, '99999') AS INTEGER) AS value FROM memopol_settings_setting WHERE key = 'SCORE_DECIMALS') decimals ON 1=1 + JOIN representatives_votes_proposal ON representatives_votes_vote.proposal_id = representatives_votes_proposal.id + LEFT JOIN representatives_recommendations_recommendation ON representatives_votes_proposal.id = representatives_recommendations_recommendation.proposal_id + WHERE representatives_recommendations_recommendation.id IS NOT NULL; + """ + ), + ]