summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/tables.sql1
-rw-r--r--src/SemanticScuttle/Service/Vote.php19
-rw-r--r--tests/VoteTest.php56
3 files changed, 72 insertions, 4 deletions
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