]> git.immae.eu Git - github/shaarli/Shaarli.git/commitdiff
Performances: reorder links when they're written instead of read 962/head
authorArthurHoaro <arthur@hoa.ro>
Sat, 2 Sep 2017 13:10:44 +0000 (15:10 +0200)
committerArthurHoaro <arthur@hoa.ro>
Sat, 2 Sep 2017 13:10:44 +0000 (15:10 +0200)
relates to #891

application/LinkDB.php
application/Updater.php
tests/LinkFilterTest.php
tests/utils/ReferenceLinkDB.php

index 22c1f0ab5321b3ccb274931637ba642357ddecb6..eace625eed517f840fbd8cdd65516c66b4d7d966 100644 (file)
@@ -289,13 +289,15 @@ You use the community supported version of the original Shaarli project, by Seba
             return;
         }
 
+        $this->urls = [];
+        $this->ids = [];
         $this->links = FileUtils::readFlatDB($this->datastore, []);
 
         $toremove = array();
         foreach ($this->links as $key => &$link) {
             if (! $this->loggedIn && $link['private'] != 0) {
                 // Transition for not upgraded databases.
-                $toremove[] = $key;
+                unset($this->links[$key]);
                 continue;
             }
 
@@ -329,14 +331,10 @@ You use the community supported version of the original Shaarli project, by Seba
                 }
                 $link['shorturl'] = smallHash($link['linkdate']);
             }
-        }
 
-        // If user is not logged in, filter private links.
-        foreach ($toremove as $offset) {
-            unset($this->links[$offset]);
+            $this->urls[$link['url']] = $key;
+            $this->ids[$link['id']] = $key;
         }
-
-        $this->reorder();
     }
 
     /**
@@ -346,6 +344,7 @@ You use the community supported version of the original Shaarli project, by Seba
      */
     private function write()
     {
+        $this->reorder();
         FileUtils::writeFlatDB($this->datastore, $this->links);
     }
 
@@ -528,8 +527,8 @@ You use the community supported version of the original Shaarli project, by Seba
             return $a['created'] < $b['created'] ? 1 * $order : -1 * $order;
         });
 
-        $this->urls = array();
-        $this->ids = array();
+        $this->urls = [];
+        $this->ids = [];
         foreach ($this->links as $key => $link) {
             $this->urls[$link['url']] = $key;
             $this->ids[$link['id']] = $key;
index 40a15906b6bac9b53fb54faff0232b6514dd76ec..0702158a7c9e1f3e4192dbcb5d85c3d75fd438d1 100644 (file)
@@ -436,6 +436,14 @@ class Updater
         }
         return true;
     }
+
+    /**
+     * Save the datastore -> the link order is now applied when links are saved.
+     */
+    public function updateMethodReorderDatastore()
+    {
+        $this->linkDB->save($this->conf->get('resource.page_cache'));
+    }
 }
 
 /**
index d796d3a301c469652bbb8bcc6295db0e539417cb..9cd6dbd443b2a52b492cd165d12155c06aa14f49 100644 (file)
@@ -7,6 +7,10 @@ require_once 'application/LinkFilter.php';
  */
 class LinkFilterTest extends PHPUnit_Framework_TestCase
 {
+    /**
+     * @var string Test datastore path.
+     */
+    protected static $testDatastore = 'sandbox/datastore.php';
     /**
      * @var LinkFilter instance.
      */
@@ -17,13 +21,20 @@ class LinkFilterTest extends PHPUnit_Framework_TestCase
      */
     protected static $refDB;
 
+    /**
+     * @var LinkDB instance
+     */
+    protected static $linkDB;
+
     /**
      * Instanciate linkFilter with ReferenceLinkDB data.
      */
     public static function setUpBeforeClass()
     {
         self::$refDB = new ReferenceLinkDB();
-        self::$linkFilter = new LinkFilter(self::$refDB->getLinks());
+        self::$refDB->write(self::$testDatastore);
+        self::$linkDB = new LinkDB(self::$testDatastore, true, false);
+        self::$linkFilter = new LinkFilter(self::$linkDB);
     }
 
     /**
index f09eebc13b26f701ecc8944602794bc22adbc219..e887aa78c2251747c46cf37fab4359c782b32b36 100644 (file)
@@ -141,12 +141,34 @@ class ReferenceLinkDB
      */
     public function write($filename)
     {
+        $this->reorder();
         file_put_contents(
             $filename,
             '<?php /* '.base64_encode(gzdeflate(serialize($this->_links))).' */ ?>'
         );
     }
 
+    /**
+     * Reorder links by creation date (newest first).
+     *
+     * Also update the urls and ids mapping arrays.
+     *
+     * @param string $order ASC|DESC
+     */
+    public function reorder($order = 'DESC')
+    {
+        // backward compatibility: ignore reorder if the the `created` field doesn't exist
+        if (! isset(array_values($this->_links)[0]['created'])) {
+            return;
+        }
+
+        $order = $order === 'ASC' ? -1 : 1;
+        // Reorder array by dates.
+        usort($this->_links, function($a, $b) use ($order) {
+            return $a['created'] < $b['created'] ? 1 * $order : -1 * $order;
+        });
+    }
+
     /**
      * Returns the number of links in the reference data
      */
@@ -187,6 +209,7 @@ class ReferenceLinkDB
 
     public function getLinks()
     {
+        $this->reorder();
         return $this->_links;
     }