Merge pull request #962 from ArthurHoaro/feature/perfs2
Performances: reorder links when they're written instead of read
This commit is contained in:
commit
0926d26390
4 changed files with 51 additions and 10 deletions
|
@ -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;
|
||||
|
|
|
@ -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'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue