You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2008/08/12 15:04:58 UTC
svn commit: r685139 -
/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java
Author: mreutegg
Date: Tue Aug 12 06:04:57 2008
New Revision: 685139
URL: http://svn.apache.org/viewvc?rev=685139&view=rev
Log:
JCR-1714: QueryImpl result offSet must be considered after security class grant the item
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java?rev=685139&r1=685138&r2=685139&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java Tue Aug 12 06:04:57 2008
@@ -293,19 +293,16 @@
log.debug("query executed in {} ms",
new Long(System.currentTimeMillis() - time));
- int start = resultNodes.size() + invalid + (int) offset;
- time = System.currentTimeMillis();
- result.skip(start);
- for (ScoreNode[] sn = result.nextScoreNodes();
- sn != null && resultNodes.size() < maxResultSize;
- sn = result.nextScoreNodes()) {
- // check access
- if (isAccessGranted(sn)) {
- resultNodes.add(sn);
- } else {
- invalid++;
- }
+ if (resultNodes.isEmpty() && offset > 0) {
+ // collect result offset into dummy list
+ collectScoreNodes(result, new ArrayList(), offset);
+ } else {
+ int start = resultNodes.size() + invalid + (int) offset;
+ result.skip(start);
}
+
+ time = System.currentTimeMillis();
+ collectScoreNodes(result, resultNodes, maxResultSize);
log.debug("retrieved ScoreNodes in {} ms",
new Long(System.currentTimeMillis() - time));
@@ -326,6 +323,36 @@
}
/**
+ * Collect score nodes from <code>hits</code> into the <code>collector</code>
+ * list until the size of <code>collector</code> reaches <code>maxResults</code>
+ * or there are not more results.
+ *
+ * @param hits the raw hits.
+ * @param collector where the access checked score nodes are collected.
+ * @param maxResults the maximum number of results in the collector.
+ * @throws IOException if an error occurs while reading from hits.
+ * @throws RepositoryException if an error occurs while checking access rights.
+ */
+ private void collectScoreNodes(MultiColumnQueryHits hits,
+ List collector,
+ long maxResults)
+ throws IOException, RepositoryException {
+ while (collector.size() < maxResults) {
+ ScoreNode[] sn = hits.nextScoreNodes();
+ if (sn == null) {
+ // no more results
+ break;
+ }
+ // check access
+ if (isAccessGranted(sn)) {
+ collector.add(sn);
+ } else {
+ invalid++;
+ }
+ }
+ }
+
+ /**
* Checks if access is granted to all <code>nodes</code>.
*
* @param nodes the nodes to check.