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() {