function getNoticeIds($offset, $limit, $since_id, $max_id) { // XXX It would be nice to do this without a join // (necessary to do it efficiently on accounts with long history) $notice = new Notice(); $query = "select id from notice join notice_tag on id=notice_id where tag='" . $notice->escape($this->tag) . "' and profile_id=" . intval($this->profile->id); $since = Notice::whereSinceId($since_id, 'id', 'notice.created'); if ($since) { $query .= " and ({$since})"; } $max = Notice::whereMaxId($max_id, 'id', 'notice.created'); if ($max) { $query .= " and ({$max})"; } $query .= ' order by notice.created DESC, id DESC'; if (!is_null($offset)) { $query .= " LIMIT " . intval($limit) . " OFFSET " . intval($offset); } $notice->query($query); $ids = array(); while ($notice->fetch()) { $ids[] = $notice->id; } return $ids; }
/** * Get IDs in a range * * @param int $offset Offset from start * @param int $limit Limit of number to get * @param int $since_id Since this notice * @param int $max_id Before this notice * * @return Array IDs found */ function getNoticeIds($offset, $limit, $since_id, $max_id) { $notice = new Notice(); $notice->selectAdd(); $notice->selectAdd('id'); $notice->whereAdd(sprintf('notice.created > "%s"', $notice->escape($this->target->created))); // Reply:: is a table of mentions // Subscription:: is a table of subscriptions (every user is subscribed to themselves) $notice->whereAdd(sprintf('( notice.profile_id IN (SELECT subscribed FROM subscription WHERE subscriber=%1$d) ' . 'OR notice.id IN (SELECT notice_id FROM group_inbox WHERE group_id IN (SELECT group_id FROM group_member WHERE profile_id=%1$d))' . 'OR notice.id IN (SELECT notice_id FROM attention WHERE profile_id=%1$d) ) ' . 'AND (notice.reply_to IS NULL ' . 'OR notice.profile_id=%1$d ' . 'OR notice.reply_to IN (SELECT id FROM notice as noticereplies WHERE noticereplies.profile_id IN (SELECT subscribed FROM subscription WHERE subscriber=%1$d))) ' . 'OR (notice.id IN (SELECT notice_id FROM reply WHERE profile_id=%1$d) ' . 'AND notice.profile_id IN (SELECT subscribed FROM subscription WHERE subscriber=%1$d))', $this->target->id)); if (!empty($since_id)) { $notice->whereAdd(sprintf('notice.id > %d', $since_id)); } if (!empty($max_id)) { $notice->whereAdd(sprintf('notice.id <= %d', $max_id)); } if (!empty($this->selectVerbs)) { $notice->whereAddIn('verb', $this->selectVerbs, $notice->columnType('verb')); } $notice->limit($offset, $limit); // notice.id will give us even really old posts, which were // recently imported. For example if a remote instance had // problems and just managed to post here. Another solution // would be to have a 'notice.imported' field and order by it. $notice->orderBy('notice.id DESC'); if (!$notice->find()) { return array(); } $ids = $notice->fetchAll('id'); return $ids; }
static function checkDupes($profile_id, $content) { $profile = Profile::getKV($profile_id); if (!$profile instanceof Profile) { return false; } $notice = $profile->getNotices(0, CachingNoticeStream::CACHE_WINDOW); if (!empty($notice)) { $last = 0; while ($notice->fetch()) { if (time() - strtotime($notice->created) >= common_config('site', 'dupelimit')) { return true; } else { if ($notice->content == $content) { return false; } } } } // If we get here, oldest item in cache window is not // old enough for dupe limit; do direct check against DB $notice = new Notice(); $notice->profile_id = $profile_id; $notice->content = $content; $threshold = common_sql_date(time() - common_config('site', 'dupelimit')); $notice->whereAdd(sprintf("created > '%s'", $notice->escape($threshold))); $cnt = $notice->count(); return $cnt == 0; }
function _streamDirect($offset, $limit, $since_id, $max_id) { $notice = new Notice(); // Temporary hack until notice_profile_id_idx is updated // to (profile_id, id) instead of (profile_id, created, id). // It's been falling back to PRIMARY instead, which is really // very inefficient for a profile that hasn't posted in a few // months. Even though forcing the index will cause a filesort, // it's usually going to be better. if (common_config('db', 'type') == 'mysql') { $index = ''; $query = "select id from notice force index (notice_profile_id_idx) " . "where profile_id=" . $notice->escape($this->id); if ($since_id != 0) { $query .= " and id > {$since_id}"; } if ($max_id != 0) { $query .= " and id < {$max_id}"; } $query .= ' order by id DESC'; if (!is_null($offset)) { $query .= " LIMIT {$limit} OFFSET {$offset}"; } $notice->query($query); } else { $index = ''; $notice->profile_id = $this->id; $notice->selectAdd(); $notice->selectAdd('id'); if ($since_id != 0) { $notice->whereAdd('id > ' . $since_id); } if ($max_id != 0) { $notice->whereAdd('id <= ' . $max_id); } $notice->orderBy('id DESC'); if (!is_null($offset)) { $notice->limit($offset, $limit); } $notice->find(); } $ids = array(); while ($notice->fetch()) { $ids[] = $notice->id; } return $ids; }