W3C home > Mailing lists > Public > www-ql@w3.org > April to June 2004

RE: Question about Let clause

From: Michael Kay <mhk@mhk.me.uk>
Date: Sun, 27 Jun 2004 22:54:44 +0100
To: "'Houman Khorasani'" <khorasani@web.de>, <mrys@microsoft.com>, <www-ql@w3.org>
Message-Id: <20040627215518.2C15CA192B@frink.w3.org>

Yes, at present Saxon will not detect that the expression 

for $i in ($temptltt) where ($i/min = $distinctMin)

is used three times and will therefore compute it repeatedly.

Michael Kay 

> -----Original Message-----
> From: Houman Khorasani [mailto:khorasani@web.de] 
> Sent: 27 June 2004 10:41
> To: mrys@microsoft.com; 'Michael Kay'; www-ql@w3.org
> Subject: RE: Question about Let clause
> Importance: High
> 
> Hello Michael Kay,
> Hello Michael Rys,
> 
> Thank you for the information.  Actually I didn't first 
> consider that every
> query processor handles the problem in a different way.  But 
> since I use
> Saxon 8.0 I still was curious to see how Saxon handles the 
> situation.  The
> -e option was very helpful and I analyzed the data for a long time.
> 
> I would say the first 'let' seems to be proceeding just once, 
> not because it
> contains a node construction, but because the nested FLWOR 
> has no dependency
> on the outer world.
> 
> If I would do something stupid like this, then the let clause will be
> computed every time since it has a dependency on the 'for' iteration.
> 
> 
> For $STUPID in doc("list.xml")//something
> 
> 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 } 
> 					{ $STUPID }
> 							</g>
> 
> 
> But now considering the real query; regarding the explanation 
> of Saxon's
> evaluation ( -e ) I would say the first 'let' proceeds just 
> once without any
> dependency to other iterations and stays 'outer loop'.
> 
> But the last three 'let' clauses change their value every 
> time the 'for'
> expression (before them) iterates.  So these three 'let' clauses are
> dependent of the value $distinctMin and have to stay in the loop.
> 
> 
> What do you think?
> 
> 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 17:55:18 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Saturday, 22 July 2006 00:10:19 GMT