]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Update notice sorting for profile streams; extract more common code to Notice::addSin...
authorBrion Vibber <brion@pobox.com>
Fri, 17 Dec 2010 21:20:38 +0000 (13:20 -0800)
committerBrion Vibber <brion@pobox.com>
Fri, 17 Dec 2010 21:20:38 +0000 (13:20 -0800)
classes/Notice.php
classes/Profile.php

index 14a91977df79937953d1e50747484f1401621f5b..ef5fba063164f6f3f68bec9fc1268513b3855417 100644 (file)
@@ -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();
 
@@ -2027,6 +2020,25 @@ class Notice extends Memcached_DataObject
         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
      * 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);
+        }
+    }
 }
index 332d51e2037ea92f542c42cb9d24c8beb6804ce1..62789a489946198b0275441f2f2eebe6ce3278c7 100644 (file)
@@ -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()) {