Merge pull request #962 from ArthurHoaro/feature/perfs2

Performances: reorder links when they're written instead of read
This commit is contained in:
ArthurHoaro 2017-10-28 12:44:44 +02:00 committed by GitHub
commit 0926d26390
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
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; 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 @@ You use the community supported version of the original Shaarli project, by Seba
} }
$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 @@ You use the community supported version of the original Shaarli project, by Seba
*/ */
private function write() private function write()
{ {
$this->reorder();
FileUtils::writeFlatDB($this->datastore, $this->links); 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; 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;

View file

@ -436,6 +436,14 @@ class Updater
} }
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'));
}
} }
/** /**

View file

@ -7,6 +7,10 @@ require_once 'application/LinkFilter.php';
*/ */
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);
} }
/** /**

View file

@ -141,12 +141,34 @@ class ReferenceLinkDB
*/ */
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 @@ class ReferenceLinkDB
public function getLinks() public function getLinks()
{ {
$this->reorder();
return $this->_links; return $this->_links;
} }