summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrion Vibber <brion@pobox.com>2010-12-17 13:20:38 -0800
committerBrion Vibber <brion@pobox.com>2010-12-17 13:20:38 -0800
commit4cd3a0756bdfba4589dbf1efeab9a2a509e9d566 (patch)
treebdb291289903bc57934c37734085702711f7f97b
parent9e8bbff8ac3825dc789bcd19b1751fe24017a789 (diff)
Update notice sorting for profile streams; extract more common code to Notice::addSinceId() and Notice::addMaxId()
-rw-r--r--classes/Notice.php49
-rw-r--r--classes/Profile.php56
2 files changed, 50 insertions, 55 deletions
diff --git a/classes/Notice.php b/classes/Notice.php
index 14a91977d..ef5fba063 100644
--- a/classes/Notice.php
+++ b/classes/Notice.php
@@ -668,15 +668,8 @@ class Notice extends Memcached_DataObject
$notice->whereAdd('is_local !='. Notice::GATEWAY);
}
- $since = Notice::whereSinceId($since_id);
- if ($since) {
- $notice->whereAdd($since);
- }
-
- $max = Notice::whereMaxId($max_id);
- if ($max) {
- $notice->whereAdd($max);
- }
+ Notice::addWhereSinceId($notice, $since_id);
+ Notice::addWhereMaxId($notice, $max_id);
$ids = array();
@@ -2028,6 +2021,25 @@ class Notice extends Memcached_DataObject
}
/**
+ * 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
* parameter, matching notices posted before the given one (inclusive).
*
@@ -2046,4 +2058,23 @@ class Notice extends Memcached_DataObject
}
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);
+ }
+ }
}
diff --git a/classes/Profile.php b/classes/Profile.php
index 332d51e20..62789a489 100644
--- a/classes/Profile.php
+++ b/classes/Profile.php
@@ -252,58 +252,22 @@ class Profile extends Memcached_DataObject
{
$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);
- }
+ $notice->profile_id = $this->id;
- if ($max_id != 0) {
- $notice->whereAdd('id <= ' . $max_id);
- }
+ $notice->selectAdd();
+ $notice->selectAdd('id');
- $notice->orderBy('id DESC');
+ Notice::addWhereSinceId($notice, $since_id);
+ Notice::addWhereMaxId($notice, $max_id);
- if (!is_null($offset)) {
- $notice->limit($offset, $limit);
- }
+ $notice->orderBy('created DESC, id DESC');
- $notice->find();
+ if (!is_null($offset)) {
+ $notice->limit($offset, $limit);
}
+ $notice->find();
+
$ids = array();
while ($notice->fetch()) {