RE: Question about Let clause

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