Re: totalItems with pagination and filtering

On 2015-11-14 18:25, Maik Riechert wrote:
> Hi all,
>
> I was thinking about paged collections a bit and have a question
> regarding "totalItems" in combination with filtering a collection.
>
> Imagine /users has 10000 user items. You can filter via /users?name=Bob
> which would match 50 user items. Let's assume I use paged collections
> with 10 items per page. Then the filtered query above would result in 5
> pages from /users?name=Bob&p=1 to /users?name=Bob&p=5. If I understood
> Hydra's collection design right, then a page would roughly look like:
>
> GET /users?name=Bob&p=1
> {
>    "@id": "/users",
>    "@type": "Collection",
>    "member": [ ...10 Bob items... ],
>    "totalItems": 10000,
>    "view": {
>      "@id": "/users?name=Bob&p=1",
>      "@type": "PartialCollectionView",
>      "first": "/users?name=Bob&p=1",
>      "next": "/users?name=Bob&p=2",
>      "last": "/users?name=Bob&p=5"
>    }
> }
>
> 1) Is it correct to have /users as @id instead of /users?name=Bob?
 >

It is an interesting question. I would automatically assume that you are 
browsing a filtered collection and so my choice would be 
/users?name=Bob. However, come think of it, the former does makes sense 
too. Both are identifier of a "real", existing resource after all. Hence 
both choices are correct IMO.

>
> 2) Is it correct that "totalItems" is the total number of items of the
> /users collection, not regarding any filters?
>

Now this would depend on what you choose in 1). If you were to use 
/users?name=Bob as you @id, then 50 would be the totalItems value and 
10000 otherwise. In the end it means "total items of the collection 
identified by @id".

> If both answers are yes: Where does the total number of items for the
> filtered query (50 here) go?

As above, I don't think it goes anywhere when you use "unfiltered" @id.

> Similarly, does /users?name=Bob go anywhere?

I would turn this around. Where does /users when the @id is 
/users?name=Bob? How about sth like that

GET /users?name=Bob&p=1
{
    "@id": "/users?name=Bob",
    "partOf": "/users"
    "@type": "Collection",
    "member": [ ...10 Bob items... ],
    "totalItems": 50,
    "view": { .. the page links ... }
}

My idea would be to always use the parametrized @id (so that you can 
bookmark it) and add a link to the unfiltered collection, here "partOf" 
as an example.

Received on Saturday, 14 November 2015 18:04:35 UTC