Merge pull request #7800 from owncloud/filesort-performance

Improve sorting performance of large lists of files
This commit is contained in:
icewind1991 2014-03-19 15:38:15 +01:00
commit 4f95adfb76
3 changed files with 17 additions and 11 deletions

View File

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

View File

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

View File

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