From 1a262631235445d6ba4d9d0b5bdbc84355e43e5c Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 18 Mar 2015 15:58:06 +0100 Subject: [PATCH] Do not walk over the users directory, but over the list of tagged objects Way quicker --- apps/files/service/tagservice.php | 31 ++++++++++++++----------------- lib/private/tags.php | 5 +++-- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/apps/files/service/tagservice.php b/apps/files/service/tagservice.php index fe26838552..cdd51d27f4 100644 --- a/apps/files/service/tagservice.php +++ b/apps/files/service/tagservice.php @@ -48,7 +48,7 @@ class TagService { * @param string $path path * @param array $tags array of tags * @return array list of tags - * @throws \OCP\NotFoundException if the file does not exist + * @throws \OCP\Files\NotFoundException if the file does not exist */ public function updateFileTags($path, $tags) { $fileId = $this->homeFolder->get($path)->getId(); @@ -74,30 +74,27 @@ class TagService { } /** - * Updates the tags of the specified file path. - * The passed tags are absolute, which means they will - * replace the actual tag selection. + * Get all files for the given tag * * @param array $tagName tag name to filter by * @return FileInfo[] list of matching files * @throws \Exception if the tag does not exist */ public function getFilesByTag($tagName) { - $nodes = $this->homeFolder->searchByTag( - $tagName, $this->userSession->getUser()->getUId() - ); - $fileInfos = []; - foreach ($nodes as $node) { - try { - /** @var \OC\Files\Node\Node $node */ - $fileInfos[] = $node->getFileInfo(); - } catch (\Exception $e) { - // FIXME Should notify the user, when this happens - // Can not get FileInfo, maybe the connection to the external - // storage is interrupted. - } + try { + $fileIds = $this->tagger->getIdsForTag($tagName); + } catch (\Exception $e) { + return []; } + $fileInfos = []; + foreach ($fileIds as $fileId) { + $nodes = $this->homeFolder->getById((int) $fileId); + foreach ($nodes as $node) { + /** @var \OC\Files\Node\Node $node */ + $fileInfos[] = $node->getFileInfo(); + } + } return $fileInfos; } } diff --git a/lib/private/tags.php b/lib/private/tags.php index 200ec8c277..276da9d4b8 100644 --- a/lib/private/tags.php +++ b/lib/private/tags.php @@ -34,8 +34,8 @@ namespace OC; -use \OC\Tagging\Tag, - \OC\Tagging\TagMapper; +use \OC\Tagging\Tag; +use \OC\Tagging\TagMapper; class Tags implements \OCP\ITags { @@ -248,6 +248,7 @@ class Tags implements \OCP\ITags { * * @param string $tag Tag id or name. * @return array|false An array of object ids or false on error. + * @throws \Exception */ public function getIdsForTag($tag) { $result = null;