Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java (revision 1769271) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java (working copy) @@ -119,7 +119,7 @@ * The maximum size of this result if limit >= 0 */ private final long limit; - + private final boolean sizeEstimate; /** @@ -205,7 +205,7 @@ getScoreNodes(), columns, selectorNames, sessionContext.getItemManager(), index.getContext().getHierarchyManager(), - sessionContext, + sessionContext, sessionContext.getSessionImpl().getValueFactory(), excerptProvider, spellSuggestion); } @@ -260,7 +260,7 @@ if (log.isDebugEnabled()) { log.debug("getResults({}) limit={}", size, limit); } - + if (!sizeEstimate) { // quick check // if numResults is set, all relevant results have been fetched @@ -297,7 +297,12 @@ if (resultNodes.isEmpty() && offset > 0) { // collect result offset into dummy list if (sizeEstimate) { - collectScoreNodes(result, new ArrayList(), offset); + long offsetCount = offset; + while (offsetCount > Integer.MAX_VALUE) { // offset (long) could be larger than Integer.MAX_VALUE. Skip multiple times when needed. + result.skip(Integer.MAX_VALUE); + offsetCount -= Integer.MAX_VALUE; + } + result.skip((int) offsetCount); } else { collectScoreNodes(result, offsetNodes, offset); } @@ -314,7 +319,7 @@ if (sizeEstimate) { // update numResults - numResults = result.getSize(); + numResults = result.getSize(); } else { // update numResults if all results have been fetched // if resultNodes.getSize() is strictly smaller than maxResultSize, it means that all results have been fetched @@ -490,7 +495,7 @@ return limit; } else { return size; - } + } } else { return numResults; }