Hi Sébastien,
"order by @jcr:score" is exactly what I was looking for.
Thank you very much.
Jan
Am 28.05.2008 um 20:12 schrieb Sébastien Launay:
Hi Jan,
By setting the JavaBean property respectDocumentOrder to false
on SearchIndex you can disable document order sorting of query
results :
<SearchIndex
class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
...
<param name="respectDocumentOrder" value="false"/>
...
</SearchIndex>
Indeed, QueryImpl instances will be injected with this property.
This can also be forced using "order by @jcr:score" in the query.
But this does not changed the fact that unauthorized nodes will
not be retrieved from the query and will certainly log warnings
(from what i have seen AccessDeniedException is not considered
differently than a RepositoryException).
Another important behavior is that NodeIterator#getSize()
implementation
may (and will in your case) decrement while iterating over the nodes.
I think this is needed to get the best performance.
Jan Grathwohl wrote:
Hi,
we are having the problem in our application that an XPath query
does not return all results that should be in it. Some debugging
through the Jackrabbit internals showed us that the NodeIterator
from the query result received the right UUIDs from the Lucene
index, but then removed some of them from the list because the
sorting of the results failed.
The situation is that we have some nodes in the results list where
not all of the node's ancestors are accessible for the Session
(blocked by our AccessManager). We receive a
DocOrderNodeIteratorImpl from the query that contains these nodes,
and this iterator tries to sort the nodes before the first method
call that accesses them. The comparator then gets an
AccessDeniedException from the getAncestor() of one of the nodes,
and removes these nodes with unaccessable ancestors from the node
list. It also looks like the Comparator directly removes both
compared nodes from the result list if one of them throws an
Exception when being compared.
Is this wanted behaviour, that nodes won't be returned by a query
when they cannot be sorted? And is it generally supported in
JackRabbit to have nodes whose ancestors are not accessible?
We could work around that by turning off the sorting of the nodes,
we don't need sorted query results here. Is there a way to achieve
this trough JCR or Jackrabbit API? We are currently doing this by
accessing the private
org.apache.jackrabbit.core.query.lucene.QueryImpl object from the
query result through Java reflection, and then calling a
setRespectDocumentOrder(false) on it. But maybe there is a nicer
way (as probably almost any way would be nicer) to achieve the
same result?
I will attach the XPath query and Exception stack trace from our
log file.
Best regards and Thanks,
Jan
15:55:53,194 DEBUG [tcmdataaccess] QueryString is: //element(*,
tcs:category) [fn:lower-case(@tcs:defaultContentType) =
'information'] /element(*, tcs:categorylocalization)
[ @tcs:locview = 'pngo' and @tcs:loclanguage = 'de']
15:56:41,836 ERROR [DocOrderNodeIteratorImpl] Exception while
sorting nodes in document order: javax.jcr.AccessDeniedException:
cannot read item 827cae10-ad2e-44ad-927f-a65e96e0d4f2
javax.jcr.AccessDeniedException: cannot read item 827cae10-
ad2e-44ad-927f-a65e96e0d4f2
at org.apache.jackrabbit.core.ItemManager.getItem
(ItemManager.java:392)
at org.apache.jackrabbit.core.ItemManager.getNode
(ItemManager.java:350)
at org.apache.jackrabbit.core.ItemImpl.getAncestor
(ItemImpl.java:1403)
at
org.apache.jackrabbit.core.query.lucene.DocOrderNodeIteratorImpl
$1.compare(DocOrderNodeIteratorImpl.java:220)
at java.util.Arrays.mergeSort(Arrays.java:1284)
at java.util.Arrays.mergeSort(Arrays.java:1295)
at java.util.Arrays.sort(Arrays.java:1223)
at
org.apache.jackrabbit.core.query.lucene.DocOrderNodeIteratorImpl.init
OrderedIterator(DocOrderNodeIteratorImpl.java:172)
at
org.apache.jackrabbit.core.query.lucene.DocOrderNodeIteratorImpl.hasN
ext(DocOrderNodeIteratorImpl.java:131)
at
kontrast.toshiba.datastore.accessimpl.content.search.ContentSearchImp
l.getContentList(ContentSearchImpl.java:267)
at
kontrast.toshiba.datastore.accessimpl.content.search.ContentSearchImp
l.findContents(ContentSearchImpl.java:187)
at
kontrast.toshiba.datastore.accessimpl.content.search.ContentSearchImp
l.performQuery(ContentSearchImpl.java:117)
at
kontrast.toshiba.datastore.accessimpl.content.search.ContentSearchImp
l.getResults(ContentSearchImpl.java:89)