Index: plugins/index/reference/ReferenceIndexProvider.java =================================================================== --- plugins/index/reference/ReferenceIndexProvider.java (revision 1673707) +++ plugins/index/reference/ReferenceIndexProvider.java (working copy) @@ -21,11 +21,13 @@ import javax.annotation.Nonnull; import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.Properties; +import org.apache.felix.scr.annotations.Property; import org.apache.felix.scr.annotations.Service; import org.apache.jackrabbit.oak.spi.query.QueryIndex; import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider; import org.apache.jackrabbit.oak.spi.state.NodeState; - +import org.osgi.framework.Constants; import com.google.common.collect.ImmutableList; /** @@ -33,6 +35,12 @@ */ @Component @Service(QueryIndexProvider.class) +@Properties({ + @Property(name=Constants.SERVICE_RANKING, + intValue=-50, + propertyPrivate=false, + label="Ranking") +}) public class ReferenceIndexProvider implements QueryIndexProvider { @Override Index: query/QueryImpl.java =================================================================== --- query/QueryImpl.java (revision 1673707) +++ query/QueryImpl.java (working copy) @@ -802,6 +802,7 @@ logDebug("cost using filter " + filter); } + double minCost = 1.0; double bestCost = Double.POSITIVE_INFINITY; IndexPlan bestPlan = null; for (QueryIndex index : indexProvider.getQueryIndexes(rootState)) { @@ -870,9 +871,13 @@ bestIndex = index; bestPlan = indexPlan; } + if (bestCost <= minCost) { + LOG.debug("minimum cost achieved, skipped remaining indexes"); + break; + } } - if (traversalEnabled) { + if (bestCost > minCost && traversalEnabled) { QueryIndex traversal = new TraversingIndex(); double cost = traversal.getCost(filter, rootState); if (LOG.isDebugEnabled()) {