diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2016-02-23 15:02:08 +0100 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2016-02-23 15:02:08 +0100 |
commit | 9a0950f10bdef7a0bf3827d0fa3735ac57ccd797 (patch) | |
tree | d36344447029b3732e243d2a4ef2827e3c78dd15 /lib | |
parent | fae6643e6dd4bc308170e0ab45886f110f60a639 (diff) | |
parent | 3a65bdf4d59fe06919a064e3044cccc27aab5201 (diff) | |
download | nextcloud-server-9a0950f10bdef7a0bf3827d0fa3735ac57ccd797.tar.gz nextcloud-server-9a0950f10bdef7a0bf3827d0fa3735ac57ccd797.zip |
Merge pull request #22569 from owncloud/issue-22566-too-much-mapping-entries
Allow defining a limit and offset for getObjectIdsForTags
Diffstat (limited to 'lib')
-rw-r--r-- | lib/private/systemtag/systemtagobjectmapper.php | 21 | ||||
-rw-r--r-- | lib/public/systemtag/isystemtagobjectmapper.php | 6 |
2 files changed, 21 insertions, 6 deletions
diff --git a/lib/private/systemtag/systemtagobjectmapper.php b/lib/private/systemtag/systemtagobjectmapper.php index 1efb4f0f6e0..f70541920a4 100644 --- a/lib/private/systemtag/systemtagobjectmapper.php +++ b/lib/private/systemtag/systemtagobjectmapper.php @@ -95,7 +95,7 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper { /** * {@inheritdoc} */ - public function getObjectIdsForTags($tagIds, $objectType) { + public function getObjectIdsForTags($tagIds, $objectType, $limit = 0, $offset = '') { if (!is_array($tagIds)) { $tagIds = [$tagIds]; } @@ -105,10 +105,21 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper { $query = $this->connection->getQueryBuilder(); $query->select($query->createFunction('DISTINCT(`objectid`)')) ->from(self::RELATION_TABLE) - ->where($query->expr()->in('systemtagid', $query->createParameter('tagids'))) - ->andWhere($query->expr()->eq('objecttype', $query->createParameter('objecttype'))) - ->setParameter('tagids', $tagIds, IQueryBuilder::PARAM_INT_ARRAY) - ->setParameter('objecttype', $objectType); + ->where($query->expr()->in('systemtagid', $query->createNamedParameter($tagIds, IQueryBuilder::PARAM_INT_ARRAY))) + ->andWhere($query->expr()->eq('objecttype', $query->createNamedParameter($objectType))); + + if ($limit) { + if (sizeof($tagIds) !== 1) { + throw new \InvalidArgumentException('Limit is only allowed with a single tag'); + } + + $query->setMaxResults($limit) + ->orderBy('objectid', 'ASC'); + + if ($offset !== '') { + $query->andWhere($query->expr()->gt('objectid', $query->createNamedParameter($offset))); + } + } $objectIds = []; diff --git a/lib/public/systemtag/isystemtagobjectmapper.php b/lib/public/systemtag/isystemtagobjectmapper.php index 8db5cdd31aa..59b988a3656 100644 --- a/lib/public/systemtag/isystemtagobjectmapper.php +++ b/lib/public/systemtag/isystemtagobjectmapper.php @@ -57,15 +57,19 @@ interface ISystemTagObjectMapper { * * @param string|array $tagIds Tag id or array of tag ids. * @param string $objectType object type + * @param int $limit Count of object ids you want to get + * @param string $offset The last object id you already received * * @return string[] array of object ids or empty array if none found * * @throws \OCP\SystemTag\TagNotFoundException if at least one of the * given tags does not exist + * @throws \InvalidArgumentException When a limit is specified together with + * multiple tag ids * * @since 9.0.0 */ - public function getObjectIdsForTags($tagIds, $objectType); + public function getObjectIdsForTags($tagIds, $objectType, $limit = 0, $offset = ''); /** * Assign the given tags to the given object. |