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;


Reply via email to