<?
/****************************************************************************************
* guaranix Rank *
* *
* This is a class that implements the Google Rank algorithm called PageRank. *
* The algorithm is too much effective for get what Page (or what are you trying *
* to rank) is more important than the others. *
* *
* The whole algorithm with explanation could be found at: *
* http://dbpubs.stanford.edu:8090/pub/1999-66 *
* *
* Becouse the algorithm is not mine (I didn't do the research about this ranking) *
* this source is free *
* *
* *
****************************************************************************************/
class gRank
{
var $mysql;
var $table;
var $dump;
var $sql_limit; #SQL limit
function gRank()
{
$this->dump = 0.85;
$this->sql_limit = 1000;
}
function calculate()
{
print "Preparing... ";
$this->Prepare();
print "Prepared\n";
print "Calculating the Pagerank with out Danglins\n";
$this->CalculatePR_WitoutDanglings();
print "Calculating the Pagerank\n";
$this->CalculatePR();
$this->FinishPR();
print "Finish, all the result are in the table PR_FINISHED\n";
}
function FinishPR()
{
global $sql_finish;
foreach($sql_finish as $Sql)
mysql_query($Sql,$this->mysql) or die(mysql_error($this->mysql));
}
function Prepare()
{
global $sql;
foreach($sql as $Sql)
mysql_query($Sql,$this->mysql) or die(mysql_error($this->mysql));
#Now we will calculate formulates it of each page for its PageRank
for($i=0; ;$i++)
{
$main = mysql_query("select id from tmp_pr where formula = '' limit ".$this->sql_limit,$this->mysql) or die(mysql_error($this->mysql));
if (mysql_num_rows($main) == 0) break;
while ($row = mysql_fetch_array($main))
{
$Sql = "select pagerank.master, tmp_pr.nroout from pagerank inner
join tmp_pr on (tmp_pr.id = pagerank.master) where pagerank.slave = ".$row['id'];
$xSql = mysql_query($Sql, $this->mysql) or die(mysql_error( $this->mysql));
$formula = "";
while ($row1 = mysql_fetch_array($xSql))
{
$formula .= "PR(".$row1['master'].")/".$row1['nroout']." + ";
}
$formula = substr($formula,0,strlen($formula) - 2);
$formula = mysql_escape_string($formula);
mysql_free_result($xSql);
$Sql = "update tmp_pr set formula = '".$formula."' where id = ".$row['id'];
mysql_query($Sql,$this->mysql) or die(mysql_error($this->mysql));
}
}
}
function CalculatePR_WitoutDanglings()
{
for ($i=0; $i < 52; $i++)
{
print "\tItineracion $i\n";
for ($e = 0; ; $e++)
{
if ($this->InternalPRcalculator($e,false) == false)
break;
}
}
}
function CalculatePR()
{
for ($e = 0; ; $e++)
{
if ($this->InternalPRcalculator($e) == false)
break;
}
}
function InternalPRcalculator($Start, $dangling = true)
{
global $buff;
$start = $Start * $this->sql_limit;
$where = "";
if (!$dangling)
{
$where = "where nroout != 0";
}
$sql = mysql_query("select id, formula from tmp_pr $where limit $start, ".$this->sql_limit,$this->mysql) or die(mysql_error($this->mysql));
if (mysql_num_rows($sql) == 0)
return false;
while ($row = mysql_fetch_array($sql))
{
eval('$nro = (float)'.$row['formula'].';');
$nro = (float)(1 - $this->dump) + $this->dump * ($nro);
mysql_query("update tmp_pr set pr = '$nro' where id = ".$row['id']);
$buff[$row['id']] = $nro;
}
return true;
}
}
/*
* This function will calcula the PR of a given page.
*/
function PR($i)
{
global $buff; #This is the memory buffer
if (!isset($buff[$i]))
{
$sql1 = mysql_query("select pr from tmp_pr where id = $i");
$row = mysql_fetch_array($sql1);
mysql_free_result($sql1);
$buff[$i] = $row[0];
}
return $buff[$i];
}
?>
|