You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by md...@apache.org on 2013/10/15 11:34:33 UTC
svn commit: r1532263 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/core/
main/java/org/apache/jackrabbit/oak/query/
test/java/org/apache/jackrabbit/oak/query/
Author: mduerig
Date: Tue Oct 15 09:34:32 2013
New Revision: 1532263
URL: http://svn.apache.org/r1532263
Log:
OAK-1052: Introduce execution context for executing queries
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ExecutionContext.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ImmutableRoot.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java
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/UnionQueryImpl.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java?rev=1532263&r1=1532262&r2=1532263&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java Tue Oct 15 09:34:32 2013
@@ -38,9 +38,9 @@ import org.apache.jackrabbit.oak.api.Blo
import org.apache.jackrabbit.oak.api.CommitFailedException;
import org.apache.jackrabbit.oak.api.QueryEngine;
import org.apache.jackrabbit.oak.api.Root;
-import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.plugins.index.diffindex.UUIDDiffIndexProviderWrapper;
+import org.apache.jackrabbit.oak.query.ExecutionContext;
import org.apache.jackrabbit.oak.query.QueryEngineImpl;
import org.apache.jackrabbit.oak.spi.commit.CommitHook;
import org.apache.jackrabbit.oak.spi.commit.CompositeEditorProvider;
@@ -304,18 +304,19 @@ public abstract class AbstractRoot imple
@Override
public QueryEngine getQueryEngine() {
checkLive();
- return new QueryEngineImpl(getIndexProvider()) {
-
+ return new QueryEngineImpl() {
@Override
- protected NodeState getRootState() {
- return AbstractRoot.this.getRootState();
+ protected ExecutionContext getExecutionContext() {
+ NodeState rootState = AbstractRoot.this.getRootState();
+ return new ExecutionContext(rootState, rootTree, getIndexProvider(rootState));
}
- @Override
- protected Tree getRootTree() {
- return rootTree;
+ private QueryIndexProvider getIndexProvider(NodeState rootState) {
+ if (hasPendingChanges()) {
+ return new UUIDDiffIndexProviderWrapper(indexProvider, getBaseState(), rootState);
+ }
+ return indexProvider;
}
-
};
}
@@ -333,15 +334,6 @@ public abstract class AbstractRoot imple
};
}
- @Nonnull
- private QueryIndexProvider getIndexProvider() {
- if (hasPendingChanges()) {
- return new UUIDDiffIndexProviderWrapper(indexProvider,
- getBaseState(), getRootState());
- }
- return indexProvider;
- }
-
//-----------------------------------------------------------< internal >---
/**
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ImmutableRoot.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ImmutableRoot.java?rev=1532263&r1=1532262&r2=1532263&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ImmutableRoot.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ImmutableRoot.java Tue Oct 15 09:34:32 2013
@@ -27,9 +27,9 @@ import org.apache.jackrabbit.oak.api.Blo
import org.apache.jackrabbit.oak.api.ContentSession;
import org.apache.jackrabbit.oak.api.QueryEngine;
import org.apache.jackrabbit.oak.api.Root;
-import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexProvider;
+import org.apache.jackrabbit.oak.query.ExecutionContext;
import org.apache.jackrabbit.oak.query.QueryEngineImpl;
import org.apache.jackrabbit.oak.spi.commit.CommitHook;
import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -104,15 +104,10 @@ public final class ImmutableRoot impleme
@Nonnull
@Override
public QueryEngine getQueryEngine() {
- return new QueryEngineImpl(new PropertyIndexProvider()) {
+ return new QueryEngineImpl() {
@Override
- protected NodeState getRootState() {
- return rootTree.state;
- }
-
- @Override
- protected Tree getRootTree() {
- return rootTree;
+ protected ExecutionContext getExecutionContext() {
+ return new ExecutionContext(rootTree.state, rootTree, new PropertyIndexProvider());
}
};
}
Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ExecutionContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ExecutionContext.java?rev=1532263&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ExecutionContext.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ExecutionContext.java Tue Oct 15 09:34:32 2013
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.query;
+
+import javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+
+/**
+ * An instance of this class provides the context for the execution of a query,
+ * which in essence captures a stable state of the content tree from the time
+ * the execution context was created.
+ */
+public class ExecutionContext {
+ private final NodeState rootState;
+ private final Tree rootTree;
+ private final QueryIndexProvider indexProvider;
+
+ public ExecutionContext(NodeState rootState, Tree rootTree,
+ QueryIndexProvider indexProvider) {
+
+ this.rootState = rootState;
+ this.rootTree = rootTree;
+ this.indexProvider = indexProvider;
+ }
+
+ /**
+ * @return Root node state of the content tree against which the query runs.
+ */
+ @Nonnull
+ public NodeState getRootState() {
+ return rootState;
+ }
+
+ /**
+ * @return Root tree of the content tree against which the query runs.
+ */
+ @Nonnull
+ public Tree getRootTree() {
+ return rootTree;
+ }
+
+ /**
+ * @return Index provider for indexes matching the state of the content tree as
+ * returned from {@link #getRootState()}.
+ */
+ @Nonnull
+ public QueryIndexProvider getIndexProvider() {
+ return indexProvider;
+ }
+}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java?rev=1532263&r1=1532262&r2=1532263&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java Tue Oct 15 09:34:32 2013
@@ -22,6 +22,7 @@ import org.apache.jackrabbit.oak.api.Tre
import org.apache.jackrabbit.oak.namepath.NamePathMapper;
import org.apache.jackrabbit.oak.query.ast.ColumnImpl;
import org.apache.jackrabbit.oak.query.ast.OrderingImpl;
+import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
import org.apache.jackrabbit.oak.spi.state.NodeState;
/**
@@ -45,7 +46,7 @@ public interface Query {
void bindValue(String key, PropertyValue value);
- void setQueryEngine(QueryEngineImpl queryEngineImpl);
+ void setIndexProvider(QueryIndexProvider indexProvider);
void prepare();
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java?rev=1532263&r1=1532262&r2=1532263&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java Tue Oct 15 09:34:32 2013
@@ -24,13 +24,14 @@ import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import java.util.Map.Entry;
+import java.util.Set;
+
+import javax.annotation.Nonnull;
import org.apache.jackrabbit.oak.api.PropertyValue;
import org.apache.jackrabbit.oak.api.QueryEngine;
import org.apache.jackrabbit.oak.api.Result;
-import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.namepath.NamePathMapper;
import org.apache.jackrabbit.oak.query.index.TraversingIndex;
import org.apache.jackrabbit.oak.spi.query.Filter;
@@ -60,8 +61,6 @@ public abstract class QueryEngineImpl im
XPATH, XPATH + NO_LITERALS,
JQOM);
- private final QueryIndexProvider indexProvider;
-
/**
* Whether fallback to the traversing index is supported if no other index
* is available. This is enabled by default and can be disabled for testing
@@ -69,23 +68,10 @@ public abstract class QueryEngineImpl im
*/
private boolean traversalFallback = true;
- public QueryEngineImpl(QueryIndexProvider indexProvider) {
- this.indexProvider = indexProvider;
- }
-
- /**
- * Get the current root node state, to run the query against.
- *
- * @return the node state
- */
- protected abstract NodeState getRootState();
-
/**
- * Get the current root tree, to run the query against.
- *
- * @return the node state
+ * @return Execution context for a single query execution.
*/
- protected abstract Tree getRootTree();
+ protected abstract ExecutionContext getExecutionContext();
@Override
public Set<String> getSupportedQueryLanguages() {
@@ -102,13 +88,13 @@ public abstract class QueryEngineImpl im
*/
@Override
public List<String> getBindVariableNames(String statement, String language) throws ParseException {
- Query q = parseQuery(statement, language);
+ Query q = parseQuery(statement, language, getExecutionContext());
return q.getBindVariableNames();
}
- private Query parseQuery(String statement, String language) throws ParseException {
+ private static Query parseQuery(String statement, String language, ExecutionContext context) throws ParseException {
LOG.debug("Parsing {} statement: {}", language, statement);
- NodeState root = getRootState();
+ NodeState root = context.getRootState();
NodeState system = root.getChildNode(JCR_SYSTEM);
NodeState types = system.getChildNode(JCR_NODE_TYPES);
SQL2Parser parser = new SQL2Parser(types);
@@ -146,9 +132,11 @@ public abstract class QueryEngineImpl im
if (offset < 0) {
throw new IllegalArgumentException("Offset may not be negative, is: " + offset);
}
- Query q = parseQuery(statement, language);
- q.setRootTree(getRootTree());
- q.setRootState(getRootState());
+
+ ExecutionContext context = getExecutionContext();
+ Query q = parseQuery(statement, language, context);
+ q.setRootTree(context.getRootTree());
+ q.setRootState(context.getRootState());
q.setNamePathMapper(namePathMapper);
q.setLimit(limit);
q.setOffset(offset);
@@ -157,28 +145,41 @@ public abstract class QueryEngineImpl im
q.bindValue(e.getKey(), e.getValue());
}
}
- q.setQueryEngine(this);
+ q.setIndexProvider(getIndexProvider(context.getIndexProvider(), traversalFallback));
q.prepare();
return q.executeQuery();
}
- protected void setTravesalFallback(boolean traversal) {
+ private static QueryIndexProvider getIndexProvider(final QueryIndexProvider indexProvider,
+ boolean traversalFallback) {
+ if (traversalFallback) {
+ return new QueryIndexProvider() {
+ @Nonnull
+ @Override
+ public List<? extends QueryIndex> getQueryIndexes(NodeState nodeState) {
+ List<QueryIndex> indexes = new ArrayList<QueryIndex>(indexProvider.getQueryIndexes(nodeState));
+ indexes.add(new TraversingIndex());
+ return indexes;
+ }
+ };
+ } else {
+ return indexProvider;
+ }
+ }
+
+ protected void setTraversalFallback(boolean traversal) {
this.traversalFallback = traversal;
}
- public QueryIndex getBestIndex(QueryImpl query, NodeState rootState, Filter filter) {
+ public static QueryIndex getBestIndex(QueryImpl query, NodeState rootState, Filter filter,
+ QueryIndexProvider indexProvider) {
QueryIndex best = null;
if (LOG.isDebugEnabled()) {
LOG.debug("cost using filter " + filter);
}
- List<QueryIndex> indexes = new ArrayList<QueryIndex>(
- indexProvider.getQueryIndexes(rootState));
- if (traversalFallback) {
- indexes.add(new TraversingIndex());
- }
double bestCost = Double.POSITIVE_INFINITY;
- for (QueryIndex index : indexes) {
+ for (QueryIndex index : indexProvider.getQueryIndexes(rootState)) {
double cost = index.getCost(filter, rootState);
if (LOG.isDebugEnabled()) {
LOG.debug("cost for " + index.getIndexName() + " is " + cost);
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=1532263&r1=1532262&r2=1532263&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 Tue Oct 15 09:34:32 2013
@@ -58,6 +58,7 @@ import org.apache.jackrabbit.oak.query.a
import org.apache.jackrabbit.oak.spi.query.Filter;
import org.apache.jackrabbit.oak.spi.query.PropertyValues;
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.apache.jackrabbit.oak.util.TreeUtil;
import org.slf4j.Logger;
@@ -93,7 +94,7 @@ public class QueryImpl implements Query
final ArrayList<SelectorImpl> selectors = new ArrayList<SelectorImpl>();
ConstraintImpl constraint;
- private QueryEngineImpl queryEngine;
+ private QueryIndexProvider indexProvider;
private OrderingImpl[] orderings;
private ColumnImpl[] columns;
private boolean explain, measure;
@@ -571,12 +572,12 @@ public class QueryImpl implements Query
}
@Override
- public void setQueryEngine(QueryEngineImpl queryEngine) {
- this.queryEngine = queryEngine;
+ public void setIndexProvider(QueryIndexProvider indexProvider) {
+ this.indexProvider = indexProvider;
}
public QueryIndex getBestIndex(Filter filter) {
- return queryEngine.getBestIndex(this, rootState, filter);
+ return QueryEngineImpl.getBestIndex(this, rootState, filter, indexProvider);
}
@Override
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/UnionQueryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/UnionQueryImpl.java?rev=1532263&r1=1532262&r2=1532263&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/UnionQueryImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/UnionQueryImpl.java Tue Oct 15 09:34:32 2013
@@ -20,6 +20,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import com.google.common.collect.Iterators;
import org.apache.jackrabbit.oak.api.PropertyValue;
import org.apache.jackrabbit.oak.api.Result;
import org.apache.jackrabbit.oak.api.Tree;
@@ -27,12 +28,11 @@ import org.apache.jackrabbit.oak.namepat
import org.apache.jackrabbit.oak.query.ast.ColumnImpl;
import org.apache.jackrabbit.oak.query.ast.OrderingImpl;
import org.apache.jackrabbit.oak.spi.query.PropertyValues;
+import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.common.collect.Iterators;
-
/**
* Represents a union query.
*/
@@ -110,9 +110,9 @@ public class UnionQueryImpl implements Q
}
@Override
- public void setQueryEngine(QueryEngineImpl queryEngineImpl) {
- left.setQueryEngine(queryEngineImpl);
- right.setQueryEngine(queryEngineImpl);
+ public void setIndexProvider(QueryIndexProvider indexProvider) {
+ left.setIndexProvider(indexProvider);
+ right.setIndexProvider(indexProvider);
}
@Override
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java?rev=1532263&r1=1532262&r2=1532263&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java Tue Oct 15 09:34:32 2013
@@ -16,6 +16,15 @@
*/
package org.apache.jackrabbit.oak.query;
+import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
+import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NODE_TYPE;
+import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.REINDEX_PROPERTY_NAME;
+import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.TYPE_PROPERTY_NAME;
+import static org.apache.jackrabbit.oak.plugins.memory.PropertyStates.createProperty;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -31,6 +40,7 @@ import java.util.Map;
import javax.jcr.PropertyType;
+import com.google.common.collect.Lists;
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.mk.json.JsopReader;
import org.apache.jackrabbit.mk.json.JsopTokenizer;
@@ -38,10 +48,10 @@ import org.apache.jackrabbit.oak.api.Con
import org.apache.jackrabbit.oak.api.ContentSession;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.PropertyValue;
+import org.apache.jackrabbit.oak.api.QueryEngine;
import org.apache.jackrabbit.oak.api.Result;
import org.apache.jackrabbit.oak.api.ResultRow;
import org.apache.jackrabbit.oak.api.Root;
-import org.apache.jackrabbit.oak.api.QueryEngine;
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.api.Type;
import org.apache.jackrabbit.oak.commons.PathUtils;
@@ -51,17 +61,6 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.plugins.value.Conversions;
import org.junit.Before;
-import com.google.common.collect.Lists;
-
-import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
-import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NODE_TYPE;
-import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.REINDEX_PROPERTY_NAME;
-import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.TYPE_PROPERTY_NAME;
-import static org.apache.jackrabbit.oak.plugins.memory.PropertyStates.createProperty;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
/**
* AbstractQueryTest...
*/
@@ -262,7 +261,7 @@ public abstract class AbstractQueryTest
}
protected void setTravesalFallback(boolean traversal) {
- ((QueryEngineImpl) qe).setTravesalFallback(traversal);
+ ((QueryEngineImpl) qe).setTraversalFallback(traversal);
}
protected static String readRow(ResultRow row, boolean pathOnly) {