summaryrefslogtreecommitdiffstatshomepage
path: root/services/tag2tagservice.php
blob: d522039a02b5f607a004618d62eb39fa62db3263 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<?php
class Tag2TagService {
    var $db;
    var $tablename;

    function &getInstance(&$db) {
        static $instance;
        if (!isset($instance))
            $instance =& new Tag2TagService($db);
        return $instance;
    }

    function Tag2TagService(&$db) {
        $this->db =& $db;
        $this->tablename = $GLOBALS['tableprefix'] .'tags2tags';
    }

    function addLinkedTags($tag1, $tag2, $relationType, $uId) {
	if($tag1 == $tag2) {
		return false;
	}
	$values = array('tag1' => $tag1, 'tag2' => $tag2, 'relationType'=> $relationType, 'uId'=> $uId);
	$query = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values);
//die($query);
        if (!($dbresult =& $this->db->sql_query($query))) {
        	$this->db->sql_transaction('rollback');
        	message_die(GENERAL_ERROR, 'Could not attach tag to tag', '', __LINE__, __FILE__, $query, $this->db);
                return false;
        }
	$this->db->sql_transaction('commit');
	return true;
    }

    function getLinkedTags($tag1, $relationType, $uId) {
	// Set up the SQL query.
        $query = "SELECT DISTINCT tag2 as 'tag' FROM `". $this->getTableName() ."`";
	$query.= " WHERE tag1 = '" .$tag1 ."'";
	if($relationType) {
	    $query.= " AND relationType = '". $relationType ."'";
	}
	if($uId) {
	    $query.= " AND uId = '".$uId."'";
	}

        if (! ($dbresult =& $this->db->sql_query_limit($query, $limit)) ){
            message_die(GENERAL_ERROR, 'Could not get related tags', '', __LINE__, __FILE__, $query, $this->db);
            return false;
        }

        $rowset = $this->db->sql_fetchrowset($dbresult);
	$output = array();
	foreach($rowset as $row) {
	    $output[] = $row['tag'];
	}
	return $output;
    }

    /* TODO: clean the outputs to obtain homogenous ones*/
    function getAllLinkedTags($tag1, $relationType, $uId, $asFlatList=true, $stopList=array()) {
	if(in_array($tag1, $stopList)) {
	    return $tag1;
	}
	$linkedTags = $this->getLinkedTags($tag1, $relationType, $uId);
	if(count($linkedTags) == 0) {
	    return $tag1;
	} else {
	    $output = array();
	    if($asFlatList == true) {
		$output[$tag1] = $tag1;
	    } else {
		$output = array('node'=>$tag1);
	    }

	    $stopList[] = $tag1;
	    foreach($linkedTags as $linkedTag) {
		$allLinkedTags = $this->getAllLinkedTags($linkedTag, $relationType, $uId, $asFlatList, $stopList);
		if($asFlatList == true) {
		    if(is_array($allLinkedTags)) {
			$output = array_merge($output, $allLinkedTags);
		    } else {
		        $output[$allLinkedTags] = $allLinkedTags;
		    }
		} else {
		    $output[] = $allLinkedTags;
		}
	    }
	}
	return $output;
    }

    function getOrphewTags($relationType, $uId = 0) {
	$query = "SELECT DISTINCT tag1 as tag FROM `". $this->getTableName() ."`";
	$query.= " WHERE tag1 <> ALL";
	$query.= " (SELECT DISTINCT tag2 FROM `". $this->getTableName() ."`";
	$query.= " WHERE relationType = '".$relationType."'";
	if($uId > 0) {
	    $query.= " AND uId = '".$uId."'";
	}
	$query.= ")";
	if($uId > 0) {
	    $query.= " AND uId = '".$uId."'";
	}

	//die($query);

        if (! ($dbresult =& $this->db->sql_query_limit($query, $limit)) ){
            message_die(GENERAL_ERROR, 'Could not get linked tags', '', __LINE__, __FILE__, $query, $this->db);
            return false;
        }
        return $this->db->sql_fetchrowset($dbresult);
    }

    function existsLinkedTags($tag1, $tag2, $relationType, $uId) {
	$query = "SELECT tag1, tag2, relationType, uId FROM `". $this->getTableName() ."`";
	$query.= " WHERE tag1 = '" .$tag1 ."'";
	$query.= " AND tag2 = '".$tag2."'";
	$query.= " AND relationType = '". $relationType ."'";
	$query.= " AND uId = '".$uId."'";

        return $this->db->sql_numrows($dbresult) > 0;
    }

    function removeLinkedTags($tag1, $tag2, $relationType, $uId) {
	$query = 'DELETE FROM '. $this->getTableName();
	$query.= ' WHERE tag1 = "'. $tag1 .'"';
	$query.= ' AND tag2 = "'. $tag2 .'"';
	$query.= ' AND relationType = "'. $relationType .'"';
	$query.= ' AND uId = "'. $uId .'"';

        if (!($dbresult =& $this->db->sql_query($query))) {
            message_die(GENERAL_ERROR, 'Could not remove tag relation', '', __LINE__, __FILE__, $query, $this->db);
            return false;
        }

        return true;
    }

    function deleteAll() {
	$query = 'TRUNCATE TABLE `'. $this->getTableName() .'`';
	$this->db->sql_query($query);
    }

    // Properties
    function getTableName()       { return $this->tablename; }
    function setTableName($value) { $this->tablename = $value; }
}
?>