Author: thomasm
Date: Mon Mar 17 10:00:13 2014
New Revision: 1578285

URL: http://svn.apache.org/r1578285
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/query/ast/SelectorImpl.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/plan/SelectorExecutionPlan.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=1578285&r1=1578284&r2=1578285&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 10:00:13 2014
@@ -689,14 +689,16 @@ public class QueryImpl implements Query 
     private SelectorExecutionPlan getBestSelectorExecutionPlan(
             NodeState rootState, FilterImpl filter,
             QueryIndexProvider indexProvider, boolean traversalEnabled) {
-        QueryIndex best = null;
+        QueryIndex bestIndex = null;
         if (LOG.isDebugEnabled()) {
             LOG.debug("cost using filter " + filter);
         }
 
         double bestCost = Double.POSITIVE_INFINITY;
+        IndexPlan bestPlan = null;
         for (QueryIndex index : indexProvider.getQueryIndexes(rootState)) {
             double cost;
+            IndexPlan indexPlan = null;
             if (index instanceof AdvancedQueryIndex) {
                 AdvancedQueryIndex advIndex = (AdvancedQueryIndex) index;
                 List<OrderEntry> sortOrder = null;
@@ -742,6 +744,7 @@ public class QueryImpl implements Query 
                     double c = p.getCostPerExecution() + entryCount * 
p.getCostPerEntry();
                     if (c < cost) {
                         cost = c;
+                        indexPlan = p;
                     }
                 }
             } else {
@@ -752,7 +755,8 @@ public class QueryImpl implements Query 
             }
             if (cost < bestCost) {
                 bestCost = cost;
-                best = index;
+                bestIndex = index;
+                bestPlan = indexPlan;
             }
         }
 
@@ -761,10 +765,10 @@ public class QueryImpl implements Query 
             double cost = traversal.getCost(filter, rootState);
             if (cost < bestCost || bestCost == Double.POSITIVE_INFINITY) {
                 bestCost = cost;
-                best = traversal;
+                bestIndex = traversal;
             }
         }
-        return new SelectorExecutionPlan(filter.getSelector(), best, bestCost);
+        return new SelectorExecutionPlan(filter.getSelector(), bestIndex, 
bestPlan, bestCost);
     }
 
     @Override

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=1578285&r1=1578284&r2=1578285&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 10:00:13 2014
@@ -52,6 +52,8 @@ import org.apache.jackrabbit.oak.spi.que
 import org.apache.jackrabbit.oak.spi.query.IndexRow;
 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.state.NodeState;
 
 import com.google.common.collect.ImmutableSet;
@@ -300,10 +302,18 @@ public class SelectorImpl extends Source
 
     @Override
     public void execute(NodeState rootState) {
-        if (plan.getIndex() != null) {
-            cursor = plan.getIndex().query(createFilter(false), rootState);
-        } else {
+        QueryIndex index = plan.getIndex();
+        if (index == null) {
             cursor = Cursors.newPathCursor(new ArrayList<String>());
+            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);
         }
     }
 

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/plan/SelectorExecutionPlan.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/plan/SelectorExecutionPlan.java?rev=1578285&r1=1578284&r2=1578285&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/plan/SelectorExecutionPlan.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/plan/SelectorExecutionPlan.java
 Mon Mar 17 10:00:13 2014
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.query.
 
 import org.apache.jackrabbit.oak.query.ast.SelectorImpl;
 import org.apache.jackrabbit.oak.spi.query.QueryIndex;
+import org.apache.jackrabbit.oak.spi.query.QueryIndex.IndexPlan;
 
 /**
  * An execution plan for one selector in a query. The conditions of the given
@@ -30,11 +31,13 @@ public class SelectorExecutionPlan imple
     private final SelectorImpl selector;
     private final double estimatedCost;
     private final QueryIndex index;
+    private final IndexPlan plan;
 
-    public SelectorExecutionPlan(SelectorImpl selector, QueryIndex index, 
double estimatedCost) {
+    public SelectorExecutionPlan(SelectorImpl selector, QueryIndex index, 
IndexPlan plan, double estimatedCost) {
         this.selector = selector;
         this.index = index;
         this.estimatedCost = estimatedCost;
+        this.plan = plan;
     }
     
     @Override
@@ -49,5 +52,9 @@ public class SelectorExecutionPlan imple
     public QueryIndex getIndex() {
         return index;
     }
+    
+    public IndexPlan getIndexPlan() {
+        return plan;
+    }
 
 }

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=1578285&r1=1578284&r2=1578285&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
 Mon Mar 17 10:00:13 2014
@@ -206,6 +206,11 @@ public interface QueryIndex {
          * @return the filter
          */
         Filter getFilter();
+        
+        /**
+         * Use the given filter.
+         */
+        void setFilter(Filter filter);
 
         /**
          * Whether the index is not always up-to-date.
@@ -302,7 +307,7 @@ public interface QueryIndex {
                             Builder.this.costPerEntry;
                     private final long estimatedEntryCount = 
                             Builder.this.estimatedEntryCount;
-                    private final Filter filter = 
+                    private Filter filter = 
                             Builder.this.filter;
                     private final boolean isDelayed = 
                             Builder.this.isDelayed;
@@ -334,6 +339,11 @@ public interface QueryIndex {
                     public Filter getFilter() {
                         return filter;
                     }
+                    
+                    @Override
+                    public void setFilter(Filter filter) {
+                        this.filter = filter;
+                    }
 
                     @Override
                     public boolean isDelayed() {


Reply via email to