Return-Path: X-Original-To: apmail-jackrabbit-commits-archive@www.apache.org Delivered-To: apmail-jackrabbit-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 80E3ADD4A for ; Tue, 21 May 2013 08:00:55 +0000 (UTC) Received: (qmail 71782 invoked by uid 500); 21 May 2013 08:00:55 -0000 Delivered-To: apmail-jackrabbit-commits-archive@jackrabbit.apache.org Received: (qmail 71602 invoked by uid 500); 21 May 2013 08:00:52 -0000 Mailing-List: contact commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@jackrabbit.apache.org Delivered-To: mailing list commits@jackrabbit.apache.org Received: (qmail 71582 invoked by uid 99); 21 May 2013 08:00:51 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 21 May 2013 08:00:51 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 21 May 2013 08:00:48 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 8E7EA2388A91; Tue, 21 May 2013 08:00:27 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1484685 - in /jackrabbit/branches/2.6: ./ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/LimitAndOffsetTest.java Date: Tue, 21 May 2013 08:00:27 -0000 To: commits@jackrabbit.apache.org From: jukka@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20130521080027.8E7EA2388A91@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: jukka Date: Tue May 21 08:00:27 2013 New Revision: 1484685 URL: http://svn.apache.org/r1484685 Log: 2.6: Merged revision 1465974 (JCR-3402) Modified: jackrabbit/branches/2.6/ (props changed) jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java jackrabbit/branches/2.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/LimitAndOffsetTest.java Propchange: jackrabbit/branches/2.6/ ------------------------------------------------------------------------------ Merged /jackrabbit/trunk:r1465974 Modified: jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java?rev=1484685&r1=1484684&r2=1484685&view=diff ============================================================================== --- jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java (original) +++ jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java Tue May 21 08:00:27 2013 @@ -79,9 +79,12 @@ public abstract class QueryResultImpl im private final List resultNodes = new ArrayList(); /** - * This is the raw number of results that matched the query. This number - * also includes matches which will not be returned due to access - * restrictions. This value is set whenever hits are obtained. + * This is the raw number of results that matched the query, ignoring limit and offset. Only set when accurate. + */ + private int totalResults = -1; + + /** + * This is the number of results that matched the query, with limit and offset. Only set when accurate. */ private int numResults = -1; @@ -254,6 +257,12 @@ public abstract class QueryResultImpl im if (log.isDebugEnabled()) { log.debug("getResults({}) limit={}", size, limit); } + + // quick check + // if numResults is set, all relevant results have been fetched + if (numResults != -1) { + return; + } long maxResultSize = size; @@ -279,9 +288,10 @@ public abstract class QueryResultImpl im // set selector names selectorNames = result.getSelectorNames(); + List offsetNodes = new ArrayList(); if (resultNodes.isEmpty() && offset > 0) { // collect result offset into dummy list - collectScoreNodes(result, new ArrayList(), offset); + collectScoreNodes(result, offsetNodes, offset); } else { int start = resultNodes.size() + invalid + (int) offset; result.skip(start); @@ -293,8 +303,24 @@ public abstract class QueryResultImpl im log.debug("retrieved ScoreNodes in {} ms ({})", System.currentTimeMillis() - time, r3 - r2); - // update numResults - numResults = result.getSize(); + // update numResults if all results have been fetched + // if resultNodes.getSize() is strictly smaller than maxResultSize, it means that all results have been fetched + int resultSize = resultNodes.size(); + if (resultSize < maxResultSize) { + if (resultNodes.isEmpty()) { + // if there's no result nodes, the actual totalResults if smaller or equals than the offset + totalResults = offsetNodes.size(); + numResults = 0; + } + else { + totalResults = resultSize + (int) offset; + numResults = resultSize; + } + } + else if (resultSize == limit) { + // if there's "limit" results, we can't know the total size (which may be greater), but the result size is the limit + numResults = (int) limit; + } } catch (IOException e) { throw new RepositoryException(e); } finally { @@ -367,18 +393,11 @@ public abstract class QueryResultImpl im * will get get if you don't set any limit or offset. This method may return * -1 if the total size is unknown. *

- * Keep in mind that this number may get smaller if nodes are found in - * the result set which the current session has no permission to access. - * FIXME: This might be a security problem. * * @return the total number of hits. */ public int getTotalSize() { - if (numResults == -1) { - return -1; - } else { - return numResults - invalid; - } + return totalResults; } private final class LazyScoreNodeIteratorImpl implements ScoreNodeIterator { @@ -429,21 +448,9 @@ public abstract class QueryResultImpl im /** * {@inheritDoc} - *

- * This value may shrink when the query result encounters non-existing - * nodes or the session does not have access to a node. */ public long getSize() { - int total = getTotalSize(); - if (total == -1) { - return -1; - } - long size = offset > total ? 0 : total - offset; - if (limit >= 0 && size > limit) { - return limit; - } else { - return size; - } + return numResults; } /** @@ -497,8 +504,8 @@ public abstract class QueryResultImpl im while (next == null) { if (nextPos >= resultNodes.size()) { // quick check if there are more results at all - // this check is only possible if we have numResults - if (numResults != -1 && (nextPos + invalid) >= numResults) { + // if numResults is set, all relevant results have been fetched + if (numResults != -1) { break; } Modified: jackrabbit/branches/2.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/LimitAndOffsetTest.java URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/LimitAndOffsetTest.java?rev=1484685&r1=1484684&r2=1484685&view=diff ============================================================================== --- jackrabbit/branches/2.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/LimitAndOffsetTest.java (original) +++ jackrabbit/branches/2.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/LimitAndOffsetTest.java Tue May 21 08:00:27 2013 @@ -148,9 +148,5 @@ public class LimitAndOffsetTest extends result = query.execute(); nodes = result.getNodes(); assertEquals(1, nodes.getSize()); - if (result instanceof JackrabbitQueryResult) { - assertEquals(3, ((JackrabbitQueryResult) result).getTotalSize()); - } } - }