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