2011-03-28 14:21:28 +00:00
< ?
define ( 'PREFIX' , 'percentiles_' ); // Prefix for memcache keys, to make life easier
class USER_RANK {
2013-02-22 08:00:24 +00:00
2011-03-28 14:21:28 +00:00
// Returns a 101 row array (101 percentiles - 0 - 100), with the minimum value for that percentile as the value for each row
// BTW - ingenious
function build_table ( $MemKey , $Query ) {
global $Cache , $DB ;
2013-02-22 08:00:24 +00:00
2011-08-09 21:03:28 +00:00
$DB -> query ( " DROP TEMPORARY TABLE IF EXISTS temp_stats " );
2013-02-22 08:00:24 +00:00
2011-08-09 21:03:28 +00:00
$DB -> query ( " CREATE TEMPORARY TABLE temp_stats
2011-03-28 14:21:28 +00:00
( ID int ( 10 ) NOT NULL PRIMARY KEY AUTO_INCREMENT ,
Val bigint ( 20 ) NOT NULL ); " );
2013-02-22 08:00:24 +00:00
2011-08-09 21:03:28 +00:00
$DB -> query ( " INSERT INTO temp_stats (Val) " . $Query );
2013-02-22 08:00:24 +00:00
2011-08-09 21:03:28 +00:00
$DB -> query ( " SELECT COUNT(ID) FROM temp_stats " );
2011-03-28 14:21:28 +00:00
list ( $UserCount ) = $DB -> next_record ();
2013-02-22 08:00:24 +00:00
2011-08-09 21:03:28 +00:00
$DB -> query ( " SELECT MIN(Val) FROM temp_stats GROUP BY CEIL(ID/( " . ( int ) $UserCount . " /100)); " );
2013-02-22 08:00:24 +00:00
2011-03-28 14:21:28 +00:00
$Table = $DB -> to_array ();
2013-02-22 08:00:24 +00:00
2011-03-28 14:21:28 +00:00
// Give a little variation to the cache length, so all the tables don't expire at the same time
2013-02-22 08:00:24 +00:00
$Cache -> cache_value ( $MemKey , $Table , 3600 * 24 * rand ( 800 , 1000 ) * 0.001 );
2011-03-28 14:21:28 +00:00
return $Table ;
}
2013-02-22 08:00:24 +00:00
2011-03-28 14:21:28 +00:00
function table_query ( $TableName ) {
switch ( $TableName ) {
case 'uploaded' :
$Query = " SELECT Uploaded FROM users_main WHERE Enabled='1' AND Uploaded>0 ORDER BY Uploaded; " ;
break ;
case 'downloaded' :
$Query = " SELECT Downloaded FROM users_main WHERE Enabled='1' AND Downloaded>0 ORDER BY Downloaded; " ;
break ;
case 'uploads' :
$Query = " SELECT COUNT(t.ID) AS Uploads FROM users_main AS um JOIN torrents AS t ON t.UserID=um.ID WHERE um.Enabled='1' GROUP BY um.ID ORDER BY Uploads; " ;
break ;
case 'requests' :
$Query = " SELECT COUNT(r.ID) AS Requests FROM users_main AS um JOIN requests AS r ON r.FillerID=um.ID WHERE um.Enabled='1' GROUP BY um.ID ORDER BY Requests; " ;
break ;
case 'posts' :
$Query = " SELECT COUNT(p.ID) AS Posts FROM users_main AS um JOIN forums_posts AS p ON p.AuthorID=um.ID WHERE um.Enabled='1' GROUP BY um.ID ORDER BY Posts; " ;
break ;
case 'bounty' :
2013-03-16 08:00:25 +00:00
$Query = " SELECT SUM(rv.Bounty) AS Bounty FROM users_main AS um JOIN requests_votes AS rv ON rv.UserID=um.ID WHERE um.Enabled='1' GROUP BY um.ID ORDER BY Bounty; " ;
2011-03-28 14:21:28 +00:00
break ;
case 'artists' :
$Query = " SELECT COUNT(ta.ArtistID) AS Artists FROM torrents_artists AS ta JOIN torrents_group AS tg ON tg.ID=ta.GroupID JOIN torrents AS t ON t.GroupID = tg.ID WHERE t.UserID != ta.UserID GROUP BY tg.ID ORDER BY Artists ASC " ;
break ;
}
return $Query ;
}
2013-02-22 08:00:24 +00:00
2011-03-28 14:21:28 +00:00
function get_rank ( $TableName , $Value ) {
2013-04-20 08:01:01 +00:00
if ( $Value == 0 ) {
return 0 ;
}
2011-03-28 14:21:28 +00:00
global $Cache , $DB ;
2013-02-22 08:00:24 +00:00
2011-03-28 14:21:28 +00:00
$Table = $Cache -> get_value ( PREFIX . $TableName );
2013-04-20 08:01:01 +00:00
if ( ! $Table ) {
2011-03-28 14:21:28 +00:00
//Cache lock!
$Lock = $Cache -> get_value ( PREFIX . $TableName . " _lock " );
2013-04-20 08:01:01 +00:00
if ( $Lock ) {
2012-03-03 08:00:28 +00:00
return false ;
2011-03-28 14:21:28 +00:00
} else {
2012-03-03 08:00:28 +00:00
$Cache -> cache_value ( PREFIX . $TableName . " _lock " , '1' , 300 );
2011-03-28 14:21:28 +00:00
$Table = $this -> build_table ( PREFIX . $TableName , $this -> table_query ( $TableName ));
2012-03-03 08:00:28 +00:00
$Cache -> delete_value ( PREFIX . $TableName . " _lock " );
2011-03-28 14:21:28 +00:00
}
}
$LastPercentile = 0 ;
foreach ( $Table as $Row ) {
list ( $CurValue ) = $Row ;
2013-04-20 08:01:01 +00:00
if ( $CurValue >= $Value ) {
2011-03-28 14:21:28 +00:00
return $LastPercentile ;
}
$LastPercentile ++ ;
}
return 100 ; // 100th percentile
}
2013-02-22 08:00:24 +00:00
2013-04-20 08:01:01 +00:00
function overall_score ( $Uploaded , $Downloaded , $Uploads , $Requests , $Posts , $Bounty , $Artists , $Ratio ) {
2011-03-28 14:21:28 +00:00
// We can do this all in 1 line, but it's easier to read this way
2013-04-20 08:01:01 +00:00
if ( $Ratio > 1 ) {
$Ratio = 1 ;
}
2011-03-28 14:21:28 +00:00
$TotalScore = 0 ;
2013-04-20 08:01:01 +00:00
if ( in_array ( false , func_get_args (), true )) {
2012-03-03 08:00:28 +00:00
return false ;
}
2011-03-28 14:21:28 +00:00
$TotalScore += $Uploaded * 15 ;
$TotalScore += $Downloaded * 8 ;
$TotalScore += $Uploads * 25 ;
$TotalScore += $Requests * 2 ;
$TotalScore += $Posts ;
$TotalScore += $Bounty ;
$TotalScore += $Artists ;
$TotalScore /= ( 15 + 8 + 25 + 2 + 1 + 1 + 1 );
$TotalScore *= $Ratio ;
return $TotalScore ;
}
2013-02-22 08:00:24 +00:00
2011-03-28 14:21:28 +00:00
}
?>