diff --git a/data/tables.sql b/data/tables.sql index 9f94d3b..b028d17 100644 --- a/data/tables.sql +++ b/data/tables.sql @@ -17,6 +17,7 @@ CREATE TABLE `sc_bookmarks` ( `bDescription` text default NULL, `bPrivateNote` text default NULL, `bHash` varchar(32) NOT NULL default '', + `bVotes` int(11) NOT NULL, `bVoting` int(11) NOT NULL, PRIMARY KEY (`bId`), KEY `sc_bookmarks_usd` (`uId`,`bStatus`,`bDatetime`), diff --git a/src/SemanticScuttle/Service/Vote.php b/src/SemanticScuttle/Service/Vote.php index c0c4995..53bebdc 100644 --- a/src/SemanticScuttle/Service/Vote.php +++ b/src/SemanticScuttle/Service/Vote.php @@ -21,10 +21,10 @@ * * @internal * Votes are saved in a separate "votes" table. - * Additionally to that, the voting of a bookmark is also - * stored in the bookmarks table. This is done to make - * sure lookups are really fast, since every bookmarks - * in a list shows its voting. + * Additionally to that, the voting and number of votes + * of a bookmark is also stored in the bookmarks table. + * This is done to make sure lookups are really fast, since + * every bookmark in a list shows its voting. * * @category Bookmarking * @package SemanticScuttle @@ -104,6 +104,12 @@ class SemanticScuttle_Service_Vote extends SemanticScuttle_DbService * Returns the number of users that voted for or * against the given bookmark. * + * @internal + * This method uses the votes table to calculate the + * number of votes for a bookmark. In normal life, it + * is more efficient to use the "bVotes" field in the + * bookmarks table. + * * @param integer $bookmark Bookmark ID * * @return integer Number of votes @@ -248,6 +254,7 @@ class SemanticScuttle_Service_Vote extends SemanticScuttle_DbService $res = $this->db->sql_query( $sql='UPDATE ' . $bm->getTableName() . ' SET bVoting = bVoting + ' . (int)$vote + . ' , bVotes = bVotes + 1' . ' WHERE bId = ' . (int)$bookmark ); $this->db->sql_freeresult($res); @@ -283,6 +290,7 @@ class SemanticScuttle_Service_Vote extends SemanticScuttle_DbService $res = $this->db->sql_query( $sql='UPDATE ' . $bm->getTableName() . ' SET bVoting = bVoting - ' . (int)$vote + . ' , bVotes = bVotes - 1' . ' WHERE bId = ' . (int)$bookmark ); $this->db->sql_freeresult($res); @@ -306,6 +314,9 @@ class SemanticScuttle_Service_Vote extends SemanticScuttle_DbService $bm = SemanticScuttle_Service_Factory::get('Bookmark'); $query = 'UPDATE ' . $bm->getTableName() . ' as B SET bVoting = ' . '(SELECT SUM(vote) FROM ' . $this->getTableName() . ' as V' + . ' WHERE V.bId = B.bId GROUP BY bid)' + . ', bVotes = ' + . '(SELECT COUNT(vote) FROM ' . $this->getTableName() . ' as V' . ' WHERE V.bId = B.bId GROUP BY bid)'; $this->db->sql_query($query); } diff --git a/tests/VoteTest.php b/tests/VoteTest.php index 032ec29..8e65917 100644 --- a/tests/VoteTest.php +++ b/tests/VoteTest.php @@ -80,6 +80,10 @@ class VoteTest extends TestBase { $bid = $this->addBookmark(); $this->assertEquals(0, $this->vs->getVoting($bid)); + + $bm = $this->bs->getBookmark($bid); + $this->assertEquals(0, $bm['bVoting']); + $this->assertEquals(0, $bm['bVotes']); } @@ -94,6 +98,10 @@ class VoteTest extends TestBase $bid = $this->addBookmark(); $this->vs->vote($bid, 1, 1); $this->assertEquals(1, $this->vs->getVoting($bid)); + + $bm = $this->bs->getBookmark($bid); + $this->assertEquals(1, $bm['bVoting']); + $this->assertEquals(1, $bm['bVotes']); } @@ -108,6 +116,10 @@ class VoteTest extends TestBase $bid = $this->addBookmark(); $this->vs->vote($bid, 1, -1); $this->assertEquals(-1, $this->vs->getVoting($bid)); + + $bm = $this->bs->getBookmark($bid); + $this->assertEquals(-1, $bm['bVoting']); + $this->assertEquals(1, $bm['bVotes']); } @@ -125,6 +137,10 @@ class VoteTest extends TestBase $this->vs->vote($bid, 3, 1); $this->vs->vote($bid, 4, 1); $this->assertEquals(2, $this->vs->getVoting($bid)); + + $bm = $this->bs->getBookmark($bid); + $this->assertEquals(2, $bm['bVoting']); + $this->assertEquals(4, $bm['bVotes']); } @@ -138,6 +154,10 @@ class VoteTest extends TestBase { $bid = $this->addBookmark(); $this->assertEquals(0, $this->vs->getVotes($bid)); + + $bm = $this->bs->getBookmark($bid); + $this->assertEquals(0, $bm['bVoting']); + $this->assertEquals(0, $bm['bVotes']); } @@ -152,6 +172,10 @@ class VoteTest extends TestBase $bid = $this->addBookmark(); $this->vs->vote($bid, 1, 1); $this->assertEquals(1, $this->vs->getVotes($bid)); + + $bm = $this->bs->getBookmark($bid); + $this->assertEquals(1, $bm['bVoting']); + $this->assertEquals(1, $bm['bVotes']); } @@ -169,6 +193,10 @@ class VoteTest extends TestBase $this->vs->vote($bid, 3, 1); $this->vs->vote($bid, 4, 1); $this->assertEquals(4, $this->vs->getVotes($bid)); + + $bm = $this->bs->getBookmark($bid); + $this->assertEquals(2, $bm['bVoting']); + $this->assertEquals(4, $bm['bVotes']); } @@ -223,6 +251,7 @@ class VoteTest extends TestBase $bm2 = $this->bs->getBookmark($bid2); $this->assertEquals(0, $bm2['bVoting']); + $this->assertEquals(0, $bm2['bVotes']); } @@ -318,9 +347,17 @@ class VoteTest extends TestBase $this->assertTrue($this->vs->vote($bid, $uid, 1)); $this->assertTrue($this->vs->vote($bid, $uid, 1)); + $bm = $this->bs->getBookmark($bid); + $this->assertEquals(1, $bm['bVoting']); + $this->assertEquals(1, $bm['bVotes']); + $bid = $this->addBookmark(); $this->assertTrue($this->vs->vote($bid, $uid, -1)); $this->assertTrue($this->vs->vote($bid, $uid, 1)); + + $bm = $this->bs->getBookmark($bid); + $this->assertEquals(1, $bm['bVoting']); + $this->assertEquals(1, $bm['bVotes']); } @@ -336,6 +373,10 @@ class VoteTest extends TestBase $bid = $this->addBookmark(); $this->assertTrue($this->vs->vote($bid, $uid, 1)); $this->assertEquals(1, $this->vs->getVote($bid, $uid)); + + $bm = $this->bs->getBookmark($bid); + $this->assertEquals(1, $bm['bVoting']); + $this->assertEquals(1, $bm['bVotes']); } @@ -351,6 +392,10 @@ class VoteTest extends TestBase $bid = $this->addBookmark(); $this->assertTrue($this->vs->vote($bid, $uid, -1)); $this->assertEquals(-1, $this->vs->getVote($bid, $uid)); + + $bm = $this->bs->getBookmark($bid); + $this->assertEquals(-1, $bm['bVoting']); + $this->assertEquals(1, $bm['bVotes']); } @@ -372,6 +417,7 @@ class VoteTest extends TestBase $b = $this->bs->getBookmark($bid); $this->assertEquals(1, $b['bVoting']); + $this->assertEquals(1, $b['bVotes']); //change vote $this->assertTrue($this->vs->vote($bid, $uid, -1)); @@ -380,6 +426,7 @@ class VoteTest extends TestBase $b = $this->bs->getBookmark($bid); $this->assertEquals(-1, $b['bVoting']); + $this->assertEquals(1, $b['bVotes']); } @@ -401,6 +448,7 @@ class VoteTest extends TestBase $b = $this->bs->getBookmark($bid); $this->assertEquals(-1, $b['bVoting']); + $this->assertEquals(1, $b['bVotes']); //change vote $this->assertTrue($this->vs->vote($bid, $uid, 1)); @@ -409,6 +457,7 @@ class VoteTest extends TestBase $b = $this->bs->getBookmark($bid); $this->assertEquals(1, $b['bVoting']); + $this->assertEquals(1, $b['bVotes']); } @@ -430,6 +479,7 @@ class VoteTest extends TestBase $b = $this->bs->getBookmark($bid); $this->assertEquals(1, $b['bVoting']); + $this->assertEquals(1, $b['bVotes']); //change vote $this->assertTrue($this->vs->vote($bid, $uid, 1)); @@ -438,6 +488,7 @@ class VoteTest extends TestBase $b = $this->bs->getBookmark($bid); $this->assertEquals(1, $b['bVoting']); + $this->assertEquals(1, $b['bVotes']); } @@ -459,6 +510,7 @@ class VoteTest extends TestBase $b = $this->bs->getBookmark($bid); $this->assertEquals(-1, $b['bVoting']); + $this->assertEquals(1, $b['bVotes']); //change vote to same value $this->assertTrue($this->vs->vote($bid, $uid, -1)); @@ -467,6 +519,7 @@ class VoteTest extends TestBase $b = $this->bs->getBookmark($bid); $this->assertEquals(-1, $b['bVoting']); + $this->assertEquals(1, $b['bVotes']); } @@ -484,17 +537,20 @@ class VoteTest extends TestBase $bm = $this->bs->getBookmark($bid); $this->assertEquals(1, $bm['bVoting']); + $this->assertEquals(1, $bm['bVotes']); $this->vs->deleteAll(); //we assume that $vs->deleteAll() does *not* reset //voting in bookmarks table $bm = $this->bs->getBookmark($bid); $this->assertEquals(1, $bm['bVoting']); + $this->assertEquals(1, $bm['bVotes']); $this->vs->rewriteVotings(); $bm = $this->bs->getBookmark($bid); //now it should be reset to 0 $this->assertEquals(0, $bm['bVoting']); + $this->assertEquals(0, $bm['bVotes']); } }//class VoteTest extends TestBase