Happy to hear that I'm not going mad ;-) I had the very same result on the Unix Server with a 6.0-2.1, as well a on a OSX with the same ML version.
On my Mac OSX with a 6.0-1.1 ML Server, the result is has excepted (from my point of view) : => 1 1 1 1 1 Maybe some kind of pre-processor may strip the [*] clause, but I tried to proposed the simplest test case and you should see the same odd behavior if you use something like [myelement eq = "value"]. The predicate is well performed, and then will returned less than 10604 docs in your case, but the predicate on position will then return the very same count of docs instead of the first one. Then I will prepare a test case for the support and open a ticket. Thanks for your one analysis. Stéphane Le 22 janv. 2013 à 19:58, Michael Blakeley <[email protected]> a écrit : > 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 _______________________________________________ General mailing list [email protected] http://developer.marklogic.com/mailman/listinfo/general
