Index: oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java (revision 1665255) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java (revision ) @@ -21,6 +21,7 @@ import java.util.Iterator; import java.util.List; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import org.apache.jackrabbit.oak.api.PropertyValue; import org.apache.jackrabbit.oak.api.Tree; @@ -794,9 +795,20 @@ context.getIndexProvider(), traversalEnabled); } + private static final ConcurrentHashMap sepCache = new ConcurrentHashMap(); + private SelectorExecutionPlan getBestSelectorExecutionPlan( NodeState rootState, FilterImpl filter, QueryIndexProvider indexProvider, boolean traversalEnabled) { + + String query = filter.getQueryStatement(); + if (query != null) { + SelectorExecutionPlan sep = sepCache.get(query); + if (sep != null) { + return new SelectorExecutionPlan(sep.getSelector(), sep.getIndex(), sep.getIndexPlan(), sep.getEstimatedCost()); + } + } + QueryIndex bestIndex = null; if (LOG.isDebugEnabled()) { logDebug("cost using filter " + filter); @@ -884,7 +896,12 @@ bestIndex = traversal; } } - return new SelectorExecutionPlan(filter.getSelector(), bestIndex, bestPlan, bestCost); + + SelectorExecutionPlan sep = new SelectorExecutionPlan(filter.getSelector(), bestIndex, bestPlan, bestCost); + if (query != null) { + sepCache.put(query, sep); + } + return sep; } private void logDebug(String msg) {