summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2014-12-18 17:27:56 +0100
committerVincent Petry <pvince81@owncloud.com>2014-12-18 17:27:56 +0100
commit11b3aa2dbe792c306dab6f17b9633393ae739090 (patch)
treee8318cab8fe5fe7c0cb302f9b40c1f0ec31ac917
parent10a0fc2856bfa68ff04a42f141829a6e66a9b2da (diff)
downloadnextcloud-server-11b3aa2dbe792c306dab6f17b9633393ae739090.tar.gz
nextcloud-server-11b3aa2dbe792c306dab6f17b9633393ae739090.zip
Fix issues with searchByTag in shared storage
-rw-r--r--apps/files_sharing/lib/cache.php34
-rw-r--r--apps/files_sharing/tests/cache.php57
2 files changed, 78 insertions, 13 deletions
diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php
index e3bee145876..21f807f3533 100644
--- a/apps/files_sharing/lib/cache.php
+++ b/apps/files_sharing/lib/cache.php
@@ -345,6 +345,20 @@ class Shared_Cache extends Cache {
}
/**
+ * Checks whether the given file has the given tag.
+ *
+ * @param \OCP\ITags $tagger
+ * @param array $fileData file data
+ * @param string $tag tag to check for
+ * @return boolean true if the given file has the expected tag,
+ * false otherwise
+ */
+ private function hasTag($tagger, $fileData, $tag) {
+ $tags = $tagger->getTagsForObjects(array((int)$fileData['fileid']));
+ return (!empty($tags) && in_array($tag, current($tags)));
+ }
+
+ /**
* search for files by tag
*
* @param string|int $tag tag to search for
@@ -356,28 +370,24 @@ class Shared_Cache extends Cache {
$tagger = \OC::$server->getTagManager()->load('files', null, null, $userId);
$result = array();
$exploreDirs = array('');
+ // check if root is tagged
+ $file = $this->get('');
+ if ($this->hasTag($tagger, $file, $tag)) {
+ $result[] = $file;
+ }
// FIXME: this is so wrong and unefficient, need to replace with actual DB queries
while (count($exploreDirs) > 0) {
$dir = array_pop($exploreDirs);
$files = $this->getFolderContents($dir);
- // no results?
if (!$files) {
- // maybe it's a single shared file
- $file = $this->get('');
- $tags = $tagger->getTagsForObjects(array((int)$file['fileid']));
- if (!empty($tags) && in_array($tag, current($tags))) {
- $result[] = $file;
- }
continue;
}
foreach ($files as $file) {
+ if ($this->hasTag($tagger, $file, $tag)) {
+ $result[] = $file;
+ }
if ($file['mimetype'] === 'httpd/unix-directory') {
$exploreDirs[] = ltrim($dir . '/' . $file['name'], '/');
- } else {
- $tags = $tagger->getTagsForObjects(array((int)$file['fileid']));
- if (!empty($tags) && in_array($tag, current($tags))) {
- $result[] = $file;
- }
}
}
}
diff --git a/apps/files_sharing/tests/cache.php b/apps/files_sharing/tests/cache.php
index b60bba73db8..f3f8f924b44 100644
--- a/apps/files_sharing/tests/cache.php
+++ b/apps/files_sharing/tests/cache.php
@@ -22,7 +22,6 @@ use OCA\Files_sharing\Tests\TestCase;
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
-
class Test_Files_Sharing_Cache extends TestCase {
/**
@@ -238,6 +237,62 @@ class Test_Files_Sharing_Cache extends TestCase {
$tagManager->delete(array('tag1', 'tag2'));
}
+ /**
+ * Test searching by tag for multiple sections of the tree
+ */
+ function testSearchByTagTree() {
+ $userId = \OC::$server->getUserSession()->getUser()->getUId();
+ $this->sharedStorage->mkdir('subdir/emptydir');
+ $this->sharedStorage->mkdir('subdir/emptydir2');
+ $this->ownerStorage->getScanner()->scan('');
+ $allIds = array(
+ $this->sharedCache->get('')['fileid'],
+ $this->sharedCache->get('bar.txt')['fileid'],
+ $this->sharedCache->get('subdir/another too.txt')['fileid'],
+ $this->sharedCache->get('subdir/not a text file.xml')['fileid'],
+ $this->sharedCache->get('subdir/another.txt')['fileid'],
+ $this->sharedCache->get('subdir/emptydir')['fileid'],
+ $this->sharedCache->get('subdir/emptydir2')['fileid'],
+ );
+ $tagManager = \OC::$server->getTagManager()->load('files', null, null, $userId);
+ foreach ($allIds as $id) {
+ $tagManager->tagAs($id, 'tag1');
+ }
+ $results = $this->sharedStorage->getCache()->searchByTag('tag1', $userId);
+ $check = array(
+ array(
+ 'name' => 'shareddir',
+ 'path' => ''
+ ),
+ array(
+ 'name' => 'bar.txt',
+ 'path' => 'bar.txt'
+ ),
+ array(
+ 'name' => 'another.txt',
+ 'path' => 'subdir/another.txt'
+ ),
+ array(
+ 'name' => 'another too.txt',
+ 'path' => 'subdir/another too.txt'
+ ),
+ array(
+ 'name' => 'emptydir',
+ 'path' => 'subdir/emptydir'
+ ),
+ array(
+ 'name' => 'emptydir2',
+ 'path' => 'subdir/emptydir2'
+ ),
+ array(
+ 'name' => 'not a text file.xml',
+ 'path' => 'subdir/not a text file.xml'
+ ),
+ );
+ $this->verifyFiles($check, $results);
+ $tagManager->delete(array('tag1'));
+ }
+
function testGetFolderContentsInRoot() {
$results = $this->user2View->getDirectoryContent('/');