[xquery-talk] XQuery and id()/idref(); Controlling the children of nodes in the result sequence

Michael Kay mike at saxonica.com
Thu Apr 24 11:04:19 PDT 2008


On any of these formulations, Saxon will return a result for the predicate
(x intersect y) as soon as if finds a node that is present in both sets.
What it won't do is to recognize that if the predicate is false for a
particular node, then it also false for its descendants.

The (x intersect y) formulation is better than (some $x in x, $y in y
satisfies $x is $y) because in the first case Saxon will use a sort-merge
strategy (with the sort often being unnecessary, because in many cases the
operands will already be in document order); in the latter case it will use
two nested loops.

Internally, when you use an expression whose static type is node()* in a
context where the effective boolean value is required, Saxon wraps the
expression in a call on exists(), because this avoids executing the general
EBV algorithm at run-time. The exists() function also rewrites its operand
to avoid sorting, for example exists(ancestor::x) is effectively rewritten
as exists(unsorted(ancestor::x)).

Michael Kay
http://www.saxonica.com/


> Andrew Welch wrote:
> 
>   Hi
> 
> > if you rewrote
> 
> > not(ancestor::* intersect $e)
> 
> > to be
> 
> > not(some $x in ancestor::* satisfies $x is $e)
> 
>   That's not the same thing because 'is' compares two nodes.  
> So your second expression would be rather equivalent to:
> 
>     not(ancestor::* intersect exactly-one($e))
> 
>   I'd say you should write instead:
> 
>     not(
>       some $x in ancestor::* satisfies
>         some $y in $e satisfies
>           $x is $y
>     )
> 
>   I didn't test them, but I guess even a naive processor 
> would have enough info in the second case to know it can stop 
> as soon as it finds a node that satisfies the identity 
> (because of 'some').
> 
>   For the first case Saxon seems to wrap the intersection 
> into an 'exists' instead of 'not', and I am confident that in 
> this case it stops when it finds a node.  But Mike can tell 
> you more on that.
> 
>   But when I see the two expressions, my first reaction is to 
> prefer to trust my processor's optimizer and make the intent 
> as clear as possible for other developers...
> 
>   Regards,
> 
> --drkm
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> __________________________________________________
> Do You Yahoo!?
> En finir avec le spam? Yahoo! Mail vous offre la meilleure 
> protection possible contre les messages non sollicités 
> http://mail.yahoo.fr Yahoo! Mail 
> 
> _______________________________________________
> talk at x-query.com
> http://x-query.com/mailman/listinfo/talk




More information about the talk mailing list