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 2018/04/05 09:20:56 UTC
svn commit: r1828405 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query:
QueryImpl.java UnionQueryImpl.java ast/JoinImpl.java ast/SelectorImpl.java
ast/SourceImpl.java
Author: thomasm
Date: Thu Apr 5 09:20:55 2018
New Revision: 1828405
URL: http://svn.apache.org/viewvc?rev=1828405&view=rev
Log:
OAK-7390 QueryResult.getSize() can be slow for many or or union conditions
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/UnionQueryImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/JoinImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SourceImpl.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=1828405&r1=1828404&r2=1828405&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 Thu Apr 5 09:20:55 2018
@@ -1261,7 +1261,7 @@ public class QueryImpl implements Query
// "order by" was used, so we know the size
return size;
}
- return Math.min(limit, source.getSize(precision, max));
+ return Math.min(limit, source.getSize(context.getBaseState(), precision, max));
}
@Override
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/UnionQueryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/UnionQueryImpl.java?rev=1828405&r1=1828404&r2=1828405&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/UnionQueryImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/UnionQueryImpl.java Thu Apr 5 09:20:55 2018
@@ -173,14 +173,15 @@ public class UnionQueryImpl implements Q
public long getSize(SizePrecision precision, long max) {
// Note: for "unionAll == false", overlapping entries are counted twice
// (this can result in a larger reported size, but it is not a security problem)
-
- // ensure the queries are both executed, otherwise the cursor is not set,
- // and so the size would be -1
- left.executeQuery().getRows().iterator().hasNext();
- right.executeQuery().getRows().iterator().hasNext();
long a = left.getSize(precision, max);
+ if (a < 0) {
+ return -1;
+ }
+ if (a >= limit) {
+ return limit;
+ }
long b = right.getSize(precision, max);
- if (a < 0 || b < 0) {
+ if (b < 0) {
return -1;
}
long total = QueryImpl.saturatedAdd(a, b);
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/JoinImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/JoinImpl.java?rev=1828405&r1=1828404&r2=1828405&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/JoinImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/JoinImpl.java Thu Apr 5 09:20:55 2018
@@ -281,7 +281,7 @@ public class JoinImpl extends SourceImpl
}
@Override
- public long getSize(SizePrecision precision, long max) {
+ public long getSize(NodeState rootState, SizePrecision precision, long max) {
// we don't know
return -1;
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java?rev=1828405&r1=1828404&r2=1828405&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java Thu Apr 5 09:20:55 2018
@@ -806,9 +806,9 @@ public class SelectorImpl extends Source
}
@Override
- public long getSize(SizePrecision precision, long max) {
+ public long getSize(NodeState rootState, SizePrecision precision, long max) {
if (cursor == null) {
- return -1;
+ execute(rootState);
}
return cursor.getSize(precision, max);
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SourceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SourceImpl.java?rev=1828405&r1=1828404&r2=1828405&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SourceImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SourceImpl.java Thu Apr 5 09:20:55 2018
@@ -165,9 +165,10 @@ public abstract class SourceImpl extends
/**
* Get the size if known.
*
+ * @param rootState the root node state (to initialize the cursor, if needed)
* @param precision the required precision
* @param max the maximum nodes read (for an exact size)
* @return the size, or -1 if unknown
*/
- public abstract long getSize(SizePrecision precision, long max);
+ public abstract long getSize(NodeState rootState, SizePrecision precision, long max);
}