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