From 214357ca68ebd80cc59cd1ee34a5a292feaebbe0 Mon Sep 17 00:00:00 2001
From: Robin Appelman <icewind@owncloud.com>
Date: Wed, 19 Mar 2014 13:53:59 +0100
Subject: [PATCH] Improve sorting performance of large lists of files

---
 apps/files/ajax/rawlist.php        |  5 ++---
 apps/files/lib/helper.php          | 15 +++++++++------
 apps/files_trashbin/lib/helper.php |  8 ++++++--
 3 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/apps/files/ajax/rawlist.php b/apps/files/ajax/rawlist.php
index 89c21a172f..6433ddefd6 100644
--- a/apps/files/ajax/rawlist.php
+++ b/apps/files/ajax/rawlist.php
@@ -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));
diff --git a/apps/files/lib/helper.php b/apps/files/lib/helper.php
index b9e41a352b..c41e2d1558 100644
--- a/apps/files/lib/helper.php
+++ b/apps/files/lib/helper.php
@@ -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());
 		}
 	}
 
diff --git a/apps/files_trashbin/lib/helper.php b/apps/files_trashbin/lib/helper.php
index fe0d1d30a7..9c24332a96 100644
--- a/apps/files_trashbin/lib/helper.php
+++ b/apps/files_trashbin/lib/helper.php
@@ -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'));
-- 
GitLab