<div dir="ltr"><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">The clients (a browser storage UI and &quot;vls&quot; command line) always get all pages :-)</div><div class="gmail_default" style="font-size:small">The pagination mechanism allowed us to constrain server resources used (to a single page result set from query) because our current vospace server library doesn&#39;t stream the result... I&#39;d prefer streaming the result but it will take some work to refactor parts of the server side code to do it. <br></div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">Also, if the client side uses DOM-based xml parsing they likely prefer pages (modest sized documents) to huge xml payloads even if they intend to list everything... yeah, they could have built on an event-based xml parser instead for scalability, but that&#39;s also a tough retrofit if you used a DOM library.<br></div><div class="gmail_default" style="font-size:small"><br clear="all"></div><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div>--<br></div><div>Patrick Dowler<br></div>Canadian Astronomy Data Centre<br></div>Victoria, BC, Canada<br></div></div></div></div></div><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 22 Jun 2021 at 11:39, Dave Morris &lt;<a href="mailto:dave.morris@metagrid.co.uk">dave.morris@metagrid.co.uk</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">In your implementation, do you know how many clients request the second <br>
or third page ?<br>
<br>
I suspect many clients will ask for the first page, using limit, but few <br>
will actually ask for the subsequent pages.<br>
<br>
Interesting to know how many.<br>
<br>
-- Dave<br>
<br>
On 2021-06-22 19:08, Patrick Dowler wrote:<br>
&gt; yeah, clients always need to make that extra call and it does seem a <br>
&gt; little<br>
&gt; clunky... that&#39;s the same pattern (and necessity) in several object <br>
&gt; store<br>
&gt; APIs I have been working with so vospace isn&#39;t alone here.<br>
&gt; <br>
&gt; On the other hand, over in DAL services we put a bit of metadata at the <br>
&gt; end<br>
&gt; of a VOTable (after the rows) to say that the result was truncated <br>
&gt; (DALI<br>
&gt; &quot;overflow&quot;)... so the caller knows whether there are more records they<br>
&gt; didn&#39;t see.<br>
&gt; <br>
&gt; --<br>
&gt; Patrick Dowler<br>
&gt; Canadian Astronomy Data Centre<br>
&gt; Victoria, BC, Canada<br>
&gt; <br>
&gt; <br>
&gt; On Mon, 21 Jun 2021 at 01:57, Zorba, Sonia &lt;<a href="mailto:sonia.zorba@inaf.it" target="_blank">sonia.zorba@inaf.it</a>&gt; wrote:<br>
&gt; <br>
&gt;&gt; Sorry, obviously I missed this too.<br>
&gt;&gt; <br>
&gt;&gt; Maybe also expanding the first example could help.<br>
&gt;&gt; I would add a first call with limit=100 and no uri parameter, to <br>
&gt;&gt; explain<br>
&gt;&gt; that if the response contains 100 child nodes the client knows that it <br>
&gt;&gt; can<br>
&gt;&gt; fetch the next results by setting the last child node URI in the uri<br>
&gt;&gt; parameter of the next call.<br>
&gt;&gt; <br>
&gt;&gt; What I don&#39;t like about this approach is that if there were exactly <br>
&gt;&gt; 100<br>
&gt;&gt; child nodes the next call would return a single result, so it could be<br>
&gt;&gt; avoided. It would be nice to have a &quot;total count&quot; parameter in the<br>
&gt;&gt; response, to know the exact number of remaining pages, but I don&#39;t <br>
&gt;&gt; know if<br>
&gt;&gt; this complicates too much the current implementations.<br>
&gt;&gt; <br>
&gt;&gt; Cheers,<br>
&gt;&gt; Sonia<br>
&gt;&gt; <br>
&gt;&gt; <br>
&gt;&gt; Il giorno dom 20 giu 2021 alle ore 05:30 Dave Morris &lt;<br>
&gt;&gt; <a href="mailto:dave.morris@metagrid.co.uk" target="_blank">dave.morris@metagrid.co.uk</a>&gt; ha scritto:<br>
&gt;&gt; <br>
&gt;&gt;&gt; Apologies, I forgot this was in the specification.<br>
&gt;&gt;&gt; The text describing how this works is buried in the Response section <br>
&gt;&gt;&gt; of<br>
&gt;&gt;&gt; the getNode method, which makes it easy to miss.<br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; As a start, I&#39;ve added an issue to revise the text to make this <br>
&gt;&gt;&gt; clearer.<br>
&gt;&gt;&gt; <a href="https://github.com/ivoa-std/VOSpace/issues/4" rel="noreferrer" target="_blank">https://github.com/ivoa-std/VOSpace/issues/4</a><br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; This wouldn&#39;t change the technical definition, just promote the<br>
&gt;&gt;&gt; description of how pagination works into a separate sub-section <br>
&gt;&gt;&gt; clearly<br>
&gt;&gt;&gt; labelled &#39;pagination&#39;.<br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; If we want to take it further, possibly by adding the exception that <br>
&gt;&gt;&gt; Pat<br>
&gt;&gt;&gt; proposes below, then that would be a new issue.<br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; -- Dave<br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; On 2021-06-18 22:00, Patrick Dowler wrote:<br>
&gt;&gt;&gt; &gt; The current spec does support pagination when listing child nodes of a<br>
&gt;&gt;&gt; &gt; container (*uri* and *limit* params), but implementation is complex. We<br>
&gt;&gt;&gt; &gt; have two VOSpace implementations that illustrate quite well.<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; Impl 1: relational database + object store<br>
&gt;&gt;&gt; &gt; Here, it is easy enough to implement pagination because it is just a<br>
&gt;&gt;&gt; &gt; couple<br>
&gt;&gt;&gt; &gt; extra things injected into the SQL query to the DB. The server picks<br>
&gt;&gt;&gt; &gt; the<br>
&gt;&gt;&gt; &gt; default order, but we also added support for a custom optional param so<br>
&gt;&gt;&gt; &gt; the<br>
&gt;&gt;&gt; &gt; client could control the order: name, lastModified date, or<br>
&gt;&gt;&gt; &gt; contentLength.<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; Impl 2: only a posix file system<br>
&gt;&gt;&gt; &gt; Here, it is really hard to implement pagination because the posix<br>
&gt;&gt;&gt; &gt; directory<br>
&gt;&gt;&gt; &gt; listing APIs don&#39;t have any concept of order (iirc, I determined it<br>
&gt;&gt;&gt; &gt; lists<br>
&gt;&gt;&gt; &gt; in inode order so you could get some strangeness if an inode is re-used<br>
&gt;&gt;&gt; &gt; --<br>
&gt;&gt;&gt; &gt; rename? -- during listing). It also looks more or less impossible to<br>
&gt;&gt;&gt; &gt; scale<br>
&gt;&gt;&gt; &gt; paginated listing with many children: with each request, you have to<br>
&gt;&gt;&gt; &gt; start<br>
&gt;&gt;&gt; &gt; at the beginning of the list and skip over previously seen entries so<br>
&gt;&gt;&gt; &gt; it<br>
&gt;&gt;&gt; &gt; gets slower and slower with each &quot;page&quot; of children. This service<br>
&gt;&gt;&gt; &gt; cannot<br>
&gt;&gt;&gt; &gt; support the custom sorting on the server side either.<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; So, I would also like to improve the spec here but would like to see<br>
&gt;&gt;&gt; &gt; something where a service that cannot support pagination (just stream<br>
&gt;&gt;&gt; &gt; output) can be effectively used: clients will need to be able to figure<br>
&gt;&gt;&gt; &gt; out<br>
&gt;&gt;&gt; &gt; which to expect or at least if they got all the rows or not. That<br>
&gt;&gt;&gt; &gt; really<br>
&gt;&gt;&gt; &gt; means support for the *uri* parameter would be optional and maybe just<br>
&gt;&gt;&gt; &gt; responding with an error with a specified &quot;fault&quot; term would suffice.<br>
&gt;&gt;&gt; &gt; The<br>
&gt;&gt;&gt; &gt; *limit* param is easy enough to implement (like MAXREC in DAL<br>
&gt;&gt;&gt; &gt; standards) in<br>
&gt;&gt;&gt; &gt; both cases.<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; --<br>
&gt;&gt;&gt; &gt; Patrick Dowler<br>
&gt;&gt;&gt; &gt; Canadian Astronomy Data Centre<br>
&gt;&gt;&gt; &gt; Victoria, BC, Canada<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; On Wed, 16 Jun 2021 at 22:31, Dave Morris &lt;<a href="mailto:dave.morris@metagrid.co.uk" target="_blank">dave.morris@metagrid.co.uk</a>&gt;<br>
&gt;&gt;&gt; &gt; wrote:<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt;&gt; Hi Sonia,<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; You raised several good suggestions in your email. To avoid confusion<br>
&gt;&gt;&gt; &gt;&gt; I&#39;ll reply to each one in a separate email thread.<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; On 2021-06-11 13:31, Zorba, Sonia wrote:<br>
&gt;&gt;&gt; &gt;&gt; &gt; 7. On the getNode endpoint add parameters to perform paginated<br>
&gt;&gt;&gt; &gt;&gt; &gt; requests.<br>
&gt;&gt;&gt; &gt;&gt; &gt; Useful for nodes having too many children.<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; Paginated response sounds simple, but it turns out to be complicated<br>
&gt;&gt;&gt; &gt;&gt; to<br>
&gt;&gt;&gt; &gt;&gt; implement.<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; We would need to define a design that does not put a heavy load on the<br>
&gt;&gt;&gt; &gt;&gt; server, can reliably handle the insertion or deletion of nodes between<br>
&gt;&gt;&gt; &gt;&gt; requests without producing duplicate rows in the results, and does not<br>
&gt;&gt;&gt; &gt;&gt; require the use of a relational database to implement it.<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; As far as I know, everyone who has looked at this has decided that it<br>
&gt;&gt;&gt; &gt;&gt; is<br>
&gt;&gt;&gt; &gt;&gt; easier to do it on the client side than on the server side. Perhaps<br>
&gt;&gt;&gt; &gt;&gt; someone would like to look at this again and propose a definition for<br>
&gt;&gt;&gt; &gt;&gt; how a paginated response could work?<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; For me, I see pagination as a client side display function rather than<br>
&gt;&gt;&gt; &gt;&gt; a<br>
&gt;&gt;&gt; &gt;&gt; server side data access function. Is there a strong use case for doing<br>
&gt;&gt;&gt; &gt;&gt; this on the server side ?<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; Bear in mind that even if we did define a new property for pagination,<br>
&gt;&gt;&gt; &gt;&gt; existing version 2.1 services would not understand it. So unless we<br>
&gt;&gt;&gt; &gt;&gt; make<br>
&gt;&gt;&gt; &gt;&gt; the new property mandatory, everyone adopts the new standard, and we<br>
&gt;&gt;&gt; &gt;&gt; deprecate the version 2.1 standard, clients would still have to cope<br>
&gt;&gt;&gt; &gt;&gt; with large responses from version 2.1 services.<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; Cheers<br>
&gt;&gt;&gt; &gt;&gt; -- Dave<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; --------<br>
&gt;&gt;&gt; &gt;&gt; Dave Morris<br>
&gt;&gt;&gt; &gt;&gt; Research Software Engineer<br>
&gt;&gt;&gt; &gt;&gt; Wide Field Astronomy Unit<br>
&gt;&gt;&gt; &gt;&gt; Institute for Astronomy<br>
&gt;&gt;&gt; &gt;&gt; University of Edinburgh<br>
&gt;&gt;&gt; &gt;&gt; --------<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; <br>
&gt;&gt; <br>
</blockquote></div>