Make the tag stream use ID mechanism

This commit is contained in:
Evan Prodromou 2009-04-29 16:09:03 -04:00
parent a4d959b8a2
commit 1e8ea1eb46
2 changed files with 51 additions and 13 deletions

View File

@ -328,10 +328,7 @@ class Notice extends Memcached_DataObject
$tag->notice_id = $this->id; $tag->notice_id = $this->id;
if ($tag->find()) { if ($tag->find()) {
while ($tag->fetch()) { while ($tag->fetch()) {
$cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag)); $tag->blowCache($blowLast);
if ($blowLast) {
$cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag . ';last'));
}
} }
} }
$tag->free(); $tag->free();

View File

@ -37,21 +37,62 @@ class Notice_tag extends Memcached_DataObject
###END_AUTOCODE ###END_AUTOCODE
static function getStream($tag, $offset=0, $limit=20) { static function getStream($tag, $offset=0, $limit=20) {
$qry =
'SELECT notice.* ' .
'FROM notice JOIN notice_tag ON notice.id = notice_tag.notice_id ' .
"WHERE notice_tag.tag = '%s' ";
return Notice::getStream(sprintf($qry, $tag), $ids = Notice::stream(array('Notice_tag', '_streamDirect'),
'notice_tag:notice_stream:' . common_keyize($tag), array($tag),
'notice_tag:notice_ids:' . common_keyize($tag),
$offset, $limit); $offset, $limit);
return Notice::getStreamByIds($ids);
} }
function blowCache() function _streamDirect($tag, $offset, $limit, $since_id, $before_id, $since)
{
$nt = new Notice_tag();
$nt->tag = $tag;
$nt->selectAdd();
$nt->selectAdd('notice_id');
if ($since_id != 0) {
$nt->whereAdd('notice_id > ' . $since_id);
}
if ($before_id != 0) {
$nt->whereAdd('notice_id < ' . $before_id);
}
if (!is_null($since)) {
$nt->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\'');
}
$nt->orderBy('notice_id DESC');
if (!is_null($offset)) {
$nt->limit($offset, $limit);
}
$ids = array();
if ($nt->find()) {
while ($nt->fetch()) {
$ids[] = $nt->notice_id;
}
}
return $ids;
}
function blowCache($blowLast=false)
{ {
$cache = common_memcache(); $cache = common_memcache();
if ($cache) { if ($cache) {
$cache->delete(common_cache_key('notice_tag:notice_stream:' . $this->tag)); $idkey = common_cache_key('notice_tag:notice_ids:' . common_keyize($this->tag));
$cache->delete($idkey);
if ($blowLast) {
$cache->delete($idkey.';last');
}
} }
} }