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 @@ private function read()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->urls = [];
|
||||||
|
$this->ids = [];
|
||||||
$this->links = FileUtils::readFlatDB($this->datastore, []);
|
$this->links = FileUtils::readFlatDB($this->datastore, []);
|
||||||
|
|
||||||
$toremove = array();
|
$toremove = array();
|
||||||
foreach ($this->links as $key => &$link) {
|
foreach ($this->links as $key => &$link) {
|
||||||
if (! $this->loggedIn && $link['private'] != 0) {
|
if (! $this->loggedIn && $link['private'] != 0) {
|
||||||
// Transition for not upgraded databases.
|
// Transition for not upgraded databases.
|
||||||
$toremove[] = $key;
|
unset($this->links[$key]);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,14 +331,10 @@ private function read()
|
||||||
}
|
}
|
||||||
$link['shorturl'] = smallHash($link['linkdate']);
|
$link['shorturl'] = smallHash($link['linkdate']);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// If user is not logged in, filter private links.
|
$this->urls[$link['url']] = $key;
|
||||||
foreach ($toremove as $offset) {
|
$this->ids[$link['id']] = $key;
|
||||||
unset($this->links[$offset]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->reorder();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -346,6 +344,7 @@ private function read()
|
||||||
*/
|
*/
|
||||||
private function write()
|
private function write()
|
||||||
{
|
{
|
||||||
|
$this->reorder();
|
||||||
FileUtils::writeFlatDB($this->datastore, $this->links);
|
FileUtils::writeFlatDB($this->datastore, $this->links);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -528,8 +527,8 @@ public function reorder($order = 'DESC')
|
||||||
return $a['created'] < $b['created'] ? 1 * $order : -1 * $order;
|
return $a['created'] < $b['created'] ? 1 * $order : -1 * $order;
|
||||||
});
|
});
|
||||||
|
|
||||||
$this->urls = array();
|
$this->urls = [];
|
||||||
$this->ids = array();
|
$this->ids = [];
|
||||||
foreach ($this->links as $key => $link) {
|
foreach ($this->links as $key => $link) {
|
||||||
$this->urls[$link['url']] = $key;
|
$this->urls[$link['url']] = $key;
|
||||||
$this->ids[$link['id']] = $key;
|
$this->ids[$link['id']] = $key;
|
||||||
|
|
|
@ -436,6 +436,14 @@ public function updateMethodResetHistoryFile()
|
||||||
}
|
}
|
||||||
return true;
|
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 @@
|
||||||
*/
|
*/
|
||||||
class LinkFilterTest extends PHPUnit_Framework_TestCase
|
class LinkFilterTest extends PHPUnit_Framework_TestCase
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @var string Test datastore path.
|
||||||
|
*/
|
||||||
|
protected static $testDatastore = 'sandbox/datastore.php';
|
||||||
/**
|
/**
|
||||||
* @var LinkFilter instance.
|
* @var LinkFilter instance.
|
||||||
*/
|
*/
|
||||||
|
@ -17,13 +21,20 @@ class LinkFilterTest extends PHPUnit_Framework_TestCase
|
||||||
*/
|
*/
|
||||||
protected static $refDB;
|
protected static $refDB;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var LinkDB instance
|
||||||
|
*/
|
||||||
|
protected static $linkDB;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instanciate linkFilter with ReferenceLinkDB data.
|
* Instanciate linkFilter with ReferenceLinkDB data.
|
||||||
*/
|
*/
|
||||||
public static function setUpBeforeClass()
|
public static function setUpBeforeClass()
|
||||||
{
|
{
|
||||||
self::$refDB = new ReferenceLinkDB();
|
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 @@ protected function addLink($id, $title, $url, $description, $private, $date, $ta
|
||||||
*/
|
*/
|
||||||
public function write($filename)
|
public function write($filename)
|
||||||
{
|
{
|
||||||
|
$this->reorder();
|
||||||
file_put_contents(
|
file_put_contents(
|
||||||
$filename,
|
$filename,
|
||||||
'<?php /* '.base64_encode(gzdeflate(serialize($this->_links))).' */ ?>'
|
'<?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
|
* Returns the number of links in the reference data
|
||||||
*/
|
*/
|
||||||
|
@ -187,6 +209,7 @@ public function countUntaggedLinks()
|
||||||
|
|
||||||
public function getLinks()
|
public function getLinks()
|
||||||
{
|
{
|
||||||
|
$this->reorder();
|
||||||
return $this->_links;
|
return $this->_links;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue