make countOthers() accept an array of addresses

git-svn-id: https://semanticscuttle.svn.sourceforge.net/svnroot/semanticscuttle/trunk@659 b3834d28-1941-0410-a4f8-b48e95affb8f
This commit is contained in:
cweiske 2010-02-20 11:03:20 +00:00
parent 91da444e76
commit 6b7217daf2
2 changed files with 122 additions and 11 deletions

View file

@ -891,17 +891,29 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
/**
* Counts the number of bookmarks that have the same address
* as the given address
* as the given address.
*
* @param string $address Address/URL to look for
* @internal
* We do support fetching counts for multiple addresses at once
* because that allows us to reduce the number of queries
* we need in the web interface when displaying i.e.
* 10 bookmarks - only one SQL query is needed then.
*
* @return integer Number of bookmarks minus one that have the address
* @param string|array $addresses Address/URL to look for, string
* of one address or array with
* multiple ones
*
* @return integer Number of bookmarks minus one that have the address.
* In case $addresses was an array, key-value array
* with key being the address, value said number of
* bookmarks
*/
public function countOthers($address)
public function countOthers($addresses)
{
if (!$address) {
if (!$addresses) {
return false;
}
$bArray = is_array($addresses);
$us = SemanticScuttle_Service_Factory::get('User');
$sId = (int)$us->getCurrentUserId();
@ -922,12 +934,22 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
$privacy = ' AND B.bStatus = 0';
}
$sql = 'SELECT COUNT(*) as "0" FROM '
$addressesSql = ' AND (0';
foreach ((array)$addresses as $address) {
$addressesSql .= ' OR B.bHash = "'
. $this->db->sql_escape(md5($address))
. '"';
}
$addressesSql .= ')';
$sql = 'SELECT B.bAddress, COUNT(*) as count FROM '
. $us->getTableName() . ' AS U'
. ', '. $GLOBALS['tableprefix'] . 'bookmarks AS B'
. ' WHERE U.'. $us->getFieldName('primary') .' = B.uId'
. ' AND B.bHash = "'. md5($address) . '"'
. $privacy;
. $addressesSql
. $privacy
. ' GROUP BY B.bHash';
if (!($dbresult = $this->db->sql_query($sql))) {
message_die(
@ -936,10 +958,19 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
);
}
$count = $this->db->sql_fetchfield(0, 0);
$count = ($count > 0) ? $count - 1 : (int)$count;
//be sure we also list urls in our array
// that are not found in the database
$counts = array_combine(
(array)$addresses,
array_fill(0, count((array)$addresses), 0)
);
while ($row = $this->db->sql_fetchrow($dbresult)) {
$counts[$row['bAddress']]
= $row['count'] > 0 ? $row['count'] - 1 : 0;
}
$this->db->sql_freeresult($dbresult);
return $count;
return $bArray ? $counts : reset($counts);
}

View file

@ -943,6 +943,86 @@ class BookmarkTest extends TestBase
/**
* Test what countOther() returns when multiple addresses are
* passed to it and none of them exists.
*
* @return void
*/
public function testCountOthersArrayNone()
{
$this->assertEquals(
array('1' => 0, '2' => 0, '3' => 0),
$this->bs->countOthers(array('1', '2', '3'))
);
}
/**
* Test what countOther() returns when multiple addresses are
* passed to it and only one of them exists.
*
* @return void
*/
public function testCountOthersArrayOneNone()
{
$uid = $this->addUser();
$uid2 = $this->addUser();
$address1 = 'http://example.org/1';
$address2 = 'http://example.org/2';
$this->addBookmark($uid, $address1);
$this->addBookmark($uid, $address2);
$this->addBookmark($uid2, $address1);
$this->assertEquals(
array(
$address1 => 1,
$address2 => 0
),
$this->bs->countOthers(
array($address1, $address2)
)
);
}
/**
* Test what countOther() returns when multiple addresses are passed
* to it and both of them exist with different numbers for each.
*
* @return void
*/
public function testCountOthersArrayTwoOne()
{
$uid = $this->addUser();
$uid2 = $this->addUser();
$uid3 = $this->addUser();
$address1 = 'http://example.org/1';
$address2 = 'http://example.org/2';
$this->addBookmark($uid, $address1);
$this->addBookmark($uid, $address2);
$this->addBookmark($uid2, $address1);
$this->addBookmark($uid2, $address2);
$this->addBookmark($uid3, $address1);
$this->assertEquals(
array(
$address1 => 2,
$address2 => 1
),
$this->bs->countOthers(
array($address1, $address2)
)
);
}
}