#! /usr/bin/php getUsersByAllowedAction ('project_admin',forge_get_config('peer_rating_group')) as $u) { db_query_params ('INSERT INTO user_metric0 (user_id,times_ranked,avg_raters_importance,avg_rating,metric,percentile,importance_factor) VALUES ($1,5,1.25,3,0,0,1.25)', array ($u->getID())) ; $err .= db_error(); } db_query_params ('UPDATE user_metric0 SET ranking=ranking-1', array()) ; db_query_params ('UPDATE user_metric0 SET metric=(log(times_ranked::float)*avg_rating::float)::float, percentile=(100-(100*((ranking::float-1)/(select count(*) from user_metric0))))::float', array()); $err .= db_error(); db_query_params ('UPDATE user_metric0 SET importance_factor=(1+((percentile::float/100)*.5))::float', array()) ; $err .= db_error(); db_query_params ('SELECT * INTO TEMPORARY TABLE user_metric_cur FROM user_metric0', array()) ; $err .= db_error(); for ($i=1; $i<9; $i++) { $j=($i-1); /* Set up an interim table to grab and average all trusted result */ db_drop_table_if_exists ("user_metric_tmp_next"); db_drop_table_if_exists ("user_metric_next"); $res = db_query_params ('CREATE TEMPORARY TABLE user_metric_tmp_next ( user_id int not null default 0, times_ranked float(8) null default 0, avg_raters_importance float(8) not null default 0, avg_rating float(8) not null default 0, metric float(8) not null default 0)', array()) ; if (!$res) { $err .= "Error in round $i creating table: " . db_error(); exit; } /* Now grab/average trusted ratings into this table */ $res = db_query_params ('INSERT INTO user_metric_tmp_next SELECT user_ratings.user_id,count(*) AS count, avg(user_metric_cur.importance_factor), avg(user_ratings.rating),0 FROM user_ratings,user_metric_cur WHERE user_ratings.rated_by=user_metric_cur.user_id GROUP BY user_ratings.user_id', array()) ; if (!$res) { $err .= "Error in round $i inserting average ratings: " . db_error(); exit; } /* Now calculate the metric on the temp table This metric will be used in the next step to calculate ranking and importance */ $res = db_query_params ('UPDATE user_metric_tmp_next SET metric=(log(times_ranked)*avg_raters_importance*avg_rating)', array()) ; if (!$res) { $err .= "Error in round $i calculating metric: " . db_error(); exit; } $res = db_query_params ('DELETE FROM user_metric_tmp_next WHERE metric < $1', array ($threshhold)) ; if (!$res) { $err .= "Error in round $i deleting < threshhold ids: " . db_error(); exit; } /* Now we need to carry forward trusted IDs from the last round into this Round, as prior round people may not have been ranked enough times by new people in this round to stay in */ $res = db_query_params ('INSERT INTO user_metric_tmp_next SELECT user_id,times_ranked,avg_raters_importance,avg_rating,metric FROM user_metric_cur WHERE NOT EXISTS (SELECT user_id FROM user_metric_tmp_next WHERE user_metric_tmp_next.user_id=user_metric_cur.user_id)', array ()) ; if (!$res) { $err .= "Error in round $i inserting final data: " . db_error(); exit; } /* Now calculate the metric for this round Create the final table, then insert the data */ db_drop_table_if_exists ("user_metric_next"); db_drop_sequence_if_exists ("user_metric_next_ranking_seq"); $res = db_query_params ('CREATE TEMPORARY TABLE user_metric_next ( ranking serial, user_id int not null default 0, times_ranked int not null default 0, avg_raters_importance float(8) not null default 0, avg_rating float(8) not null default 0, metric float(8) not null default 0, percentile float(8) not null default 0, importance_factor float(8) not null default 0)', array ()) ; if (!$res) { $err .= "Error in round $i creating table: " . db_error(); exit; } /* Insert the data in ranked order */ $res = db_query_params ('INSERT INTO user_metric_next (user_id,times_ranked,avg_raters_importance,avg_rating,metric) SELECT user_id,times_ranked,avg_raters_importance,avg_rating,metric FROM user_metric_tmp_next ORDER BY metric DESC', array ()) ; if (!$res) { $err .= "Error in round $i inserting final data: " . db_error(); exit; } /* Get the row count so we can calc the percentile below */ $res = db_query_params ('SELECT COUNT(*) FROM user_metric_next', array ()); if (!$res) { $err .= "Error in round $i getting row count: " . db_error(); exit; } // Only do final percentile if row count is not zero if (db_result($res,0,0)) { /* Update with final percentile and importance */ $res = db_query_params ('UPDATE user_metric_next SET percentile=(100-(100*((ranking::float-1)/$1)))', array (db_result($res,0,0))) ; if (!$res || db_affected_rows($res) < 1) { $err .= "Error in round $i setting percentile: " . db_error(); exit; } $res = db_query_params ('UPDATE user_metric_next SET importance_factor=(1+((percentile/100)*.5))', array ()) ; if (!$res || db_affected_rows($res) < 1) { $err .= "Error in round $i setting importance factor: " . db_error(); exit; } } db_drop_table_if_exists ("user_metric_tmp_cur"); db_drop_table_if_exists ("user_metric_cur"); db_query_params ('SELECT * INTO user_metric_cur FROM user_metric_next', array()) ; db_query_params ('SELECT * INTO user_metric_tmp_cur FROM user_metric_tmp_next', array()) ; db_drop_table_if_exists ("user_metric_tmp_next"); db_drop_table_if_exists ("user_metric_next"); } db_query_params ('DELETE FROM user_metric', array()) ; db_query_params ('INSERT INTO user_metric SELECT * FROM user_metric_cur', array()) ; db_drop_table_if_exists ("user_metric_tmp_cur"); db_drop_table_if_exists ("user_metric_cur"); db_commit(); $t = time(); $ts_month = date('Ym', $t); $ts_day = date('d', $t); db_begin(); db_query_params ('DELETE FROM user_metric_history WHERE month=$1 AND day=$2', array($ts_month, $ts_day)) ; db_query_params (' INSERT INTO user_metric_history SELECT $1,$2,user_id,ranking,metric FROM user_metric ', array($ts_month, $ts_day)) ; $err .= db_error(); cron_entry(1,$err); db_commit(); ?>