summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorLukas Reschke <lukas@owncloud.com>2015-02-09 18:39:52 +0100
committerLukas Reschke <lukas@owncloud.com>2015-02-09 18:39:52 +0100
commit74de345c7f82f115308bfbdff88d5940d46e19be (patch)
tree3d83189466685464240ed02c2ad8eb6b5ac9ee5f /lib
parentc4d9ae8af4dc34cc79cc73d16b7ee62f52cd5b5f (diff)
parenta79757bc37d5c93f4804cac35e1f1ac7641a07a7 (diff)
downloadnextcloud-server-74de345c7f82f115308bfbdff88d5940d46e19be.tar.gz
nextcloud-server-74de345c7f82f115308bfbdff88d5940d46e19be.zip
Merge pull request #13511 from owncloud/naturalsort_speeeeeed
NaturalSort performance improvements
Diffstat (limited to 'lib')
-rw-r--r--lib/private/files/fileinfo.php7
-rw-r--r--lib/private/naturalsort.php17
2 files changed, 13 insertions, 11 deletions
diff --git a/lib/private/files/fileinfo.php b/lib/private/files/fileinfo.php
index e4a397dcca2..1acb62033dd 100644
--- a/lib/private/files/fileinfo.php
+++ b/lib/private/files/fileinfo.php
@@ -159,11 +159,10 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess {
* @return \OCP\Files\FileInfo::TYPE_FILE|\OCP\Files\FileInfo::TYPE_FOLDER
*/
public function getType() {
- if (isset($this->data['type'])) {
- return $this->data['type'];
- } else {
- return $this->getMimetype() === 'httpd/unix-directory' ? self::TYPE_FOLDER : self::TYPE_FILE;
+ if (!isset($this->data['type'])) {
+ $this->data['type'] = ($this->getMimetype() === 'httpd/unix-directory') ? self::TYPE_FOLDER : self::TYPE_FILE;
}
+ return $this->data['type'];
}
public function getData() {
diff --git a/lib/private/naturalsort.php b/lib/private/naturalsort.php
index 6e259630f79..d511bfa3f66 100644
--- a/lib/private/naturalsort.php
+++ b/lib/private/naturalsort.php
@@ -12,6 +12,7 @@ namespace OC;
class NaturalSort {
private static $instance;
private $collator;
+ private $cache = array();
/**
* Split the given string in chunks of numbers and strings
@@ -21,13 +22,15 @@ class NaturalSort {
private function naturalSortChunkify($t) {
// Adapted and ported to PHP from
// http://my.opera.com/GreyWyvern/blog/show.dml/1671288
+ if (isset($this->cache[$t])) {
+ return $this->cache[$t];
+ }
$tz = array();
$x = 0;
$y = -1;
$n = null;
- $length = strlen($t);
- while ($x < $length) {
+ while (isset($t[$x])) {
$c = $t[$x];
// only include the dot in strings
$m = ((!$n && $c === '.') || ($c >= '0' && $c <= '9'));
@@ -40,6 +43,7 @@ class NaturalSort {
$tz[$y] .= $c;
$x++;
}
+ $this->cache[$t] = $tz;
return $tz;
}
@@ -75,14 +79,13 @@ class NaturalSort {
// instead of ["test.txt", "test (2).txt"]
$aa = self::naturalSortChunkify($a);
$bb = self::naturalSortChunkify($b);
- $alen = count($aa);
- $blen = count($bb);
- for ($x = 0; $x < $alen && $x < $blen; $x++) {
+ for ($x = 0; isset($aa[$x]) && isset($bb[$x]); $x++) {
$aChunk = $aa[$x];
$bChunk = $bb[$x];
if ($aChunk !== $bChunk) {
- if (is_numeric($aChunk) && is_numeric($bChunk)) {
+ // test first character (character comparison, not number comparison)
+ if ($aChunk[0] >= '0' && $aChunk[0] <= '9' && $bChunk[0] >= '0' && $bChunk[0] <= '9') {
$aNum = (int)$aChunk;
$bNum = (int)$bChunk;
return $aNum - $bNum;
@@ -90,7 +93,7 @@ class NaturalSort {
return self::getCollator()->compare($aChunk, $bChunk);
}
}
- return $alen - $blen;
+ return count($aa) - count($bb);
}
/**