Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/aggregate/AggregateIndexPlan.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/aggregate/AggregateIndexPlan.java (revision 1688442) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/aggregate/AggregateIndexPlan.java (working copy) @@ -202,4 +202,19 @@ return null; } + @Override + public String getPlanName() { + StringBuilder name = new StringBuilder(); + boolean first = true; + for (IndexPlan p : basePlans.values()) { + if (!first) { + name.append(","); + } else { + first = false; + } + name.append(p.getPlanName()); + } + return name.toString(); + } + } Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/aggregate/package-info.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/aggregate/package-info.java (revision 1688442) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/aggregate/package-info.java (working copy) @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@Version("1.0") +@Version("1.1.0") @Export(optional = "provide:=true") package org.apache.jackrabbit.oak.plugins.index.aggregate; Index: oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java (revision 1688442) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java (working copy) @@ -910,6 +910,7 @@ IndexPlan bestPlan = null; for (QueryIndex index : indexProvider.getQueryIndexes(rootState)) { double cost; + String indexName = index.getIndexName(); IndexPlan indexPlan = null; if (index instanceof AdvancedQueryIndex) { AdvancedQueryIndex advIndex = (AdvancedQueryIndex) index; @@ -957,6 +958,9 @@ double c = p.getCostPerExecution() + entryCount * p.getCostPerEntry(); if (c < cost) { cost = c; + if (p.getPlanName() != null) { + indexName += "[" + p.getPlanName() + "]"; + } indexPlan = p; } } @@ -964,10 +968,10 @@ cost = index.getCost(filter, rootState); } if (LOG.isDebugEnabled()) { - logDebug("cost for " + index.getIndexName() + " is " + cost); + logDebug("cost for " + indexName + " is " + cost); } if (cost < 0) { - LOG.error("cost below 0 for " + index.getIndexName() + " is " + cost); + LOG.error("cost below 0 for " + indexName + " is " + cost); } if (cost < bestCost) { bestCost = cost; Index: oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/QueryIndex.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/QueryIndex.java (revision 1688442) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/QueryIndex.java (working copy) @@ -307,8 +307,16 @@ */ @CheckForNull Object getAttribute(String name); - + /** + * Get the unique plan name. + * + * @return the plan name + */ + @CheckForNull + String getPlanName(); + + /** * A builder for index plans. */ public class Builder { @@ -325,6 +333,7 @@ protected PropertyRestriction propRestriction; protected String pathPrefix = "/"; protected Map attributes = Maps.newHashMap(); + protected String planName = null; public Builder setCostPerExecution(double costPerExecution) { this.costPerExecution = costPerExecution; @@ -386,6 +395,11 @@ return this; } + public Builder setPlanName(String name) { + this.planName = name; + return this; + } + public IndexPlan build() { return new IndexPlan() { @@ -416,6 +430,7 @@ Builder.this.pathPrefix; private final Map attributes = Builder.this.attributes; + private final String planName = Builder.this.planName; @Override public String toString() { @@ -523,6 +538,11 @@ public Object getAttribute(String name) { return attributes.get(name); } + + @Override + public String getPlanName(){ + return planName; + } }; } Index: oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/package-info.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/package-info.java (revision 1688442) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/package-info.java (working copy) @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@Version("2.0.0") +@Version("3.0.0") @Export(optional = "provide:=true") package org.apache.jackrabbit.oak.spi.query; Index: oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java =================================================================== --- oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java (revision 1688442) +++ oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java (working copy) @@ -346,7 +346,8 @@ .setPathPrefix(getPathPrefix()) .setDelayed(true) //Lucene is always async .setAttribute(LucenePropertyIndex.ATTR_PLAN_RESULT, result) - .setEstimatedEntryCount(estimatedEntryCount()); + .setEstimatedEntryCount(estimatedEntryCount()) + .setPlanName(indexPath); } private long estimatedEntryCount() {