- From: Houman Khorasani <khorasani@web.de>
- Date: Sun, 27 Jun 2004 04:41:06 -0500
- To: mrys@microsoft.com, 'Michael Kay' <mhk@mhk.me.uk>, www-ql@w3.org
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 05:42:04 UTC