You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by th...@apache.org on 2015/08/11 09:25:38 UTC

svn commit: r1695221 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/query/ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/ oak-jcr/src/main/java/org/apache/jac...

Author: thomasm
Date: Tue Aug 11 07:25:37 2015
New Revision: 1695221

URL: http://svn.apache.org/r1695221
Log:
OAK-2977 Fast result size estimate: OSGi configuration

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/OsgiRepository.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/RepositoryManager.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/PrefetchIterator.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/PrefetchIteratorTest.java
    jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/LuceneOakRepositoryStub.java
    jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/query/ResultSizeTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java?rev=1695221&r1=1695220&r2=1695221&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java Tue Aug 11 07:25:37 2015
@@ -486,6 +486,18 @@ public class QueryImpl implements Query
         }
         Iterator<ResultRowImpl> it =
                 FilterIterators.newCombinedFilter(rowIt, distinct, limit, offset, orderBy, settings);
+        if (orderBy != null) {
+            // this will force the rows to be read, so that the size is known
+            it.hasNext();
+            // we need the size, and there is no other way to get it right now
+            // but we also have to take limit and offset into account
+            long read = rowIt.getReadCount();
+            // we will ignore whatever is behind 'limit+offset'
+            read = Math.min(saturatedAdd(limit, offset), read);
+            // and we will skip 'offset' entries
+            read = Math.max(0, read - offset);
+            size = read;
+        }
         if (measure) {
             // return the measuring iterator delegating the readCounts to the rowIterator
             it = new MeasuringIterator(this, it) {
@@ -1091,6 +1103,10 @@ public class QueryImpl implements Query
     @Override
     public long getSize(SizePrecision precision, long max) {
         // Note: DISTINCT is ignored
+        if (size != -1) {
+            // "order by" was used, so we know the size
+            return size;
+        }
         return Math.min(limit, source.getSize(precision, max));
     }
 

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java?rev=1695221&r1=1695220&r2=1695221&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java Tue Aug 11 07:25:37 2015
@@ -68,7 +68,8 @@ public class Jcr {
 
     private SecurityProvider securityProvider;
     private int observationQueueLength = DEFAULT_OBSERVATION_QUEUE_LENGTH;
-    private CommitRateLimiter commitRateLimiter = null;
+    private CommitRateLimiter commitRateLimiter;
+    private boolean fastQueryResultSize;
 
     private Repository repository;
 
@@ -201,6 +202,12 @@ public class Jcr {
         return this;
     }
 
+    @Nonnull
+    public Jcr withFastQueryResultSize(boolean fastQueryResultSize) {
+        this.fastQueryResultSize = fastQueryResultSize;
+        return this;
+    }
+
     public ContentRepository createContentRepository() {
         return oak.createContentRepository();
     }
@@ -212,7 +219,8 @@ public class Jcr {
                     oak.getWhiteboard(),
                     securityProvider,
                     observationQueueLength,
-                    commitRateLimiter);
+                    commitRateLimiter,
+                    fastQueryResultSize);
         }
 
         return repository;

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/OsgiRepository.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/OsgiRepository.java?rev=1695221&r1=1695220&r2=1695221&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/OsgiRepository.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/OsgiRepository.java Tue Aug 11 07:25:37 2015
@@ -38,8 +38,10 @@ public class OsgiRepository extends Repo
                           Whiteboard whiteboard,
                           SecurityProvider securityProvider,
                           int observationQueueLength,
-                          CommitRateLimiter commitRateLimiter) {
-        super(repository, whiteboard, securityProvider, observationQueueLength, commitRateLimiter);
+                          CommitRateLimiter commitRateLimiter,
+                          boolean fastQueryResultSize) {
+        super(repository, whiteboard, securityProvider, observationQueueLength, 
+                commitRateLimiter, fastQueryResultSize);
     }
 
     @Override

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/RepositoryManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/RepositoryManager.java?rev=1695221&r1=1695220&r2=1695221&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/RepositoryManager.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/RepositoryManager.java Tue Aug 11 07:25:37 2015
@@ -56,6 +56,7 @@ import org.osgi.framework.ServiceRegistr
 public class RepositoryManager {
     private static final int DEFAULT_OBSERVATION_QUEUE_LENGTH = 1000;
     private static final boolean DEFAULT_COMMIT_RATE_LIMIT = false;
+    private static final boolean DEFAULT_FAST_QUERY_RESULT_SIZE = false;
 
     //TODO Exposed for testing purpose due to SLING-4472
     static boolean ignoreFrameworkProperties = false;
@@ -78,6 +79,8 @@ public class RepositoryManager {
     private int observationQueueLength;
 
     private CommitRateLimiter commitRateLimiter;
+    
+    private boolean fastQueryResultSize;
 
     @Reference
     private SecurityProvider securityProvider;
@@ -98,6 +101,12 @@ public class RepositoryManager {
                 "queue exceed 90% of its capacity.")
     private static final String COMMIT_RATE_LIMIT = "oak.observation.limit-commit-rate";
 
+    @Property(
+            boolValue = DEFAULT_FAST_QUERY_RESULT_SIZE,
+            name = "Fast query result size",
+            description = "Whether the query result size should return an estimation (or -1 if disabled) for large queries")
+    private static final String FAST_QUERY_RESULT_SIZE = "oak.query.fastResultSize";
+
     @Activate
     public void activate(BundleContext bundleContext, Map<String, ?> config) throws Exception {
         observationQueueLength = PropertiesUtil.toInteger(prop(
@@ -109,7 +118,10 @@ public class RepositoryManager {
         } else {
             commitRateLimiter = null;
         }
-
+        
+        fastQueryResultSize = PropertiesUtil.toBoolean(prop(
+                config, bundleContext, FAST_QUERY_RESULT_SIZE), DEFAULT_FAST_QUERY_RESULT_SIZE);
+        
         whiteboard = new OsgiWhiteboard(bundleContext);
         initializers = whiteboard.track(RepositoryInitializer.class);
         editorProvider.start(whiteboard);
@@ -166,7 +178,7 @@ public class RepositoryManager {
         return bundleContext.registerService(
                 Repository.class.getName(),
                 new OsgiRepository(oak.createContentRepository(), whiteboard, securityProvider,
-                        observationQueueLength, commitRateLimiter),
+                        observationQueueLength, commitRateLimiter, fastQueryResultSize),
                 new Properties());
     }
 }

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/PrefetchIterator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/PrefetchIterator.java?rev=1695221&r1=1695220&r2=1695221&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/PrefetchIterator.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/PrefetchIterator.java Tue Aug 11 07:25:37 2015
@@ -37,12 +37,10 @@ import org.apache.jackrabbit.oak.api.Res
  */
 public class PrefetchIterator<K> implements Iterator<K> {
     
-    private final boolean fastSize = Boolean.getBoolean("oak.fastQuerySize");
-    
-    private final Result result;
-    
     private final Iterator<K> it;
     private final long minPrefetch, timeout, maxPrefetch;
+    private final boolean fastSize;
+    private final Result fastSizeCallback;
     private boolean prefetchDone;
     private Iterator<K> prefetchIterator;
     private long size, position;
@@ -51,23 +49,17 @@ public class PrefetchIterator<K> impleme
      * Create a new iterator.
      * 
      * @param it the base iterator
-     * @param min the minimum number of items to pre-fetch
-     * @param timeout the maximum time to pre-fetch in milliseconds
-     * @param max the maximum number of items to pre-fetch
-     * @param size the size (prefetching is only required if -1)
+     * @param options the prefetch options to use
      * @param result (optional) the result to get the size from
      */
-    PrefetchIterator(Iterator<K> it, long min, long timeout, long max, 
-            long size, Result result) {
+    PrefetchIterator(Iterator<K> it, PrefetchOptions options) {
         this.it = it;
-        this.minPrefetch = min;
-        if (fastSize) {
-            timeout = 0;
-        }
-        this.timeout = timeout;
-        this.maxPrefetch = max;
-        this.size = size;
-        this.result = result;
+        this.minPrefetch = options.min;
+        this.maxPrefetch = options.max;
+        this.timeout = options.fastSize ? 0 : options.timeout;
+        this.fastSize = options.fastSize;
+        this.size = options.size;
+        this.fastSizeCallback = options.fastSizeCallback;
     }
 
     @Override
@@ -145,11 +137,52 @@ public class PrefetchIterator<K> impleme
             position -= list.size();
         }
         if (size == -1 && fastSize) {
-            if (result != null) {
-                size = result.getSize(SizePrecision.EXACT, Long.MAX_VALUE);
+            if (fastSizeCallback != null) {
+                size = fastSizeCallback.getSize(SizePrecision.EXACT, Long.MAX_VALUE);
             }
         }
         return size;
     }
+    
+    /**
+     * The options to use for prefetching.
+     */
+    public static class PrefetchOptions {
+        
+        // uses the "simple" named-parameter pattern
+        // see also http://stackoverflow.com/questions/1988016/named-parameter-idiom-in-java
+        
+        /**
+         * The minimum number of rows / nodes to pre-fetch.
+         */
+        long min = 20;
+        
+        /**
+         * The maximum number of rows / nodes to pre-fetch.
+         */
+        long max = 100;
+        
+        /**
+         * The maximum number of milliseconds to prefetch rows / nodes
+         * (ignored if fastSize is set).
+         */
+        long timeout = 100;
+        
+        /**
+         * The size if known, or -1 if not (prefetching is only required if -1).
+         */
+        long size;
+        
+        /**
+         * Whether or not the expected size should be read from the result.
+         */
+        boolean fastSize;
+        
+        /**
+         * The result (optional) to get the size from, in case the fast size options is set.
+         */
+        Result fastSizeCallback;
+        
+    }
 
 }

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java?rev=1695221&r1=1695220&r2=1695221&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java Tue Aug 11 07:25:37 2015
@@ -35,6 +35,7 @@ import org.apache.jackrabbit.oak.api.Pro
 import org.apache.jackrabbit.oak.api.Result;
 import org.apache.jackrabbit.oak.api.ResultRow;
 import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.jcr.query.PrefetchIterator.PrefetchOptions;
 import org.apache.jackrabbit.oak.jcr.session.NodeImpl;
 import org.apache.jackrabbit.oak.jcr.session.SessionContext;
 import org.apache.jackrabbit.oak.jcr.delegate.NodeDelegate;
@@ -50,24 +51,10 @@ public class QueryResultImpl implements
 
     static final Logger LOG = LoggerFactory.getLogger(QueryResultImpl.class);
 
-    /**
-     * The minimum number of rows / nodes to pre-fetch.
-     */ 
-    private static final int PREFETCH_MIN = 20;
-
-    /**
-     * The maximum number of rows / nodes to pre-fetch.
-     */
-    private static final int PREFETCH_MAX = 100;
-
-    /**
-     * The maximum number of milliseconds to prefetch rows / nodes.
-     */
-    private static final int PREFETCH_TIMEOUT = 100;
-
+    protected final SessionContext sessionContext;
+    
     final Result result;
 
-    private final SessionContext sessionContext;
     private final SessionDelegate sessionDelegate;
 
     public QueryResultImpl(SessionContext sessionContext, Result result) {
@@ -136,8 +123,11 @@ public class QueryResultImpl implements
         };
         final PrefetchIterator<RowImpl> prefIt = new  PrefetchIterator<RowImpl>(
                 sessionDelegate.sync(rowIterator),
-                PREFETCH_MIN, PREFETCH_TIMEOUT, PREFETCH_MAX, 
-                result.getSize(), result);
+                new PrefetchOptions() { {
+                    size = result.getSize();
+                    fastSize = sessionContext.getFastQueryResultSize();
+                    fastSizeCallback = result;
+                } });
         return new RowIteratorAdapter(prefIt) {
             @Override
             public long getSize() {
@@ -167,7 +157,8 @@ public class QueryResultImpl implements
             throw new RepositoryException("Query does not contain a selector: " +
                     Arrays.toString(columnSelectorNames));
         }
-        Iterator<NodeImpl<? extends NodeDelegate>> nodeIterator = new Iterator<NodeImpl<? extends NodeDelegate>>() {
+        Iterator<NodeImpl<? extends NodeDelegate>> nodeIterator = 
+                new Iterator<NodeImpl<? extends NodeDelegate>>() {
 
             private final Iterator<? extends ResultRow> it = result.getRows().iterator();
             private NodeImpl<? extends NodeDelegate> current;
@@ -214,10 +205,14 @@ public class QueryResultImpl implements
             }
 
         };
-        final PrefetchIterator<NodeImpl<? extends NodeDelegate>> prefIt = new  PrefetchIterator<NodeImpl<? extends NodeDelegate>>(
-                sessionDelegate.sync(nodeIterator),
-                PREFETCH_MIN, PREFETCH_TIMEOUT, PREFETCH_MAX, 
-                result.getSize(), result);
+        final PrefetchIterator<NodeImpl<? extends NodeDelegate>> prefIt = 
+                new  PrefetchIterator<NodeImpl<? extends NodeDelegate>>(
+                    sessionDelegate.sync(nodeIterator),
+                    new PrefetchOptions() { {
+                        size = result.getSize();
+                        fastSize = sessionContext.getFastQueryResultSize();
+                        fastSizeCallback = result;
+                    } });
         return new NodeIteratorAdapter(prefIt) {
             @Override
             public long getSize() {

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java?rev=1695221&r1=1695220&r2=1695221&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java Tue Aug 11 07:25:37 2015
@@ -74,11 +74,6 @@ import org.slf4j.LoggerFactory;
 public class RepositoryImpl implements JackrabbitRepository {
 
     /**
-     * logger instance
-     */
-    private static final Logger log = LoggerFactory.getLogger(RepositoryImpl.class);
-
-    /**
      * Name of the session attribute value determining the session refresh
      * interval in seconds.
      *
@@ -93,9 +88,15 @@ public class RepositoryImpl implements J
      */
     public static final String RELAXED_LOCKING = "oak.relaxed-locking";
 
+    /**
+     * logger instance
+     */
+    private static final Logger log = LoggerFactory.getLogger(RepositoryImpl.class);
+
+    protected final Whiteboard whiteboard;
+    protected final boolean fastQueryResultSize;
     private final GenericDescriptors descriptors;
     private final ContentRepository contentRepository;
-    protected final Whiteboard whiteboard;
     private final SecurityProvider securityProvider;
     private final int observationQueueLength;
     private final CommitRateLimiter commitRateLimiter;
@@ -121,11 +122,24 @@ public class RepositoryImpl implements J
 
     private final StatisticManager statisticManager;
 
+    /**
+     * Constructor used for backward compatibility.
+     */
     public RepositoryImpl(@Nonnull ContentRepository contentRepository,
                           @Nonnull Whiteboard whiteboard,
                           @Nonnull SecurityProvider securityProvider,
                           int observationQueueLength,
                           CommitRateLimiter commitRateLimiter) {
+        this(contentRepository, whiteboard, securityProvider, 
+                observationQueueLength, commitRateLimiter, false);
+    }
+    
+    public RepositoryImpl(@Nonnull ContentRepository contentRepository,
+                          @Nonnull Whiteboard whiteboard,
+                          @Nonnull SecurityProvider securityProvider,
+                          int observationQueueLength,
+                          CommitRateLimiter commitRateLimiter,
+                          boolean fastQueryResultSize) {
         this.contentRepository = checkNotNull(contentRepository);
         this.whiteboard = checkNotNull(whiteboard);
         this.securityProvider = checkNotNull(securityProvider);
@@ -135,6 +149,7 @@ public class RepositoryImpl implements J
         this.statisticManager = new StatisticManager(whiteboard, scheduledExecutor);
         this.clock = new Clock.Fast(scheduledExecutor);
         this.gcMonitorRegistration = whiteboard.register(GCMonitor.class, gcMonitor, emptyMap());
+        this.fastQueryResultSize = fastQueryResultSize;
     }
 
     //---------------------------------------------------------< Repository >---
@@ -338,7 +353,7 @@ public class RepositoryImpl implements J
             Map<String, Object> attributes, SessionDelegate delegate, int observationQueueLength,
             CommitRateLimiter commitRateLimiter) {
         return new SessionContext(this, statisticManager, securityProvider, whiteboard, attributes,
-                delegate, observationQueueLength, commitRateLimiter);
+                delegate, observationQueueLength, commitRateLimiter, fastQueryResultSize);
     }
 
     /**

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java?rev=1695221&r1=1695220&r2=1695221&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java Tue Aug 11 07:25:37 2015
@@ -32,10 +32,8 @@ import javax.annotation.Nonnull;
 import javax.jcr.PathNotFoundException;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
-import javax.jcr.Session;
 import javax.jcr.UnsupportedRepositoryOperationException;
 import javax.jcr.ValueFactory;
-import javax.jcr.Workspace;
 import javax.jcr.observation.ObservationManager;
 import javax.jcr.security.AccessControlManager;
 
@@ -109,12 +107,15 @@ public class SessionContext implements N
 
     /** Paths of all session scoped locks held by this session. */
     private final Set<String> sessionScopedLocks = newHashSet();
+    
+    private final boolean fastQueryResultSize;
 
     public SessionContext(
             @Nonnull Repository repository, @Nonnull StatisticManager statisticManager,
             @Nonnull SecurityProvider securityProvider, @Nonnull Whiteboard whiteboard,
             @Nonnull Map<String, Object> attributes, @Nonnull final SessionDelegate delegate,
-            int observationQueueLength, CommitRateLimiter commitRateLimiter) {
+            int observationQueueLength, CommitRateLimiter commitRateLimiter,
+            boolean fastQueryResultSize) {
         this.repository = checkNotNull(repository);
         this.statisticManager = statisticManager;
         this.securityProvider = checkNotNull(securityProvider);
@@ -131,6 +132,7 @@ public class SessionContext implements N
                 namespaces, delegate.getIdManager());
         this.valueFactory = new ValueFactoryImpl(
                 delegate.getRoot(), namePathMapper);
+        this.fastQueryResultSize = fastQueryResultSize;
     }
 
     public final Map<String, Object> getAttributes() {
@@ -280,6 +282,13 @@ public class SessionContext implements N
     public Set<String> getSessionScopedLocks() {
         return sessionScopedLocks;
     }
+    
+    public boolean getFastQueryResultSize() {
+        if (System.getProperty("oak.fastQuerySize") != null) {
+            return Boolean.getBoolean("oak.fastQuerySize");
+        }
+        return fastQueryResultSize;
+    }
 
     //-----------------------------------------------------< NamePathMapper >---
 

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/PrefetchIteratorTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/PrefetchIteratorTest.java?rev=1695221&r1=1695220&r2=1695221&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/PrefetchIteratorTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/PrefetchIteratorTest.java Tue Aug 11 07:25:37 2015
@@ -24,19 +24,26 @@ import static org.junit.Assert.fail;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
+import org.apache.jackrabbit.oak.jcr.query.PrefetchIterator.PrefetchOptions;
 import org.junit.Test;
 
 /**
  * Test the PrefetchIterator class.
  */
 public class PrefetchIteratorTest {
-
+    
     @Test
     public void testKnownSize() {
         Iterable<Integer> s;
         PrefetchIterator<Integer> it;
         s = seq(0, 100);
-        it = new PrefetchIterator<Integer>(s.iterator(), 5, 0, 10, 200, null);
+        it = new PrefetchIterator<Integer>(s.iterator(), 
+                new PrefetchOptions() { {
+                    min = 5;
+                    timeout = 0;
+                    max = 10;
+                    size = 200;
+                } });
         // reports the 'wrong' value as it was set manually
         assertEquals(200, it.size());
     }
@@ -47,14 +54,26 @@ public class PrefetchIteratorTest {
         PrefetchIterator<Integer> it;
         
         // long delay (10 ms per row)
-        long timeout = 10;
+        final long testTimeout = 10;
         s = seq(0, 100, 10);
-        it = new PrefetchIterator<Integer>(s.iterator(), 5, timeout, 1000, -1, null);
+        it = new PrefetchIterator<Integer>(s.iterator(), 
+                new PrefetchOptions() { {
+                    min = 5;
+                    timeout = testTimeout;
+                    max = 10;
+                    size = -1;
+                } });
         assertEquals(-1, it.size());
 
         // no delay
         s = seq(0, 100);
-        it = new PrefetchIterator<Integer>(s.iterator(), 5, timeout, 1000, -1, null);
+        it = new PrefetchIterator<Integer>(s.iterator(), 
+                new PrefetchOptions() { {
+                    min = 5;
+                    timeout = testTimeout;
+                    max = 1000;
+                    size = -1;
+                } });
         assertEquals(100, it.size());
     }
 
@@ -65,10 +84,16 @@ public class PrefetchIteratorTest {
         for (int size : seq(0, 100)) {
             for (int readBefore : seq(0, 30)) {
                 // every 3th time, use a timeout
-                long timeout = size % 3 == 0 ? 100 : 0;
+                final long testTimeout = size % 3 == 0 ? 100 : 0;
                 Iterable<Integer> s = seq(0, size);
                 PrefetchIterator<Integer> it = 
-                        new PrefetchIterator<Integer>(s.iterator(), 20, timeout, 30, -1, null);
+                        new PrefetchIterator<Integer>(s.iterator(), 
+                                new PrefetchOptions() { {
+                                    min = 20;
+                                    timeout = testTimeout;
+                                    max = 30;
+                                    size = -1;
+                                } });
                 for (int x : seq(0, readBefore)) {
                     boolean hasNext = it.hasNext();
                     if (!hasNext) {
@@ -80,7 +105,7 @@ public class PrefetchIteratorTest {
                     assertEquals(m, x, it.next().intValue());
                 }
                 String m = "s:" + size + " b:" + readBefore;
-                int max = timeout <= 0 ? 20 : 30;
+                int max = testTimeout <= 0 ? 20 : 30;
                 if (size > max && readBefore <= size) {
                     assertEquals(m, -1, it.size());
                     // calling it twice must not change the result

Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/LuceneOakRepositoryStub.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/LuceneOakRepositoryStub.java?rev=1695221&r1=1695220&r2=1695221&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/LuceneOakRepositoryStub.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/LuceneOakRepositoryStub.java Tue Aug 11 07:25:37 2015
@@ -35,7 +35,6 @@ import javax.jcr.RepositoryException;
 
 import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
 import org.apache.jackrabbit.oak.plugins.index.aggregate.SimpleNodeAggregator;
-import org.apache.jackrabbit.oak.plugins.index.lucene.IndexFormatVersion;
 import org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants;
 import org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexEditorProvider;
 import org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexProvider;
@@ -58,6 +57,7 @@ public class LuceneOakRepositoryStub ext
                 new LuceneCompatModeInitializer("luceneGlobal", (Set<String>) null))
                 .with((QueryIndexProvider)provider)
                 .with((Observer) provider)
+                .withFastQueryResultSize(true)
                 .with(new LuceneIndexEditorProvider());
     }
 

Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/query/ResultSizeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/query/ResultSizeTest.java?rev=1695221&r1=1695220&r2=1695221&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/query/ResultSizeTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/query/ResultSizeTest.java Tue Aug 11 07:25:37 2015
@@ -86,7 +86,8 @@ public class ResultSizeTest extends Abst
         StringBuilder buff;
         
         // fast (insecure) case
-        System.setProperty("oak.fastQuerySize", "true");
+        // enabled by default now, in LuceneOakRepositoryStub 
+        System.clearProperty("oak.fastQuerySize");
         q = qm.createQuery(xpath, "xpath");
         it = q.execute().getNodes();
         result = it.getSize();
@@ -104,8 +105,10 @@ public class ResultSizeTest extends Abst
         it = q.execute().getNodes();
         assertEquals(90, it.getSize());
         
+        
         // default (secure) case
-        System.clearProperty("oak.fastQuerySize");
+        // manually disabled
+        System.setProperty("oak.fastQuerySize", "false");
         q = qm.createQuery(xpath, "xpath");
         it = q.execute().getNodes();
         result = it.getSize();
@@ -117,7 +120,8 @@ public class ResultSizeTest extends Abst
         }
         String regularResult = buff.toString();
         assertEquals(regularResult, fastSizeResult);
-
+        System.clearProperty("oak.fastQuerySize");
+        
     }
     
 }
\ No newline at end of file