You're right, there is something odd going on there. You should make sure 
support knows about it.

count(collection()[*][1]),
count(
  for $doc in collection()[*][1]
  return $doc),
count(
  for $doc in (collection()[*])[1]
  return $doc),
count(
  for $doc in collection()[1]
  return $doc),
count(
  let $seq := collection()[*][1]
  for $doc in $seq
  return $doc)
=>
1
10604
10604
1
1

That's on OS X with 6.0-2.1, but I see similar results with linux and 6.0-2. As 
you say extra parens don't help.

But the last two forms seem like workarounds. Simply dropping the [*] or 
[exists(*)] clause works, and in that context I believe it's a noop. It should 
test the existence of the document-node, which will always be true. Oddly the 
last form, using an extra 'let', returns 1 *without* any extra parens. So I 
don't understand dynamic context as well as I thought.

-- Mike

On 22 Jan 2013, at 10:21 , Stephane Toussaint <[email protected]> 
wrote:

> Yes, but in fact in this case, extra quotes doesn't change anything to this 
> behavior.
> I can't reproduce this test case on previous ML versions (currently on 
> 6.0-1.1). Seem's to be introduce with the latest version and I guess It could 
> leads to errors.
> 
> Stéphane
> 
> 
> 
> Le 22 janv. 2013 à 18:07, Michael Blakeley <[email protected]> a écrit :
> 
>> That looks like normal, if confusing, behavior to me. XPath defines 
>> position() as a dynamic context function, so its meaning can change during 
>> evaluation.
>> 
>>   http://www.w3.org/TR/xpath20/#id-xp-evaluation-context-components
>> 
>>   http://www.w3.org/TR/xpath20/#dt-dynamic-context
>> 
>> I think this is the most relevant bit:
>> 
>>> The context position is the position of the context item within the 
>>> sequence of items currently being processed.] It changes whenever the 
>>> context item changes. When the focus is defined, the value of the context 
>>> position is an integer greater than zero. The context position is returned 
>>> by the expression fn:position(). When an expression E1/E2 or E1[E2] is 
>>> evaluated, the context position in the inner focus for an evaluation of E2 
>>> is the position of the context item in the sequence obtained by evaluating 
>>> E1. The position of the first item in a sequence is always 1 (one). The 
>>> context position is always less than or equal to the context size.
>> 
>> 
>> After [exists(*)] has been evaluated, [1] sees every document-node() in 
>> collection('test')[*] as its own input sequence. Therefore every document 
>> has position() = 1. So the behavior is confusing, but correct.
>> 
>> What you probably want is:
>> 
>>   (collection(test)[*])[1]
>> 
>> The extra parens change the scope of the [1] predicate.
>> 
>> -- Mike
>> 
>> On 22 Jan 2013, at 08:44 , Stéphane TOUSSAINT 
>> <[email protected]> wrote:
>> 
>>> Hi,
>>> 
>>> I just found something wrong (I guess) with XPath predicates on ML 6.0-2.1
>>> 
>>> The following query returns weird result :
>>> 
>>> fn:count(for $doc in fn:collection("test")[fn:exists(*)][1]
>>> return $doc)
>>> 
>>> Say I put 10 documents in collection "test", I guess this query return only 
>>> 1 (the first document) document from the collection. But instead it returns 
>>> 10 documents.
>>> I seems that after the first predicates there is 10 sequences of 1 document 
>>> each instead of one single collection with 10 document inside.
>>> 
>>> For information, this is the minimal test case I was able to write, but it 
>>> is the same with more complexe predicates.
>>> 
>>> Note that 
>>> 
>>> for $doc in fn:collection("test")[1]
>>> return $doc
>>> 
>>> successfully return one single element.
>>> 
>>> Any clue? thanks
>>> 
>>> Stéphane
>>> _______________________________________________
>>> General mailing list
>>> [email protected]
>>> http://developer.marklogic.com/mailman/listinfo/general
>> 
>> _______________________________________________
>> General mailing list
>> [email protected]
>> http://developer.marklogic.com/mailman/listinfo/general
> 
> _______________________________________________
> General mailing list
> [email protected]
> http://developer.marklogic.com/mailman/listinfo/general
> 

_______________________________________________
General mailing list
[email protected]
http://developer.marklogic.com/mailman/listinfo/general

Reply via email to