Fix issues with searchByTag in shared storage
This commit is contained in:
parent
10a0fc2856
commit
11b3aa2dbe
|
@ -344,6 +344,20 @@ class Shared_Cache extends Cache {
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
* search for files by tag
|
||||||
*
|
*
|
||||||
|
@ -356,28 +370,24 @@ class Shared_Cache extends Cache {
|
||||||
$tagger = \OC::$server->getTagManager()->load('files', null, null, $userId);
|
$tagger = \OC::$server->getTagManager()->load('files', null, null, $userId);
|
||||||
$result = array();
|
$result = array();
|
||||||
$exploreDirs = 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
|
// FIXME: this is so wrong and unefficient, need to replace with actual DB queries
|
||||||
while (count($exploreDirs) > 0) {
|
while (count($exploreDirs) > 0) {
|
||||||
$dir = array_pop($exploreDirs);
|
$dir = array_pop($exploreDirs);
|
||||||
$files = $this->getFolderContents($dir);
|
$files = $this->getFolderContents($dir);
|
||||||
// no results?
|
|
||||||
if (!$files) {
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
foreach ($files as $file) {
|
foreach ($files as $file) {
|
||||||
|
if ($this->hasTag($tagger, $file, $tag)) {
|
||||||
|
$result[] = $file;
|
||||||
|
}
|
||||||
if ($file['mimetype'] === 'httpd/unix-directory') {
|
if ($file['mimetype'] === 'httpd/unix-directory') {
|
||||||
$exploreDirs[] = ltrim($dir . '/' . $file['name'], '/');
|
$exploreDirs[] = ltrim($dir . '/' . $file['name'], '/');
|
||||||
} else {
|
|
||||||
$tags = $tagger->getTagsForObjects(array((int)$file['fileid']));
|
|
||||||
if (!empty($tags) && in_array($tag, current($tags))) {
|
|
||||||
$result[] = $file;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,6 @@ use OCA\Files_sharing\Tests\TestCase;
|
||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class Test_Files_Sharing_Cache extends TestCase {
|
class Test_Files_Sharing_Cache extends TestCase {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -238,6 +237,62 @@ class Test_Files_Sharing_Cache extends TestCase {
|
||||||
$tagManager->delete(array('tag1', 'tag2'));
|
$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() {
|
function testGetFolderContentsInRoot() {
|
||||||
$results = $this->user2View->getDirectoryContent('/');
|
$results = $this->user2View->getDirectoryContent('/');
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue