Hi Dmitri,
thanks for your answer.

We currently made a work around to check ourselves if the path is
actually pointing to a collection (invoking the getValue() ) before
invoking the evaluation of a count(path).

Amyway, we think this could be a bug in JXPath. In fact the count
function calls the expression.compute(context) which states in its
javadoc "Evaluates the expression. If the result is a node set, returns
the first element of the node set." .. so IIUC it will never actually
return a java.util.Collection.

Wouldn't it be better to try to retrieve the simple value before, check
if it is a Collection, and if it's not proceed with the rest of the
actual code? It's not a suggestion, is a real question :) I've been
using JXPath for long time inside cocoon, but never examined the code in
depth.

Regards,

Simone

Dmitri Plotnikov wrote:

> Simone,
>
> Perhaps a custom extension function could be used instead of
> "count(list)" to resolve the issue.
>
> - Dmitri
>
> ----- Original Message ----- From: "Simone Gianni" <[EMAIL PROTECTED]>
> To: <commons-dev@jakarta.apache.org>
> Sent: Thursday, July 27, 2006 1:47 PM
> Subject: JXPath, beans and the count function
>
>
>> Hi there,
>> we are developing paginated repeater for Cocoon. The cocoon repeaters
>> uses JXPath in their binding so that they can work on beans and XML
>> documents.
>>
>> The goal for us is to display a very long list of elements from a
>> collection not fetching the entire content of the collection. This is
>> expecially useful when the collection is backed by a persistence layer
>> like hibernate or similar, and you have a very big rowset (we are
>> testing on an application with a list with 11000 elements in it).
>>
>> Now, one key element for every pagination system is to retrieve the
>> total amount of items in the list. We tried to accomplish this with a
>> count(pathToList). Actually we have a bean having a getList method
>> returning a java.util.List instance, so we try count(list/*) ,
>> count(list), count(list/something), and we would expect JXPath to call
>> getList().size(). This is quite critical, because the list
>> implementation knows how to retrieve the number of rows without actually
>> fetching all the rows from the underlying dataset.
>>
>> Unfortunately, what hapens is different. The
>> CoreFunction.functionCount() method does not recognize it as a
>> Collection, but as a EvalContext instead, and iterates on all the lines
>> to count the items (actually is the EvalContext.hasNext() method that
>> iterates on the entire collection).
>>
>> What's strange is that there is a check in CoreFunction.functionCount()
>> to see if a Collection is in place and eventually call the
>> Collection.size() method, but this seems like it's never happening.
>>
>> Could you please help us? Is it a JXPath bug or are we completely
>> missing something?
>>
>> TIA, regards,
>> Simone Gianni,
>> Matthias Epheser
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>>
>>
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
-- 
Simone Gianni

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to