diff --git a/lib/private/tags.php b/lib/private/tags.php index bab3d49528..e00c1b90ca 100644 --- a/lib/private/tags.php +++ b/lib/private/tags.php @@ -199,6 +199,48 @@ class Tags implements \OCP\ITags { ); } + /** + * Get the list of tags for the given ids. + * + * @param array $objIds array of object ids + * @return array|boolean of tags id as key to array of tag names + * or false if an error occurred + */ + public function getTagsForObjects(array $objIds) { + $entries = array(); + + try { + $conn = \OC_DB::getConnection(); + $chunks = array_chunk($objIds, 1000, false); + foreach ($chunks as $chunk) { + $result = $conn->executeQuery( + 'SELECT `category`, `categoryid`, `objid` ' . + 'FROM `' . self::RELATION_TABLE . '` r, `' . self::TAG_TABLE . '` ' . + 'WHERE `categoryid` = `id` AND `uid` = ? AND r.`type` = ? AND `objid` IN (?)', + array($this->user, $this->type, $chunk), + array(null, null, \Doctrine\DBAL\Connection::PARAM_INT_ARRAY) + ); + while ($row = $result->fetch()) { + $objId = (int)$row['objid']; + if (!isset($entries[$objId])) { + $entry = $entries[$objId] = array(); + } + $entry = $entries[$objId][] = $row['category']; + } + } + if (\OCP\DB::isError($result)) { + \OCP\Util::writeLog('core', __METHOD__. 'DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR); + return false; + } + } catch(\Exception $e) { + \OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), + \OCP\Util::ERROR); + return false; + } + + return $entries; + } + /** * Get the a list if items tagged with $tag. * diff --git a/lib/public/itags.php b/lib/public/itags.php index 4514746bbe..238b12c642 100644 --- a/lib/public/itags.php +++ b/lib/public/itags.php @@ -76,7 +76,23 @@ interface ITags { public function getTags(); /** - * Get the a list if items tagged with $tag. + * Get a list of tags for the given item ids. + * + * This returns an array with object id / tag names: + * [ + * 1 => array('First tag', 'Second tag'), + * 2 => array('Second tag'), + * 3 => array('Second tag', 'Third tag'), + * ] + * + * @param array $objIds item ids + * @return array|boolean with object id as key and an array + * of tag names as value or false if an error occurred + */ + public function getTagsForObjects(array $objIds); + + /** + * Get a list of items tagged with $tag. * * Throws an exception if the tag could not be found. * diff --git a/tests/lib/tags.php b/tests/lib/tags.php index 533e6a19ad..78f5085df3 100644 --- a/tests/lib/tags.php +++ b/tests/lib/tags.php @@ -136,6 +136,36 @@ class Test_Tags extends \Test\TestCase { $this->assertFalse($tagger->isEmpty()); } + public function testGetTagsForObjects() { + $defaultTags = array('Friends', 'Family', 'Work', 'Other'); + $tagger = $this->tagMgr->load($this->objectType, $defaultTags); + + $tagger->tagAs(1, 'Friends'); + $tagger->tagAs(1, 'Other'); + $tagger->tagAs(2, 'Family'); + + $tags = $tagger->getTagsForObjects(array(1)); + $this->assertEquals(1, count($tags)); + $tags = current($tags); + sort($tags); + $this->assertSame(array('Friends', 'Other'), $tags); + + $tags = $tagger->getTagsForObjects(array(1, 2)); + $this->assertEquals(2, count($tags)); + $tags1 = $tags[1]; + sort($tags1); + $this->assertSame(array('Friends', 'Other'), $tags1); + $this->assertSame(array('Family'), $tags[2]); + $this->assertEquals( + array(), + $tagger->getTagsForObjects(array(4)) + ); + $this->assertEquals( + array(), + $tagger->getTagsForObjects(array(4, 5)) + ); + } + public function testdeleteTags() { $defaultTags = array('Friends', 'Family', 'Work', 'Other'); $tagger = $this->tagMgr->load($this->objectType, $defaultTags);