Performances: reorder links when they're written instead of read

relates to #891
This commit is contained in:
ArthurHoaro 2017-09-02 15:10:44 +02:00
parent 96a1c79456
commit 9ec0a61156
4 changed files with 51 additions and 10 deletions

View 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;

View 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'));
}
}
/**

View 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);
}
/**

View 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;
}