- From: Steve Speicher <sspeiche@gmail.com>
- Date: Wed, 19 Feb 2014 14:15:59 -0500
- To: Sandro Hawke <sandro@w3.org>
- Cc: Linked Data Platform WG <public-ldp-wg@w3.org>
- Message-ID: <CAOUJ7JrjoHcx3dp1XFm+_g8iW4AerM9qwm_o1A7wYyf9kAW+6g@mail.gmail.com>
On Wed, Feb 19, 2014 at 12:12 PM, Sandro Hawke <sandro@w3.org> wrote: > Here's an implementation technique servers can use to do lossless paging > very cheaply (give or take whatever the underlying paging technology is). > > In the NEXT and PREV links, include the boundary value. That way the > server doesn't need to remember anything; the state is all in the URL. > HATEOAS to the rescue. (I'm sure I'm not the first to think of this....) > We've used this model for some time, encoding the boundaries into the URLs of the pages themselves. Usually based on some time-based property of the resources, such as when it was created, though others have used other properties from the data that the servers assign to the resources. - Steve Speicher > As an example for a directory with these names (people at the last > meeting), in alphabetic order: > > Arnaud Le Hors > Ashok Malhotra > Cody Burleson > Eric Prud'hommeaux > Henry Story > John Arwe > Miguel Aragón > Nandana Mihindukulasooriya > Roger Menday > Sandro Hawke > Steve Speicher > > The container offers these headers: > > Link: <.../my_container?page_first> rel=FIRST > Link: <.../my_container?page_last> rel=LAST > > If you GET that rel=FIRST one, you'll get this: > > Link: <.../my_container?page_after=Henry%20Story> rel=NEXT > > member & container triples for Arnaud Le Hors > member & container triples for Ashok Malhotra > member & container triples for Cody Burleson > member & container triples for Eric Prud'hommeaux > member & container triples for Henry Story > > If you GET that rel=NEXT one, you'll get this: > > Link: <.../my_container?page_after=Sandro%20Hawke> rel=NEXT > Link: <.../my_container?page_before=John%20Arwe> rel=PREV > > member & container triples for John Arwe > member & container triples for Miguel Aragón > member & container triples for Nandana Mihindukulasooriya > member & container triples for Roger Menday > member & container triples for Sandro Hawke > > If you GET that rel=NEXT one, you'll get this: > > Link: <.../my_container?page_before=Steve%20Speicher> rel=PREV > > member & container triples for Steve Speicher > > Meanwhile, if you decided to traverse backwards from the container's > rel=LAST one, you'd get this: > > Link: <.../my_container?page_before=Miguel%20Arag%C3%B3n> rel=PREV > > member & container triples for Miguel Aragón > member & container triples for Nandana Mihindukulasooriya > member & container triples for Roger Menday > member & container triples for Sandro Hawke > member & container triples for Steve Speicher > > If you GET that rel=PREV one, you'd get: > > Link: <.../my_container?page_after=John%20Arwe> rel=NEXT > Link: <.../my_container?page_before=Ashok%20Malhotra> rel=PREV > > member & container triples for Ashok Malhotra > member & container triples for Cody Burleson > member & container triples for Eric Prud'hommeaux > member & container triples for Henry Story > member & container triples for John Arwe > > If you GET that rel=PREV one, you'd get: > > Link: <.../my_container?page_after=Arnaud%20Le%20Hors> rel=NEXT > > member & container triples for Arnaud Le Hors > > See? No state on the server, and lossless paging, with fully controlled > page size. Servers which are already saving paging state for some reason > can do it some other way. > > A few details: > > The value in the page_after and page_before fields would be the value of > the sort field, whatever it is. > > If the composite of the sort fields is not guaranteed to be unique, or > there is no sort field, the server should add another sort field, some kind > of internal rowid, to make it unique. > > If there are multiple sort fields, the server could mush them together, or > use multiple page_before/page_after parameters in the URL. > > If the data is particularly sensitive, the server might want to encrypt > the fields. > > As an middle-ground solution, with a little state, the server could hide > the values and make the URLs a lot shorter by maintaining a cache of > boundary values, like > { "bv1": "Henry Story", > "bv2": "John Arwe", > ... } > > then instead of > Link: <.../my_container?page_after=Henry%20Story> rel=NEXT > it would do > Link: <.../my_container?page_after_code=bv1> rel=NEXT > > In this case, the client would need to be prepared for 410 GONE in case > the bv1 value had expired. > > -- Sandro > > >
Received on Wednesday, 19 February 2014 19:16:27 UTC