diff options
Diffstat (limited to 'services')
| -rw-r--r-- | services/tag2tagservice.php | 81 | ||||
| -rw-r--r-- | services/tagstatservice.php | 181 | 
2 files changed, 251 insertions, 11 deletions
| diff --git a/services/tag2tagservice.php b/services/tag2tagservice.php index 7ceb8da..14d57b3 100644 --- a/services/tag2tagservice.php +++ b/services/tag2tagservice.php @@ -28,17 +28,35 @@ class Tag2TagService {                  return false;          }  	$this->db->sql_transaction('commit'); + +	// Update stats +	$tsts =& ServiceFactory::getServiceInstance('TagStatService'); +	$tsts->updateStat($tag1, $relationType, $uId); +  	return true;      } -    function getLinkedTags($tag1, $relationType, $uId = -1) { +    // Return the target linked tags. If inverseRelation is true, return the source linked tags. +    function getLinkedTags($tag, $relationType, $uId = null, $inverseRelation = false) {  	// Set up the SQL query. -        $query = "SELECT DISTINCT tag2 as 'tag' FROM `". $this->getTableName() ."`"; -	$query.= " WHERE tag1 = '" .$tag1 ."'"; +	if($inverseRelation) { +	    $queriedTag = "tag1"; +	    $givenTag = "tag2"; +	} else { +	    $queriedTag = "tag2"; +	    $givenTag = "tag1";	 +	} + +        $query = "SELECT DISTINCT ". $queriedTag ." as 'tag'"; +	$query.= " FROM `". $this->getTableName() ."`"; +	$query.= " WHERE 1=1"; +	if($tag !=null) { +	    $query.= " AND ". $givenTag ." = '". $tag ."'"; +	}  	if($relationType) {  	    $query.= " AND relationType = '". $relationType ."'";  	} -	if($uId>0) { +	if($uId != null) {  	    $query.= " AND uId = '".$uId."'";  	} @@ -88,9 +106,14 @@ class Tag2TagService {  	return $output;      } -    function getOrphewTags($relationType, $uId = 0) { -	$query = "SELECT DISTINCT tag1 as tag FROM `". $this->getTableName() ."`"; -	$query.= " WHERE tag1 <> ALL"; +    function getOrphewTags($relationType, $uId = 0, $limit = null, $orderBy = null) { +	$query = "SELECT DISTINCT tts.tag1 as tag"; +	$query.= " FROM `". $this->getTableName() ."` tts"; +	if($orderBy != null) { +	   $tsts =& ServiceFactory::getServiceInstance('TagStatService'); +	   $query.= ", ".$tsts->getTableName() ." tsts"; +	} +	$query.= " WHERE tts.tag1 <> ALL";  	$query.= " (SELECT DISTINCT tag2 FROM `". $this->getTableName() ."`";  	$query.= " WHERE relationType = '".$relationType."'";  	if($uId > 0) { @@ -98,12 +121,41 @@ class Tag2TagService {  	}  	$query.= ")";  	if($uId > 0) { -	    $query.= " AND uId = '".$uId."'"; +	    $query.= " AND tts.uId = '".$uId."'";  	} -	//die($query); +	switch($orderBy) { +	  case "nb": +	    $query.= " AND tts.tag1 = tsts.tag1"; +	    $query.= " AND tsts.relationType = '".$relationType."'"; +	    if($uId > 0) { +	        $query.= " AND tsts.uId = ".$uId; +	    } +	    $query.= " ORDER BY tsts.nb DESC"; +	    break; +	  case "depth": // by nb of descendants +	    $query.= " AND tts.tag1 = tsts.tag1"; +	    $query.= " AND tsts.relationType = '".$relationType."'"; +	    if($uId > 0) { +	        $query.= " AND tsts.uId = ".$uId; +	    } +	    $query.= " ORDER BY tsts.depth DESC"; +	    break; +	  case "nbupdate": +	    $query.= " AND tts.tag1 = tsts.tag1"; +	    $query.= " AND tsts.relationType = '".$relationType."'"; +	    if($uId > 0) { +	        $query.= " AND tsts.uId = ".$uId; +	    } +	    $query.= " ORDER BY tsts.nbupdate DESC"; +	    break; +	} -        if (! ($dbresult =& $this->db->sql_query_limit($query, $limit)) ){ +	if($limit != null) { +	    $query.= " LIMIT 0,".$limit; +	} + +        if (! ($dbresult =& $this->db->sql_query($query)) ){              message_die(GENERAL_ERROR, 'Could not get linked tags', '', __LINE__, __FILE__, $query, $this->db);              return false;          } @@ -117,7 +169,7 @@ class Tag2TagService {  	$query.= " AND relationType = '". $relationType ."'";  	$query.= " AND uId = '".$uId."'"; -        return $this->db->sql_numrows($dbresult) > 0; +        return $this->db->sql_numrows($this->db->sql_query($query)) > 0;      }      function removeLinkedTags($tag1, $tag2, $relationType, $uId) { @@ -132,12 +184,19 @@ class Tag2TagService {              return false;          } +	// Update stats +	$tsts =& ServiceFactory::getServiceInstance('TagStatService'); +	$tsts->updateStat($tag1, $relationType, $uId); +          return true;      }      function deleteAll() {  	$query = 'TRUNCATE TABLE `'. $this->getTableName() .'`';  	$this->db->sql_query($query); + +	$tsts =& ServiceFactory::getServiceInstance('TagStatService'); +	$tsts->deleteAll();      }      // Properties diff --git a/services/tagstatservice.php b/services/tagstatservice.php new file mode 100644 index 0000000..fa416f4 --- /dev/null +++ b/services/tagstatservice.php @@ -0,0 +1,181 @@ +<?php +class TagStatService { +    var $db; +    var $tablename; + +    function &getInstance(&$db) { +        static $instance; +        if (!isset($instance)) +            $instance =& new TagStatService($db); +        return $instance; +    } + +    function TagStatService(&$db) { +        $this->db =& $db; +        $this->tablename = $GLOBALS['tableprefix'] .'tagsstats'; +    } + +    function getNbChildren($tag1, $relationType, $uId) { +	$tts =& ServiceFactory::getServiceInstance('Tag2TagService'); +	$query = "SELECT tag1, relationType, uId FROM `". $tts->getTableName() ."`"; +	$query.= " WHERE tag1 = '" .$tag1 ."'"; +	$query.= " AND relationType = '". $relationType ."'"; +	$query.= " AND uId = '".$uId."'"; + +        return $this->db->sql_numrows($this->db->sql_query($query)); +    } + +    function getNbDescendants($tag1, $relationType, $uId) { +	$query = "SELECT nb FROM `". $this->getTableName() ."`"; +	$query.= " WHERE tag1 = '" .$tag1 ."'"; +	$query.= " AND relationType = '". $relationType ."'"; +	$query.= " AND uId = '".$uId."'"; + +	$dbresults =& $this->db->sql_query($query); +	$row = $this->db->sql_fetchrow($dbresults); +	if($row['nb'] == null) { +	    return 0; +	} else { +	    return (int) $row['nb']; +	} +    } + +    function getMaxDepth($tag1, $relationType, $uId) { +	$query = "SELECT depth FROM `". $this->getTableName() ."`"; +	$query.= " WHERE tag1 = '" .$tag1 ."'"; +	$query.= " AND relationType = '". $relationType ."'"; +	$query.= " AND uId = '".$uId."'"; + +	$dbresults =& $this->db->sql_query($query); +	$row = $this->db->sql_fetchrow($dbresults); +	if($row['depth'] == null) { +	    return 0; +	} else { +	    return (int) $row['depth']; +	}; +    } + +    function getNbUpdate($tag1, $relationType, $uId) { +	$query = "SELECT nbupdate FROM `". $this->getTableName() ."`"; +	$query.= " WHERE tag1 = '" .$tag1 ."'"; +	$query.= " AND relationType = '". $relationType ."'"; +	$query.= " AND uId = '".$uId."'"; + +	$dbresults =& $this->db->sql_query($query); +	$row = $this->db->sql_fetchrow($dbresults); +	if($row['nbupdate'] == null) { +	    return 0; +	} else { +	    return (int) $row['nbupdate']; +	} +    } + +    function existStat($tag1, $relationType, $uId) { +	$query = "SELECT tag1, relationType, uId FROM `". $this->getTableName() ."`"; +	$query.= " WHERE tag1 = '" .$tag1 ."'"; +	$query.= " AND relationType = '". $relationType ."'"; +	$query.= " AND uId = '".$uId."'"; + +        return $this->db->sql_numrows($this->db->sql_query($query))>0;	 +    } + +    function createStat($tag1, $relationType, $uId) { +	$query = "INSERT INTO `". $this->getTableName() ."`"; +	$query.= "(tag1, relationType, uId)"; +	$query.= " VALUES ('".$tag1."','".$relationType."','".$uId."')"; +	$this->db->sql_query($query); +    } + +    function updateStat($tag1, $relationType, $uId=null, $stoplist=array()) { +	if(in_array($tag1, $stoplist)) { +	    return false; +	} + +	$tts =& ServiceFactory::getServiceInstance('Tag2TagService'); +	$linkedTags = $tts->getLinkedTags($tag1, $relationType, $uId); +	$nbDescendants = 0; +	$maxDepth = 0; +	foreach($linkedTags as $linkedTag) { +	    $nbDescendants+= 1 + $this->getNbDescendants($linkedTag, $relationType, $uId); +	    $maxDepth = max($maxDepth, 1 + $this->getMaxDepth($linkedTag, $relationType, $uId)); +	} +	$this->setNbDescendants($tag1, $relationType, $uId, $nbDescendants); +	$this->setMaxDepth($tag1, $relationType, $uId, $maxDepth); +	$this->increaseNbUpdate($tag1, $relationType, $uId); + +	// propagation to the precedent tags +	$linkedTags = $tts->getLinkedTags($tag1, $relationType, $uId, true); +	$stoplist[] = $tag1; +	foreach($linkedTags as $linkedTag) { +	    $this->updateStat($linkedTag, $relationType, $uId, $stoplist); +	} +    } + +    function updateAllStat() { +	$tts =& ServiceFactory::getServiceInstance('Tag2TagService'); + +	$query = "SELECT tag1, uId FROM `". $tts->getTableName() ."`"; +	$query.= " WHERE relationType = '>'"; + +//die($query); + +        if (! ($dbresult =& $this->db->sql_query($query)) ){ +            message_die(GENERAL_ERROR, 'Could not update stats', '', __LINE__, __FILE__, $query, $this->db); +            return false; +        } + +        $rowset = $this->db->sql_fetchrowset($dbresult); +	foreach($rowset as $row) { +	    $this->updateStat($row['tag1'], '>', $row['uId']); +	} +    } + +    function setNbDescendants($tag1, $relationType, $uId, $nb) { +	if(!$this->existStat($tag1, $relationType, $uId)) { +	    $this->createStat($tag1, $relationType, $uId); +	} +	$query = "UPDATE `". $this->getTableName() ."`"; +	$query.= " SET nb = ". $nb; +	$query.= " WHERE tag1 = '" .$tag1 ."'"; +	$query.= " AND relationType = '". $relationType ."'"; +	$query.= " AND uId = '".$uId."'"; +	$this->db->sql_query($query);	 +    } + +    function setMaxDepth($tag1, $relationType, $uId, $depth) { +	if(!$this->existStat($tag1, $relationType, $uId)) { +	    $this->createStat($tag1, $relationType, $uId); +	} +	$query = "UPDATE `". $this->getTableName() ."`"; +	$query.= " SET depth = ". $depth; +	$query.= " WHERE tag1 = '" .$tag1 ."'"; +	$query.= " AND relationType = '". $relationType ."'"; +	$query.= " AND uId = '".$uId."'"; +	$this->db->sql_query($query);	 +    } + +    function increaseNbUpdate($tag1, $relationType, $uId) { +	if(!$this->existStat($tag1, $relationType, $uId)) { +	    $this->createStat($tag1, $relationType, $uId); +	} +	$query = "UPDATE `". $this->getTableName() ."`"; +	$query.= " SET nbupdate = nbupdate + 1"; +	$query.= " WHERE tag1 = '" .$tag1 ."'"; +	$query.= " AND relationType = '". $relationType ."'"; +	$query.= " AND uId = '".$uId."'"; + +	//die($query); +	 +	$this->db->sql_query($query); +    } + +    function deleteAll() { +	$query = 'TRUNCATE TABLE `'. $this->getTableName() .'`'; +	$this->db->sql_query($query); +    } + +    // Properties +    function getTableName()       { return $this->tablename; } +    function setTableName($value) { $this->tablename = $value; } +} +?> | 
