<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.apple-converted-space
        {mso-style-name:apple-converted-space;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        mso-ligatures:none;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:916474897;
        mso-list-template-ids:-899124166;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:1.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:1.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:2.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:2.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:3.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:3.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:4.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:4.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1
        {mso-list-id:1954555654;
        mso-list-template-ids:-1784010138;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style>
</head>
<body lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word;overflow-wrap: break-word;-webkit-nbsp-mode: space;line-break:after-white-space">
<div class="WordSection1">
<p class="MsoNormal">Hi Paul,<br>
<br>
Thanks for the clarification.<br>
<br>
I assume then that LAST is intended to be analogous to LIMIT/TOP, that it is applied after all earlier constraints?
<br>
That also clears up the similar issue with AFTER. I cannot readily think of a situation where its evaluation would conflict with PHASE at all.<br>
<br>
I think a simple clarification to the above effect would suffice. Informally posing the problem to some Institute colleagues, I heard similar interpretations as mine and some grumblings about “rules do not commute” and “requiring operation precedence”…
<span style="font-family:"Apple Color Emoji"">😊</span><br>
<br>
Thanks,<br>
Joshua<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:12.0pt;color:black">From: </span></b><span style="font-size:12.0pt;color:black">Paul Harrison <paul.harrison@manchester.ac.uk><br>
<b>Date: </b>Thursday, June 27, 2024 at 3:27 AM<br>
<b>To: </b>Joshua Fraustro <jfraustro@stsci.edu><br>
<b>Cc: </b>GWS IVOA <grid@ivoa.net><br>
<b>Subject: </b>Re: Filtering the UWS JobList by Phase and Last<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal">Hi,<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">you are right that it does need some clarification, although as you note most implementations make the intended interpretation that the LAST filter is applied last, which is the crucial point, as without that neither “logical AND” nor “intersection
 or sets” alone will produce the intended interpretation.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Paul.<o:p></o:p></p>
<div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal">On 26 Jun 2024, at 23:04, Joshua Fraustro via grid <grid@ivoa.net> wrote:<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">For services that implement the UWS pattern, the job list returned at the root /{jobs} path may be filtered using three parameters:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<ul style="margin-top:0in" type="disc">
<li class="MsoListParagraph" style="margin-top:0in;margin-bottom:0in;mso-list:l0 level1 lfo1">
PHASE: return only jobs with the supplied ExecutionPhase<o:p></o:p></li><li class="MsoListParagraph" style="margin-top:0in;margin-bottom:0in;mso-list:l0 level1 lfo1">
AFTER: return jobs with a creationTime after the supplied datetime<o:p></o:p></li><li class="MsoListParagraph" style="margin-top:0in;margin-bottom:0in;mso-list:l0 level1 lfo1">
LAST: return the last N jobs, ordered by creationTime, descending<o:p></o:p></li></ul>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">As described by the UWS document, under<span class="apple-converted-space"> </span><a href="https://urldefense.com/v3/__https:/www.ivoa.net/documents/UWS/20161024/REC-UWS-1.1-20161024.html*jobList__;Iw!!PDiH4ENfjr2_Jw!E1iP25arWzG2_X0Da9_n1-y8s8hZHgUt-UKH3YbG33aySrH4LqMD1fe1lOhMl0EstrJ1tinTyjxbG_odNPCm$"><span style="color:#0563C1">2.2.2.1
 Job List [ivoa.net]</span></a>, “If multiple filters are specified by the client, then the server should return a jobs list which is the result of a logical AND of the various filter conditions”.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Consider the following basic job list of only execution phase. Assume it has been appropriately presorted by creationTime.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div style="margin-left:.5in">
<p class="MsoNormal">job5: phase=PENDING # newest<o:p></o:p></p>
</div>
<div style="margin-left:.5in">
<p class="MsoNormal">job4: phase=COMPLETED<o:p></o:p></p>
</div>
<div style="margin-left:.5in">
<p class="MsoNormal">job3: phase=PENDING<o:p></o:p></p>
</div>
<div style="margin-left:.5in">
<p class="MsoNormal">job2: phase=COMPLETED<o:p></o:p></p>
</div>
<div style="margin-left:.5in">
<p class="MsoNormal">job1: phase=COMPLETED # oldest<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">A client provides the following filters in his query:<span class="apple-converted-space"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="text-indent:.5in"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="text-indent:.5in">/{jobs}?PHASE=COMPLETED&LAST=2<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><br>
If the service performs these iteratively, which I think a programmer’s gut reaction would be, the orders could be:<o:p></o:p></p>
</div>
<ol style="margin-top:0in" start="1" type="1">
<li class="MsoListParagraph" style="margin-top:0in;margin-bottom:0in;mso-list:l1 level1 lfo2">
Filter by PHASE, then by LAST, the result would be<span class="apple-converted-space"> </span><b>[job4, job2]</b>.<span class="apple-converted-space"> </span><o:p></o:p></li><li class="MsoListParagraph" style="margin-top:0in;margin-bottom:0in;mso-list:l1 level1 lfo2">
If the service evaluates by LAST, then by PHASE, the result would be<span class="apple-converted-space"> </span><b>[job4]</b>.<o:p></o:p></li></ol>
<div>
<p class="MsoNormal"><br>
I know at MAST we use order 1, and doing some quick checking it appears that Vizier and GAVO do as well.<br>
<br>
What I assume is meant by “logical AND” however, is closer to, “the intersection of the sets whose members are the results of the various filter conditions.” In which case the answer becomes:<br>
<br>
<br>
<o:p></o:p></p>
</div>
<div style="margin-left:.5in">
<p class="MsoNormal">?PHASE=COMPLETED<br>
[job4, job2, job1]<o:p></o:p></p>
</div>
<div style="margin-left:.5in">
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div style="margin-left:.5in">
<p class="MsoNormal">AND<o:p></o:p></p>
</div>
<div style="margin-left:.5in">
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div style="margin-left:.5in">
<p class="MsoNormal">?LAST=2<br>
[job5, job4]<br>
<br>
==<br>
<br>
[job4]<br>
<br>
<br>
<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Is this the intended meaning? If it is, we should probably clarify the language as such, as that would be the ‘<i>most correct</i>’ interpretation of “logical AND”. If not, we would need to decide what the prescribed evaluation order is.<o:p></o:p></p>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</body>
</html>