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 mr...@apache.org on 2012/10/31 13:36:14 UTC
svn commit: r1404114 -
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
Author: mreutegg
Date: Wed Oct 31 12:36:13 2012
New Revision: 1404114
URL: http://svn.apache.org/viewvc?rev=1404114&view=rev
Log:
OAK-325: QueryEngine can't handle node type hierarchies
- evaluate type hierarchy only once per query
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
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=1404114&r1=1404113&r2=1404114&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 Wed Oct 31 12:36:13 2012
@@ -20,6 +20,8 @@ package org.apache.jackrabbit.oak.query.
import static org.apache.jackrabbit.oak.api.Type.STRINGS;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Set;
import javax.annotation.CheckForNull;
@@ -56,6 +58,10 @@ public class SelectorImpl extends Source
private final String nodeTypeName, selectorName;
private Cursor cursor;
private int scanCount;
+ /**
+ * Iterable over selected node type and its subtypes
+ */
+ private Iterable<NodeType> nodeTypes;
/**
* The selector condition can be evaluated when the given selector is
@@ -160,23 +166,8 @@ public class SelectorImpl extends Source
Set<String> mixins =
getStrings(tree, JcrConstants.JCR_MIXINTYPES);
- // TODO: Should retrieve matching node types only once per query
- // execution instead of again and again for each return row
- NodeTypeManager manager = new ReadOnlyNodeTypeManager() {
- @Override @CheckForNull
- protected Tree getTypes() {
- return getTree(NodeTypeConstants.NODE_TYPES_PATH);
- }
- };
-
try {
- NodeType type = manager.getNodeType(nodeTypeName);
- if (evaluateTypeMatch(type, primary, mixins)) {
- return true;
- }
- NodeTypeIterator iterator = type.getSubtypes();
- while (iterator.hasNext()) {
- type = iterator.nextNodeType();
+ for (NodeType type : getNodeTypes()) {
if (evaluateTypeMatch(type, primary, mixins)) {
return true;
}
@@ -274,4 +265,24 @@ public class SelectorImpl extends Source
}
}
+ private Iterable<NodeType> getNodeTypes() throws RepositoryException {
+ if (nodeTypes == null) {
+ List<NodeType> types = new ArrayList<NodeType>();
+ NodeTypeManager manager = new ReadOnlyNodeTypeManager() {
+ @Override @CheckForNull
+ protected Tree getTypes() {
+ return getTree(NodeTypeConstants.NODE_TYPES_PATH);
+ }
+ };
+ NodeType type = manager.getNodeType(nodeTypeName);
+ types.add(type);
+
+ NodeTypeIterator it = type.getSubtypes();
+ while (it.hasNext()) {
+ types.add(it.nextNodeType());
+ }
+ nodeTypes = types;
+ }
+ return nodeTypes;
+ }
}