- From: Sandro Hawke <sandro@w3.org>
- Date: Wed, 19 Feb 2014 12:12:50 -0500
- To: Linked Data Platform WG <public-ldp-wg@w3.org>
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....) 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 17:12:57 UTC