Update notice sorting for profile streams; extract more common code to Notice::addSinceId() and Notice::addMaxId()
This commit is contained in:
parent
9e8bbff8ac
commit
4cd3a0756b
@ -668,15 +668,8 @@ class Notice extends Memcached_DataObject
|
|||||||
$notice->whereAdd('is_local !='. Notice::GATEWAY);
|
$notice->whereAdd('is_local !='. Notice::GATEWAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
$since = Notice::whereSinceId($since_id);
|
Notice::addWhereSinceId($notice, $since_id);
|
||||||
if ($since) {
|
Notice::addWhereMaxId($notice, $max_id);
|
||||||
$notice->whereAdd($since);
|
|
||||||
}
|
|
||||||
|
|
||||||
$max = Notice::whereMaxId($max_id);
|
|
||||||
if ($max) {
|
|
||||||
$notice->whereAdd($max);
|
|
||||||
}
|
|
||||||
|
|
||||||
$ids = array();
|
$ids = array();
|
||||||
|
|
||||||
@ -2027,6 +2020,25 @@ class Notice extends Memcached_DataObject
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build an SQL 'where' fragment for timestamp-based sorting from a since_id
|
||||||
|
* parameter, matching notices posted after the given one (exclusive), and
|
||||||
|
* if necessary add it to the data object's query.
|
||||||
|
*
|
||||||
|
* @param DB_DataObject $obj
|
||||||
|
* @param int $id
|
||||||
|
* @param string $idField
|
||||||
|
* @param string $createdField
|
||||||
|
* @return mixed string or false if no match
|
||||||
|
*/
|
||||||
|
public static function addWhereSinceId(DB_DataObject $obj, $id, $idField='id', $createdField='created')
|
||||||
|
{
|
||||||
|
$since = self::whereSinceId($id);
|
||||||
|
if ($since) {
|
||||||
|
$obj->whereAdd($since);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build an SQL 'where' fragment for timestamp-based sorting from a max_id
|
* Build an SQL 'where' fragment for timestamp-based sorting from a max_id
|
||||||
* parameter, matching notices posted before the given one (inclusive).
|
* parameter, matching notices posted before the given one (inclusive).
|
||||||
@ -2046,4 +2058,23 @@ class Notice extends Memcached_DataObject
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build an SQL 'where' fragment for timestamp-based sorting from a max_id
|
||||||
|
* parameter, matching notices posted before the given one (inclusive), and
|
||||||
|
* if necessary add it to the data object's query.
|
||||||
|
*
|
||||||
|
* @param DB_DataObject $obj
|
||||||
|
* @param int $id
|
||||||
|
* @param string $idField
|
||||||
|
* @param string $createdField
|
||||||
|
* @return mixed string or false if no match
|
||||||
|
*/
|
||||||
|
public static function addWhereMaxId(DB_DataObject $obj, $id, $idField='id', $createdField='created')
|
||||||
|
{
|
||||||
|
$max = self::whereMaxId($id);
|
||||||
|
if ($max) {
|
||||||
|
$obj->whereAdd($max);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -252,58 +252,22 @@ class Profile extends Memcached_DataObject
|
|||||||
{
|
{
|
||||||
$notice = new Notice();
|
$notice = new Notice();
|
||||||
|
|
||||||
// Temporary hack until notice_profile_id_idx is updated
|
$notice->profile_id = $this->id;
|
||||||
// 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) {
|
$notice->selectAdd();
|
||||||
$query .= " and id > $since_id";
|
$notice->selectAdd('id');
|
||||||
}
|
|
||||||
|
|
||||||
if ($max_id != 0) {
|
Notice::addWhereSinceId($notice, $since_id);
|
||||||
$query .= " and id <= $max_id";
|
Notice::addWhereMaxId($notice, $max_id);
|
||||||
}
|
|
||||||
|
|
||||||
$query .= ' order by id DESC';
|
$notice->orderBy('created DESC, id DESC');
|
||||||
|
|
||||||
if (!is_null($offset)) {
|
if (!is_null($offset)) {
|
||||||
$query .= " LIMIT $limit OFFSET $offset";
|
$notice->limit($offset, $limit);
|
||||||
}
|
|
||||||
|
|
||||||
$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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$notice->find();
|
||||||
|
|
||||||
$ids = array();
|
$ids = array();
|
||||||
|
|
||||||
while ($notice->fetch()) {
|
while ($notice->fetch()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user