Improve sorting performance of large lists of files

This commit is contained in:
Robin Appelman 2014-03-19 13:53:59 +01:00
parent b9fc240b83
commit 214357ca68
3 changed files with 17 additions and 11 deletions

View File

@ -33,6 +33,8 @@ if (is_array($mimetypes) && count($mimetypes)) {
} else {
$files = array_merge($files, \OC\Files\Filesystem::getDirectoryContent($dir));
}
// Sort by name
usort($files, array('\OCA\Files\Helper', 'fileCmp'));
$result = array();
foreach ($files as $file) {
@ -51,7 +53,4 @@ foreach ($files as $file) {
$result[] = $fileData;
}
// Sort by name
usort($result, array('\OCA\Files\Helper', 'fileCmp'));
OC_JSON::success(array('data' => $result));

View File

@ -51,17 +51,20 @@ class Helper
/**
* Comparator function to sort files alphabetically and have
* the directories appear first
* @param array $a file
* @param array $b file
* @return -1 if $a must come before $b, 1 otherwise
*
* @param \OCP\Files\FileInfo $a file
* @param \OCP\Files\FileInfo $b file
* @return int -1 if $a must come before $b, 1 otherwise
*/
public static function fileCmp($a, $b) {
if ($a['type'] === 'dir' and $b['type'] !== 'dir') {
$aType = $a->getType();
$bType = $b->getType();
if ($aType === 'dir' and $bType !== 'dir') {
return -1;
} elseif ($a['type'] !== 'dir' and $b['type'] === 'dir') {
} elseif ($aType !== 'dir' and $bType === 'dir') {
return 1;
} else {
return strnatcasecmp($a['name'], $b['name']);
return strnatcasecmp($a->getName(), $b->getName());
}
}

View File

@ -2,13 +2,15 @@
namespace OCA\Files_Trashbin;
use OC\Files\FileInfo;
class Helper
{
/**
* Retrieves the contents of a trash bin directory.
* @param string $dir path to the directory inside the trashbin
* or empty to retrieve the root of the trashbin
* @return array of files
* @return \OCP\Files\FileInfo[]
*/
public static function getTrashFiles($dir){
$result = array();
@ -52,6 +54,8 @@ class Helper
$files = array();
$id = 0;
list($storage, $internalPath) = $view->resolvePath($dir);
$absoluteDir = $view->getAbsolutePath($dir);
foreach ($result as $r) {
$i = array();
$i['id'] = $id++;
@ -77,7 +81,7 @@ class Helper
$i['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($r['mime']);
}
$i['icon'] = \OCA\Files\Helper::determineIcon($i);
$files[] = $i;
$files[] = new FileInfo($absoluteDir . '/' . $i['name'], $storage, $internalPath . '/' . $i['name'], $i);
}
usort($files, array('\OCA\Files\Helper', 'fileCmp'));