Author: thomasm
Date: Mon Mar 17 13:32:13 2014
New Revision: 1578362
URL: http://svn.apache.org/r1578362
Log:
OAK-622 Improve QueryIndex interface (sort using index if possible) (WIP)
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/ast/SelectorImpl.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=1578362&r1=1578361&r2=1578362&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
Mon Mar 17 13:32:13 2014
@@ -72,6 +72,7 @@ import org.apache.jackrabbit.oak.spi.que
import org.apache.jackrabbit.oak.spi.query.QueryIndex.AdvancedQueryIndex;
import org.apache.jackrabbit.oak.spi.query.QueryIndex.IndexPlan;
import org.apache.jackrabbit.oak.spi.query.QueryIndex.OrderEntry;
+import org.apache.jackrabbit.oak.spi.query.QueryIndex.OrderEntry.Order;
import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.slf4j.Logger;
@@ -405,7 +406,45 @@ public class QueryImpl implements Query
LOG.debug("query plan {}", getPlan());
}
RowIterator rowIt = new RowIterator(context.getBaseState());
- Comparator<ResultRowImpl> orderBy =
ResultRowImpl.getComparator(orderings);
+ Comparator<ResultRowImpl> orderBy;
+ boolean sortUsingIndex = false;
+ if (selectors.size() == 1) {
+ IndexPlan plan =
selectors.get(0).getExecutionPlan().getIndexPlan();
+ if (plan != null) {
+ List<OrderEntry> list = plan.getSortOrder();
+ if (list != null && list.size() == orderings.length) {
+ sortUsingIndex = true;
+ for (int i = 0; i < list.size(); i++) {
+ OrderEntry e = list.get(i);
+ OrderingImpl o = orderings[i];
+ DynamicOperandImpl op = o.getOperand();
+ if (!(op instanceof PropertyValueImpl)) {
+ // ordered by a function: currently not supported
+ sortUsingIndex = false;
+ break;
+ }
+ // we only have one selector, so no need to check that
+ // TODO support joins
+ String pn = ((PropertyValueImpl) op).getPropertyName();
+ if (!pn.equals(e.getPropertyName())) {
+ // ordered by another property
+ sortUsingIndex = false;
+ break;
+ }
+ if (o.isDescending() != (e.getOrder() ==
Order.DESCENDING)) {
+ // ordered ascending versus descending
+ sortUsingIndex = false;
+ break;
+ }
+ }
+ }
+ }
+ }
+ if (sortUsingIndex) {
+ orderBy = null;
+ } else {
+ orderBy = ResultRowImpl.getComparator(orderings);
+ }
Iterator<ResultRowImpl> it =
FilterIterators.newCombinedFilter(rowIt, distinct, limit,
offset, orderBy);
if (measure) {
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=1578362&r1=1578361&r2=1578362&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
Mon Mar 17 13:32:13 2014
@@ -278,6 +278,10 @@ public class SelectorImpl extends Source
return plan;
}
+ public SelectorExecutionPlan getExecutionPlan() {
+ return plan;
+ }
+
@Override
public void setQueryConstraint(ConstraintImpl queryConstraint) {
this.queryConstraint = queryConstraint;