<div dir="ltr"><div><div><div>TL;DR - yes, implemented async SODA explicitly to support multiplicity and multiple results<br><br></div><div>Long version: I am working on  a SODA prototype right now and I have implemented the async mode which computes cutouts for the product of all input ID, POS, BAND, TIME params (POL is multi-valued but a  single set of states). <br><br></div>For example, if you pass in one ID and 3 POS values you get 3 cutout results (well, see below). If you pass in an ID, 3 POS values, and 2 BAND values you get as many as 6 results. A &quot;result&quot; is simply a url stored in the results section of the UWS job. In our case I don&#39;t actually move any bytes or operate on files until the caller uses one of the URLs, but that is an implementation detail.<br><br></div>The motivation for the async functionality is that with the more common use of &quot;object store&quot; systems we may be moving to an era where we can&#39;t run astronomy software where the data is stored and we have random access to it... we may have to move the file(s) someplace else and then operate on them, in which case async with multiplicity can be much more efficient. Right now, we do have CANFAR users that use our data access services from processing and they will do the extra work to use &quot;bulk operations&quot; such as async SODA because it is easier for them to manage and it is more efficient than the 100s or 1000s of requests per job they would otherwise do.<br><br>note: The multiplicity in DataLInk is also there strictly as an efficiency mechanism. You can enforce MAXREC=1 and indicate with an OVERFLOW if you don&#39;t want to do it. But with SODA if you don&#39;t want to support multiplicity just don&#39;t provide an async endpoint.<br><br></div><div>Pat<br></div><div><br></div><div>And now the &quot;see below&quot;: well, UWS doesn&#39;t provide much in the way of support for jobs that produce multiple results and partial success in doing so (aka no support at all). If input params are invalid I just make the whole job fail, but i have no way to report that:<br><br>- some combinations of ID and &quot;bounds&quot; do not intersect the target data<br>- I failed for some (transient) internal reason<br></div><div>- I can&#39;t provide some results because of authentication/authorization requirements<br><br></div><div>In sync you have suitable HTTP status codes for all of these.<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Feb 9, 2016 at 5:33 AM, Markus Demleitner <span dir="ltr">&lt;<a href="mailto:msdemlei@ari.uni-heidelberg.de" target="_blank">msdemlei@ari.uni-heidelberg.de</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Dear DAL folks,<br>
<br>
While I&#39;d still appreciate comments regarding the proposed<br>
explanatory chapter -- see Gripe (3),<br>
<a href="http://mail.ivoa.net/pipermail/dal/2016-January/007281.html" rel="noreferrer" target="_blank">http://mail.ivoa.net/pipermail/dal/2016-January/007281.html</a> --<br>
(and I still suspect it&#39;s useful to skim over that stuff to<br>
understand what&#39;s being discussed here all the time), here&#39;s my next<br>
gripe (it&#39;s not so much time until Cape Town any more).<br>
<br>
There&#39;s a TL;DR below.<br>
<br>
This is about mandating parameter multiplicities.  In case you were<br>
wondering, this means text like this:<br>
<br>
  In general, filtering parameters are single-valued in \{sync\}<br>
  requests and multi-valued in \{async\} requests (exceptions noted<br>
  below). When multiple values of filtering parameters are used in an<br>
  \{async\} job, each combination of values produces zero or one<br>
  result.<br>
<br>
and then, nevertheless, for every parameter, stuff like:<br>
<br>
  The POS parameter is single-valued for \{sync\} requests and<br>
  multi-valued for \{async\} jobs.<br>
<br>
I propose to strike all such language.  In a section on general rules<br>
for parameters, there could be text like:<br>
<br>
  This specification does not constrain the behaviour of services in<br>
  the presence of repeated parameters.  For enumerated parameters<br>
  (i.e., those with \xmlel{OPTIONS} in \xmlel{VALUES}), clients should<br>
  display widgets allowing the selection of zero or more of the<br>
  options available.  Services must therefore not fail when receiving<br>
  multiple values even for single-valued enumerated parameters and<br>
  discard all but one of the parameters passed.<br>
<br>
Yes, it&#39;s suboptimal (but see below), but I think we can&#39;t really do<br>
better at this point.<br>
<br>
<br>
Rationale:<br>
<br>
Whether or not it makes sense for a service to accept repeated<br>
parameters (i.e., stuff like OBJECT=alp%20Cyg&amp;OBJECT=bet%20Cyg) is<br>
highly dependent on the service and on the nature of the parameter.<br>
If we try to mandate behaviour in the standards text, we&#39;ll only<br>
generate lots of non-compliant services.<br>
<br>
Also, the implementation effort typically increases fairly<br>
significantly when handling sequences (for my datalink<br>
implementation, it was about 1.5 when allowing multiple values of ID<br>
in; in the datalink XSLT client, dealing with the results of multi-ID<br>
queries is still unsolved; the multiple-ID rule in Datalink precludes<br>
using pre-generated files to serve responses[1]).<br>
<br>
So, we should have a very good idea why we want this, and I don&#39;t<br>
think we have that.  Indeed, given the wide range of SODA<br>
applications (whether already operational, or specified, or<br>
envisaged), I think we cannot.<br>
<br>
As the existing language (see above) on what to do in the presence of<br>
multiple multiple values -- e.g.,<br>
<br>
  POS=CIRCLE 1 3 3&amp;BAND=3e-7 4e-7&amp;POS=CIRCLE 4 5 3&amp;BAND=1e-7 2e-7<br>
<br>
-- shows, not even the semantics are straightforward (guess what this<br>
does, then try to figure out what really should happen according to<br>
the standard (I don&#39;t believe there&#39;s a service doing this right now,<br>
though)).  In that respect, I think *if* we really want &quot;batch<br>
processing&quot; in SODA, we should go for a much more straightforward<br>
way: upload a VOTable with one set of parameters per line.  No<br>
combinatorial explosion, minimal specification effort.<br>
<br>
But I doubt all this is even very useful as specified now -- the<br>
plan, if I understand correctly, is that the results of such batch<br>
operations would appear as separate results in a UWS document (this<br>
would need much more explanation if we really go there).  That,<br>
however, means that there&#39;s still one request per processed document,<br>
so the actual savings in overhead or whatever are probably fairly<br>
small.<br>
<br>
So: It&#39;s not evidently useful, certainly not necessary to cover the<br>
CSP requirements, I don&#39;t think anyone has implemented it, it&#39;s hard<br>
for the clients.  Let&#39;s simply not say anything (except the very<br>
general language proposed above) without serious prototyping.[2]<br>
<br>
<br>
<br>
However (additional proposal):<br>
<br>
While I think mandatory multiplicities are a pain that will lead to<br>
massive non-interoperability if it were ever taken up, I think it&#39;d<br>
be really useful if services announced which of their parameters can<br>
actually be repeated.  That&#39;s important for clients to really produce<br>
widgets properly guiding the user (e.g., only allowing one selection<br>
for FORMAT but allowing multiple selections for OBJECT).  This could<br>
also be a basis to allow multi-cutouts where they can usefully be<br>
implemented (perhaps turning a long spectrum into a short SED, or<br>
something producing an archive of little things).<br>
<br>
In an ideal world, we&#39;d have PDL with sufficient capabilities<br>
formulated in VO-DML ready now.  That would be enough to have an<br>
expressive and (for machines) easily interpretable annotation and<br>
would solve several other problems with annotating parameter sets<br>
(e.g., &quot;if you give a range for PIXEL_3, you cannot give a range for<br>
LAMBDA&quot;).<br>
<br>
With a bleeding heart I&#39;ll concede that&#39;s something we&#39;ll have to<br>
postpone to version 1.1.<br>
<br>
While I&#39;m sure a proper parameter DM is where we need to go, even now<br>
we could, as a stopgap measure for this relatively important use<br>
case, prescribe some ad-hoc annotation for repeatable params.<br>
Looking at the VOTable spec, I&#39;d say there are four relatively<br>
non-destrucive ways we could do this:<br>
<br>
(1) hog the utype attribute of the param<br>
  &lt;PARAM name=&quot;OBJECT&quot; ... utype=&quot;temporary:repeatable&quot;/&gt;<br>
  (this would be my favourite; I don&#39;t think PARAM/@utype will be<br>
  used for anything else in future versions of SODA; even when VO-DML<br>
  still used @utype, &quot;legacy&quot; utype attributes were left alone)<br>
<br>
(2) use an immediate group:<br>
<br>
  &lt;PARAM...&gt;<br>
  &lt;PARAM...&gt;<br>
  &lt;PARAM...&gt;<br>
  &lt;GROUP utype=&quot;temporary:repeatable&quot;&gt;<br>
    &lt;PARAM...&gt;<br>
    &lt;PARAM...&gt;<br>
 &lt;/GROUP&gt;<br>
<br>
 (that&#39;s a bit of a pain for the service)<br>
<br>
(3) use group referencing:<br>
<br>
  &lt;GROUP utype=&quot;temporary:repeatable&quot;&gt;<br>
    &lt;PARAMref ref=&quot;a&quot;/&gt;<br>
    &lt;PARAMref ref=&quot;b&quot;/&gt;<br>
  &lt;/GROUP&gt;<br>
  &lt;PARAM...&gt;<br>
  &lt;PARAM id=&quot;a&quot;...&gt;<br>
  &lt;PARAM...&gt;<br>
  &lt;PARAM id=&quot;b&quot;...&gt;<br>
  &lt;PARAM...&gt;<br>
<br>
 (that&#39;s a bit of a pain for the service)<br>
<br>
(4) use LINK<br>
<br>
&lt;PARAM ...&gt;<br>
  &lt;LINK content-role=&quot;adhoc-annotation&quot;<br>
    &gt;ivo://<a href="http://ivoa.net/std/SODA#repeatable-param" rel="noreferrer" target="_blank">ivoa.net/std/SODA#repeatable-param</a>&lt;/LINK&gt;<br>
&lt;/PARAM&gt;<br>
<br>
I&#39;m not terribly smitten with any of this.<br>
<br>
So, my preference remains for someone to fix up VO-DML and PDL for<br>
version 1.1.  When there&#39;s no solution for the multiplicities problem<br>
in 1.0, perhaps there&#39;s more pressure to actually make PDL-in-VO-DML<br>
happen.<br>
<br>
<br>
<br>
TL;DR: Services should have the right to decide on multiplicities<br>
themselves.  It&#39;d be nice if we gave clients some way to figure out a<br>
given service&#39;s decision reliable, but I suspect we&#39;ve been too lazy<br>
these recent years in VO-DML and PDL to make it happen properly for<br>
1.0.<br>
<br>
<br>
Cheers,<br>
<br>
         Markus<br>
<br>
[1] You may guess that I&#39;d much rather get rid of the multiple-ID<br>
thing in datalink services.  That&#39;s true.  I&#39;ll shout as 1.1 comes<br>
around.<br>
<br>
[2] As far as I am concerned, we could simply strike async completely<br>
and be done with it.  I don&#39;t think anyone could implement async<br>
based on what&#39;s in the spec.  But that&#39;s another thing, and I don&#39;t<br>
have it on my agenda right now.  Has anyone really tried async<br>
SODA?  I&#39;d be curious to compare if we came out with the same<br>
choices...<br>
<br>
<br>
PS: Preview on future gripes (sequence TBD):<br>
<br>
() Spatial coverage discovery and the RA and DEC parameters<br>
() Pixel coutouts: PIXEL_n<br>
() Behaviour for no-ID queries?  For queries with only ID?<br>
() POS doesn&#39;t have an xtype<br>
() Examples stuff: example example, and perhaps a dl-id term?<br>
<br>
</blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature"><div dir="ltr"><div><div>Patrick Dowler<br></div>Canadian Astronomy Data Centre<br></div>Victoria, BC, Canada<br></div></div>
</div>