diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java index a6cfb15aad..6b089e5999 100644 --- a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java +++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java @@ -152,7 +152,9 @@ public class SelectorImpl extends SourceImpl { private Cursor cursor; private IndexRow currentRow; private int scanCount; - + private int processedResults; + private boolean processingComplete; + private Tree lastTree; private String lastPath; @@ -309,18 +311,22 @@ public class SelectorImpl extends SourceImpl { @Override public void execute(NodeState rootState) { - QueryIndex index = plan.getIndex(); - if (index == null) { - cursor = Cursors.newPathCursor(new ArrayList(), query.getSettings()); - return; - } - IndexPlan p = plan.getIndexPlan(); - if (p != null) { - p.setFilter(createFilter(false)); - AdvancedQueryIndex adv = (AdvancedQueryIndex) index; - cursor = adv.query(p, rootState); - } else { - cursor = index.query(createFilter(false), rootState); + try { + QueryIndex index = plan.getIndex(); + if (index == null) { + cursor = Cursors.newPathCursor(new ArrayList(), query.getSettings()); + return; + } + IndexPlan p = plan.getIndexPlan(); + if (p != null) { + p.setFilter(createFilter(false)); + AdvancedQueryIndex adv = (AdvancedQueryIndex) index; + cursor = adv.query(p, rootState); + } else { + cursor = index.query(createFilter(false), rootState); + } + } finally { + processedResults = 0; } } @@ -432,6 +438,9 @@ public class SelectorImpl extends SourceImpl { // correct results } else if (currentRow.isVirtualRow()) { // this is a virtual row and should be selected as is + if (!processingComplete) { + processedResults++; + } return true; } else { // we must check whether the _child_ is readable @@ -449,9 +458,15 @@ public class SelectorImpl extends SourceImpl { } } if (evaluateCurrentRow()) { + if (!processingComplete) { + processedResults++; + } return true; } } + if (cursor != null) { + processingComplete = true; + } cursor = null; currentRow = null; return false; @@ -789,10 +804,7 @@ public class SelectorImpl extends SourceImpl { @Override public long getSize(SizePrecision precision, long max) { - if (cursor == null) { - return -1; - } - return cursor.getSize(precision, max); + return processingComplete ? processedResults : cursor == null ? -1 : cursor.getSize(precision, max); } @Override