- From: Michael Rys <mrys@microsoft.com>
- Date: Sat, 26 Jun 2004 23:50:42 -0700
- To: "Michael Kay" <mhk@mhk.me.uk>, "Houman Khorasani" <khorasani@web.de>, <www-ql@w3.org>
Actually, a let should only be evaluated once if it contains a node construction. Otherwise it depends on the query processor/optimizer. Best regards Michael > -----Original Message----- > From: www-ql-request@w3.org [mailto:www-ql-request@w3.org] On Behalf Of > Michael Kay > Sent: Saturday, June 26, 2004 9:43 AM > To: 'Houman Khorasani'; www-ql@w3.org > Subject: RE: Question about Let clause > > > > > > After the main return, the parser jumps back to beginning to > > get into the > > next for clauses and so on. But does it skip the very first > > let clause or > > does it re-calculate everytime the whole nested FLWOR > > expression and store > > it everytime in $temptltt? > > I'm a little confused by your question. Are you asking a question about > the > XQuery language, or about a specific implementation (such as Saxon)? And > when you say "parser", do you really mean parser (the syntax analyzer) or > are you asking about what the query processor does at run-time? > > The way in which FLWR expressions are executed will vary from one query > processor to another. I would be a little surprised if any query processor > evaluated the first "let" assignment more than once, but it could do so if > it wanted to. > > You can get some indication of how Saxon evaluates this query by running > it > with the -e option on the command line. This outputs the expression tree > after optimization rewrites. Saxon at the moment isn't especially advanced > in its optimization of FLWR expressions, but it does do things like moving > subexpressions (such as [$wbtt/dat = '200...'] in your example) out of > loops > to avoid repeated evaluation. > > I'm starting to observe a coding pattern where people who come to XQuery > from SQL write everything as FLWR expressions, when a simple path > expression > would sometimes be much more concise. For example: > > let $totalDelay_distinctMin := for $i in ($temptltt) > where ($i/min = $distinctMin) > return $i/dlay > > is something I would naturally write as: > > let $totalDelay_distinctMin := $tempt1tt[min=$distinctMin]/dlay > > (They aren't strictly equivalent, because path expressions deliver results > in document order with duplicates eliminated). > > Because of Saxon's history, it is currently better at optimizing path > expressions than FLWR expressions. But other query processors may differ. > > Michael Kay > > > > > > I really need to know it for my paper, > > > > Best regards > > Houman > > > > > > > > let $temptltt := for $wbtt in > > doc("wisc_berkeley_tracetime.xml")//row > > for $wb in doc("wisc_berkeley_3days.xml")//row > > where ( ($wbtt/dat = '20000801000000') > > and ($wb/dat > > = '20000801000000') and ($wbtt/min = (round($wb/tick div 600000))) ) > > return <g> { $wbtt/min } > > { $wb/dlay } > > { $wbtt/dat } > > { $wbtt/rID } </g> > > > > for $distinctMin in distinct-values($temptltt//min) > > > > let $totalDelay_distinctMin := for $i in ($temptltt) > > where ($i/min = $distinctMin) > > return $i/dlay > > > > let $rID := for $i in $temptltt > > where ($i/min = $distinctMin) > > return $i/rID > > > > let $dat := for $i in $temptltt > > where ($i/min = $distinctMin) > > return $i/dat > > > > return > > <ROW> > > { $rID[1] } > > <min>{ $distinctMin }</min> > > { $dat[1] } > > <avgDelay> { round-half-to-even( > > (avg($totalDelay_distinctMin)),4 ) } </avgDelay> > > </ROW> > > > > > > > > > >
Received on Sunday, 27 June 2004 02:50:45 UTC