Skip to content

Commit 2179cf1

Browse files
committed
perf: Allow filtering the directory content by mimetype
Signed-off-by: Carl Schwan <carlschwan@kde.org>
1 parent c6c11d4 commit 2179cf1

10 files changed

Lines changed: 39 additions & 32 deletions

File tree

apps/files/lib/Controller/ApiController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ public function getFolderTree(string $path = '/', int $depth = 1): JSONResponse
308308
'message' => $this->l10n->t('Invalid folder path'),
309309
], Http::STATUS_BAD_REQUEST);
310310
}
311-
$nodes = $node->getDirectoryListing();
311+
$nodes = $node->getDirectoryListing('httpd/unix-directory');
312312
$tree = $this->getChildren($nodes, $depth);
313313
} catch (NotFoundException $e) {
314314
return new JSONResponse([

apps/files_sharing/lib/External/Cache.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ public function get($file) {
4141
return $result;
4242
}
4343

44-
public function getFolderContentsById($fileId) {
45-
$results = parent::getFolderContentsById($fileId);
44+
public function getFolderContentsById($fileId, string $mimeTypeFilter = '') {
45+
$results = parent::getFolderContentsById($fileId, $mimeTypeFilter);
4646
foreach ($results as &$file) {
4747
$file['displayname_owner'] = $this->cloudId->getDisplayId();
4848
}

lib/private/Files/Cache/Cache.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,21 +216,30 @@ public function getFolderContents($folder) {
216216
* @param int $fileId the file id of the folder
217217
* @return ICacheEntry[]
218218
*/
219-
public function getFolderContentsById($fileId) {
219+
public function getFolderContentsById(int $fileId, string $mimeTypeFilter = '') {
220220
if ($fileId > -1) {
221221
$query = $this->getQueryBuilder();
222222
$query->selectFileCache()
223223
->whereParent($fileId)
224224
->whereStorageId($this->getNumericStorageId())
225225
->orderBy('name', 'ASC');
226226

227+
if (!empty($mimeTypeFilter)) {
228+
$mimetype = $this->mimetypeLoader->getId($mimeTypeFilter);
229+
if (str_contains($mimeTypeFilter, '/')) {
230+
$query->andWhere($query->expr()->eq('mimetype', $query->createNamedParameter($mimetype)));
231+
} else {
232+
$query->andWhere($query->expr()->eq('mimepart', $query->createNamedParameter($mimetype)));
233+
}
234+
}
235+
227236
$metadataQuery = $query->selectMetadata();
228237

229238
$result = $query->executeQuery();
230239
$files = $result->fetchAll();
231240
$result->closeCursor();
232241

233-
return array_map(function (array $data) use ($metadataQuery) {
242+
return array_map(function (array $data) use ($metadataQuery): ICacheEntry {
234243
$data['metadata'] = $metadataQuery->extractMetadata($data)->asArray();
235244
return self::cacheEntryFromData($data, $this->mimetypeLoader);
236245
}, $files);

lib/private/Files/Cache/Wrapper/CacheWrapper.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,9 @@ public function getFolderContents($folder) {
105105
* @param int $fileId the file id of the folder
106106
* @return array
107107
*/
108-
public function getFolderContentsById($fileId) {
109-
$results = $this->getCache()->getFolderContentsById($fileId);
110-
return array_map([$this, 'formatCacheEntry'], $results);
108+
public function getFolderContentsById(int $fileId, string $mimeTypeFilter = '') {
109+
$results = $this->getCache()->getFolderContentsById($fileId, $mimeTypeFilter);
110+
return array_map($this->formatCacheEntry(...), $results);
111111
}
112112

113113
/**

lib/private/Files/Node/Folder.php

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,11 @@ public function isSubNode($node) {
7676
return str_starts_with($node->getPath(), $this->path . '/');
7777
}
7878

79-
/**
80-
* get the content of this directory
81-
*
82-
* @return Node[]
83-
* @throws \OCP\Files\NotFoundException
84-
*/
85-
public function getDirectoryListing() {
86-
$folderContent = $this->view->getDirectoryContent($this->path, '', $this->getFileInfo(false));
79+
#[Override]
80+
public function getDirectoryListing(string $mimetypeFilter = ''): array {
81+
$folderContent = $this->view->getDirectoryContent($this->path, $mimetypeFilter, $this->getFileInfo(false));
8782

88-
return array_map(function (FileInfo $info) {
83+
return array_map(function (FileInfo $info): Node {
8984
if ($info->getMimetype() === FileInfo::MIMETYPE_FOLDER) {
9085
return new Folder($this->root, $this->view, $info->getPath(), $info, $this);
9186
} else {

lib/private/Files/Node/LazyFolder.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -415,10 +415,8 @@ public function isSubNode($node) {
415415
return $this->__call(__FUNCTION__, func_get_args());
416416
}
417417

418-
/**
419-
* @inheritDoc
420-
*/
421-
public function getDirectoryListing() {
418+
#[Override]
419+
public function getDirectoryListing(string $mimetypeFilter = ''): array {
422420
return $this->__call(__FUNCTION__, func_get_args());
423421
}
424422

lib/private/Files/Node/NonExistingFolder.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
namespace OC\Files\Node;
99

1010
use OCP\Files\NotFoundException;
11+
use Override;
1112

1213
class NonExistingFolder extends Folder {
1314
/**
@@ -118,7 +119,8 @@ public function get($path) {
118119
throw new NotFoundException();
119120
}
120121

121-
public function getDirectoryListing() {
122+
#[Override]
123+
public function getDirectoryListing(string $mimetypeFilter = ''): array {
122124
throw new NotFoundException();
123125
}
124126

lib/private/Files/View.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1471,10 +1471,10 @@ public function addSubMounts(FileInfo $info, $extOnly = false): void {
14711471
* get the content of a directory
14721472
*
14731473
* @param string $directory path under datadirectory
1474-
* @param string $mimetype_filter limit returned content to this mimetype or mimepart
1474+
* @param string $mimeTypeFilter limit returned content to this mimetype or mimepart
14751475
* @return FileInfo[]
14761476
*/
1477-
public function getDirectoryContent($directory, $mimetype_filter = '', ?\OCP\Files\FileInfo $directoryInfo = null) {
1477+
public function getDirectoryContent(string $directory, string $mimeTypeFilter = '', ?\OCP\Files\FileInfo $directoryInfo = null) {
14781478
$this->assertPathLength($directory);
14791479
if (!Filesystem::isValidPath($directory)) {
14801480
return [];
@@ -1506,7 +1506,7 @@ public function getDirectoryContent($directory, $mimetype_filter = '', ?\OCP\Fil
15061506
}
15071507

15081508
$folderId = $data->getId();
1509-
$contents = $cache->getFolderContentsById($folderId); //TODO: mimetype_filter
1509+
$contents = $cache->getFolderContentsById($folderId, $mimeTypeFilter);
15101510

15111511
$sharingDisabled = \OCP\Util::isSharingDisabledForUser();
15121512
$permissionsMask = ~\OCP\Constants::PERMISSION_SHARE;
@@ -1632,12 +1632,12 @@ public function getDirectoryContent($directory, $mimetype_filter = '', ?\OCP\Fil
16321632
}
16331633
}
16341634

1635-
if ($mimetype_filter) {
1636-
$files = array_filter($files, function (FileInfo $file) use ($mimetype_filter) {
1637-
if (strpos($mimetype_filter, '/')) {
1638-
return $file->getMimetype() === $mimetype_filter;
1635+
if ($mimeTypeFilter) {
1636+
$files = array_filter($files, function (FileInfo $file) use ($mimeTypeFilter) {
1637+
if (strpos($mimeTypeFilter, '/')) {
1638+
return $file->getMimetype() === $mimeTypeFilter;
16391639
} else {
1640-
return $file->getMimePart() === $mimetype_filter;
1640+
return $file->getMimePart() === $mimeTypeFilter;
16411641
}
16421642
});
16431643
}

lib/public/Files/Cache/ICache.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,12 @@ public function getFolderContents($folder);
7777
* Only returns files one level deep, no recursion
7878
*
7979
* @param int $fileId the file id of the folder
80+
* @param string $mimeTypeFilter The mimetype or mimepart for which the content should be filtered
8081
* @return ICacheEntry[]
8182
* @since 9.0.0
83+
* @since 33.0.0 The $mimetypeFilter was added.
8284
*/
83-
public function getFolderContentsById($fileId);
85+
public function getFolderContentsById(int $fileId, string $mimeTypeFilter = '');
8486

8587
/**
8688
* store meta data for a file or folder

lib/public/Files/Folder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,12 @@ public function isSubNode($node);
4848
/**
4949
* get the content of this directory
5050
*
51+
* @param string $mimetypeFilter Limit the returned content to this mimetype or mimepart
5152
* @throws \OCP\Files\NotFoundException
5253
* @return \OCP\Files\Node[]
5354
* @since 6.0.0
5455
*/
55-
public function getDirectoryListing();
56+
public function getDirectoryListing(string $mimetypeFilter = ''): array;
5657

5758
/**
5859
* Get the node at $path

0 commit comments

Comments
 (0)