Author: thomasm
Date: Thu Mar 13 15:42:35 2014
New Revision: 1577206

URL: http://svn.apache.org/r1577206
Log:
OAK-622 Improve QueryIndex interface (use the AdvancedQueryIndex if available) 
(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/spi/query/QueryIndex.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=1577206&r1=1577205&r2=1577206&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 Mar 13 15:42:35 2014
@@ -24,6 +24,7 @@ import java.util.Set;
 
 import org.apache.jackrabbit.oak.api.PropertyValue;
 import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.namepath.JcrPathParser;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.query.ast.AndImpl;
@@ -36,6 +37,7 @@ import org.apache.jackrabbit.oak.query.a
 import org.apache.jackrabbit.oak.query.ast.ConstraintImpl;
 import org.apache.jackrabbit.oak.query.ast.DescendantNodeImpl;
 import org.apache.jackrabbit.oak.query.ast.DescendantNodeJoinConditionImpl;
+import org.apache.jackrabbit.oak.query.ast.DynamicOperandImpl;
 import org.apache.jackrabbit.oak.query.ast.EquiJoinConditionImpl;
 import org.apache.jackrabbit.oak.query.ast.FullTextSearchImpl;
 import org.apache.jackrabbit.oak.query.ast.FullTextSearchScoreImpl;
@@ -67,6 +69,9 @@ import org.apache.jackrabbit.oak.query.p
 import org.apache.jackrabbit.oak.spi.query.Filter;
 import org.apache.jackrabbit.oak.spi.query.PropertyValues;
 import org.apache.jackrabbit.oak.spi.query.QueryIndex;
+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.QueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.slf4j.Logger;
@@ -681,7 +686,7 @@ public class QueryImpl implements Query 
                 context.getIndexProvider(), traversalEnabled);
     }
 
-    private static SelectorExecutionPlan getBestSelectorExecutionPlan(
+    private SelectorExecutionPlan getBestSelectorExecutionPlan(
             NodeState rootState, FilterImpl filter,
             QueryIndexProvider indexProvider, boolean traversalEnabled) {
         QueryIndex best = null;
@@ -691,7 +696,57 @@ public class QueryImpl implements Query 
 
         double bestCost = Double.POSITIVE_INFINITY;
         for (QueryIndex index : indexProvider.getQueryIndexes(rootState)) {
-            double cost = index.getCost(filter, rootState);
+            double cost;
+            if (index instanceof AdvancedQueryIndex) {
+                AdvancedQueryIndex advIndex = (AdvancedQueryIndex) index;
+                List<OrderEntry> sortOrder = null;
+                if (orderings != null) {
+                    sortOrder = new ArrayList<OrderEntry>();
+                    for (OrderingImpl o : orderings) {
+                        DynamicOperandImpl op = o.getOperand();
+                        if (!(op instanceof PropertyValueImpl)) {
+                            // ordered by a function: currently not supported
+                            break;
+                        }
+                        PropertyValueImpl p = (PropertyValueImpl) op;
+                        SelectorImpl s = p.getSelectors().iterator().next();
+                        if (!s.equals(filter.getSelector())) {
+                            // ordered by a different selector
+                            continue;
+                        }
+                        OrderEntry e = new OrderEntry(
+                                p.getPropertyName(), 
+                                Type.UNDEFINED, 
+                                o.isDescending() ? 
+                                OrderEntry.Order.DESCENDING : 
OrderEntry.Order.ASCENDING);
+                        sortOrder.add(e);
+                    }
+                    if (sortOrder.size() == 0) {
+                        sortOrder = null;
+                    }
+                }
+                long maxEntryCount = limit;
+                if (offset > 0) {
+                    if (offset + limit < 0) {
+                        // long overflow
+                        maxEntryCount = Long.MAX_VALUE;
+                    } else {
+                        maxEntryCount = offset + limit;
+                    }
+                }
+                List<IndexPlan> ipList = advIndex.getPlans(
+                        filter, sortOrder, rootState);
+                cost = Double.POSITIVE_INFINITY;
+                for (IndexPlan p : ipList) {
+                    long entryCount = Math.min(maxEntryCount, 
p.getEstimatedEntryCount());
+                    double c = p.getCostPerExecution() + entryCount * 
p.getCostPerEntry();
+                    if (c < cost) {
+                        cost = c;
+                    }
+                }
+            } else {
+                cost = index.getCost(filter, rootState);
+            }
             if (LOG.isDebugEnabled()) {
                 LOG.debug("cost for " + index.getIndexName() + " is " + cost);
             }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/QueryIndex.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/QueryIndex.java?rev=1577206&r1=1577205&r2=1577206&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/QueryIndex.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/QueryIndex.java
 Thu Mar 13 15:42:35 2014
@@ -384,7 +384,7 @@ public interface QueryIndex {
         
         private final Order order;
         
-        OrderEntry(String propertyName, Type<?> propertyType, Order order) {
+        public OrderEntry(String propertyName, Type<?> propertyType, Order 
order) {
             this.propertyName = propertyName;
             this.propertyType = propertyType;
             this.order = order;


Reply via email to