diff options
author | Sean Molenaar <sean@seanmolenaar.eu> | 2021-02-20 13:57:34 +0100 |
---|---|---|
committer | Benjamin Brahmer <info@b-brahmer.de> | 2021-02-23 17:16:20 +0100 |
commit | bf1e71f1a7b821eb73cd5bc426ee3d97e78f3ec1 (patch) | |
tree | acee8aef4a2a5169c83877f82923bf44dd6ddb17 /lib | |
parent | 4e4108aaf80e2e49b4ca217b56065c49cf7347f4 (diff) |
DB: Use ID as offset in item queries
Signed-off-by: Sean Molenaar <sean@seanmolenaar.eu>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Db/ItemMapperV2.php | 67 |
1 files changed, 44 insertions, 23 deletions
diff --git a/lib/Db/ItemMapperV2.php b/lib/Db/ItemMapperV2.php index 1ef9da244..fe4bbabc0 100644 --- a/lib/Db/ItemMapperV2.php +++ b/lib/Db/ItemMapperV2.php @@ -403,13 +403,13 @@ class ItemMapperV2 extends NewsMapperV2 } /** - * @param string $userId - * @param int $feedId - * @param int $limit - * @param int $offset - * @param bool $hideRead - * @param bool $oldestFirst - * @param array $search + * @param string $userId User identifier + * @param int $feedId Feed identifier + * @param int $limit Max items to retrieve + * @param int $offset First item ID to retrieve + * @param bool $hideRead Hide read items + * @param bool $oldestFirst Chronological sort + * @param array $search Search terms * * @return Item[] */ @@ -424,15 +424,22 @@ class ItemMapperV2 extends NewsMapperV2 ): array { $builder = $this->db->getQueryBuilder(); + if ($oldestFirst === true) { + $offsetWhere = $builder->expr()->lt('items.id', ':offset'); + } else { + $offsetWhere = $builder->expr()->gt('items.id', ':offset'); + } + $builder->select('items.*') ->from($this->tableName, 'items') ->innerJoin('items', FeedMapperV2::TABLE_NAME, 'feeds', 'items.feed_id = feeds.id') ->andWhere('feeds.user_id = :userId') ->andWhere('items.feed_id = :feedId') + ->andWhere($offsetWhere) ->setParameter('userId', $userId) ->setParameter('feedId', $feedId) + ->setParameter('offset', $offset) ->setMaxResults($limit) - ->setFirstResult($offset) ->orderBy('items.last_modified', ($oldestFirst ? 'ASC' : 'DESC')) ->addOrderBy('items.id', ($oldestFirst ? 'ASC' : 'DESC')); @@ -452,13 +459,13 @@ class ItemMapperV2 extends NewsMapperV2 } /** - * @param string $userId - * @param int|null $folderId - * @param int $limit - * @param int $offset - * @param bool $hideRead - * @param bool $oldestFirst - * @param array $search + * @param string $userId User identifier + * @param int|null $folderId Folder identifier (null for root) + * @param int $limit Max items to retrieve + * @param int $offset First item ID to retrieve + * @param bool $hideRead Hide read items + * @param bool $oldestFirst Chronological sort + * @param array $search Search terms * * @return Item[] */ @@ -479,14 +486,21 @@ class ItemMapperV2 extends NewsMapperV2 $folderWhere = $builder->expr()->eq('feeds.folder_id', new Literal($folderId), IQueryBuilder::PARAM_INT); } + if ($oldestFirst === true) { + $offsetWhere = $builder->expr()->lt('items.id', ':offset'); + } else { + $offsetWhere = $builder->expr()->gt('items.id', ':offset'); + } + $builder->select('items.*') ->from($this->tableName, 'items') ->innerJoin('items', FeedMapperV2::TABLE_NAME, 'feeds', 'items.feed_id = feeds.id') ->andWhere('feeds.user_id = :userId') ->andWhere($folderWhere) + ->andWhere($offsetWhere) ->setParameter('userId', $userId) + ->setParameter('offset', $offset) ->setMaxResults($limit) - ->setFirstResult($offset) ->orderBy('items.last_modified', ($oldestFirst ? 'ASC' : 'DESC')) ->addOrderBy('items.id', ($oldestFirst ? 'ASC' : 'DESC')); @@ -506,12 +520,12 @@ class ItemMapperV2 extends NewsMapperV2 } /** - * @param string $userId - * @param int $type - * @param int $limit - * @param int $offset - * @param bool $oldestFirst - * @param array $search + * @param string $userId User identifier + * @param int $type Type of items to retrieve + * @param int $limit Max items to retrieve + * @param int $offset First item ID to retrieve + * @param bool $oldestFirst Chronological sort + * @param array $search Search terms * * @return Item[] * @throws ServiceValidationException @@ -526,13 +540,20 @@ class ItemMapperV2 extends NewsMapperV2 ): array { $builder = $this->db->getQueryBuilder(); + if ($oldestFirst === true) { + $offsetWhere = $builder->expr()->lt('items.id', ':offset'); + } else { + $offsetWhere = $builder->expr()->gt('items.id', ':offset'); + } + $builder->select('items.*') ->from($this->tableName, 'items') ->innerJoin('items', FeedMapperV2::TABLE_NAME, 'feeds', 'items.feed_id = feeds.id') ->andWhere('feeds.user_id = :userId') + ->andWhere($offsetWhere) ->setParameter('userId', $userId) + ->setParameter('offset', $offset) ->setMaxResults($limit) - ->setFirstResult($offset) ->orderBy('items.last_modified', ($oldestFirst ? 'ASC' : 'DESC')) ->addOrderBy('items.id', ($oldestFirst ? 'ASC' : 'DESC')); |