You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/10/20 18:55:27 UTC
svn commit: r1025644 - in
/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene:
LuceneQueryFactory.java join/ChildNodeJoinMerger.java
join/DescendantNodeJoinMerger.java join/JoinMerger.java
join/SameNodeJoinMerger.java
Author: jukka
Date: Wed Oct 20 16:55:27 2010
New Revision: 1025644
URL: http://svn.apache.org/viewvc?rev=1025644&view=rev
Log:
JCR-2715: Improved join query performance
Implement also same, child and descendant node join conditions.
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryFactory.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/ChildNodeJoinMerger.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/DescendantNodeJoinMerger.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinMerger.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SameNodeJoinMerger.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryFactory.java?rev=1025644&r1=1025643&r2=1025644&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryFactory.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryFactory.java Wed Oct 20 16:55:27 2010
@@ -22,7 +22,6 @@ import static org.apache.jackrabbit.spi.
import static org.apache.lucene.search.BooleanClause.Occur.SHOULD;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -33,22 +32,18 @@ import javax.jcr.nodetype.NodeTypeIterat
import javax.jcr.nodetype.NodeTypeManager;
import javax.jcr.query.InvalidQueryException;
import javax.jcr.query.qom.Literal;
-import javax.jcr.query.qom.Selector;
import javax.jcr.query.qom.StaticOperand;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
-import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
import org.apache.jackrabbit.core.HierarchyManager;
import org.apache.jackrabbit.core.SessionImpl;
import org.apache.jackrabbit.spi.Name;
-import org.apache.jackrabbit.spi.commons.conversion.IllegalNameException;
import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
-import org.apache.jackrabbit.spi.commons.name.NameConstants;
import org.apache.jackrabbit.spi.commons.query.qom.BindVariableValueImpl;
import org.apache.jackrabbit.spi.commons.query.qom.DefaultQOMTreeVisitor;
import org.apache.jackrabbit.spi.commons.query.qom.JoinConditionImpl;
@@ -150,26 +145,9 @@ public class LuceneQueryFactory {
* @throws RepositoryException if an error occurs while creating the query.
*/
public Query create(SelectorImpl selector) throws RepositoryException {
- return create(ntManager.getNodeType(selector.getNodeTypeName()));
- }
-
- private Term createNodeTypeTerm(NodeType type) throws RepositoryException {
- String field;
- if (type.isMixin()) {
- // search for nodes where jcr:mixinTypes is set to this mixin
- field = mixinTypesField;
- } else {
- // search for nodes where jcr:primaryType is set to this type
- field = primaryTypeField;
- }
- String name = nsMappings.translateName(session.getQName(type.getName()));
- return new Term(PROPERTIES, FieldNames.createNamedValue(field, name));
- }
-
- private Query create(NodeType type) throws RepositoryException {
List<Term> terms = new ArrayList<Term>();
- String name = type.getName();
+ String name = selector.getNodeTypeName();
NodeTypeIterator allTypes = ntManager.getAllNodeTypes();
while (allTypes.hasNext()) {
NodeType nt = allTypes.nextNodeType();
@@ -189,6 +167,19 @@ public class LuceneQueryFactory {
}
}
+ private Term createNodeTypeTerm(NodeType type) throws RepositoryException {
+ String field;
+ if (type.isMixin()) {
+ // search for nodes where jcr:mixinTypes is set to this mixin
+ field = mixinTypesField;
+ } else {
+ // search for nodes where jcr:primaryType is set to this type
+ field = primaryTypeField;
+ }
+ String name = nsMappings.translateName(session.getQName(type.getName()));
+ return new Term(PROPERTIES, FieldNames.createNamedValue(field, name));
+ }
+
/**
* Creates a lucene query for the given QOM full text search.
*
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/ChildNodeJoinMerger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/ChildNodeJoinMerger.java?rev=1025644&r1=1025643&r2=1025644&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/ChildNodeJoinMerger.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/ChildNodeJoinMerger.java Wed Oct 20 16:55:27 2010
@@ -16,7 +16,9 @@
*/
package org.apache.jackrabbit.core.query.lucene.join;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -59,8 +61,20 @@ class ChildNodeJoinMerger extends JoinMe
@Override
public List<Constraint> getRightJoinConstraints(List<Row> leftRows)
throws RepositoryException {
- // TODO Auto-generated method stub
- return Collections.emptyList();
+ Set<String> paths = new HashSet<String>();
+ for (Row row : leftRows) {
+ paths.addAll(getLeftValues(row));
+ }
+
+ List<Constraint> constraints = new ArrayList<Constraint>();
+ for (String path: paths) {
+ if (rightSelectors.contains(childSelector)) {
+ constraints.add(factory.childNode(childSelector, path));
+ } else {
+ constraints.add(factory.sameNode(parentSelector, path));
+ }
+ }
+ return constraints;
}
private Set<String> getValues(Set<String> selectors, Row row)
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/DescendantNodeJoinMerger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/DescendantNodeJoinMerger.java?rev=1025644&r1=1025643&r2=1025644&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/DescendantNodeJoinMerger.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/DescendantNodeJoinMerger.java Wed Oct 20 16:55:27 2010
@@ -16,6 +16,7 @@
*/
package org.apache.jackrabbit.core.query.lucene.join;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
@@ -60,8 +61,21 @@ class DescendantNodeJoinMerger extends J
@Override
public List<Constraint> getRightJoinConstraints(List<Row> leftRows)
throws RepositoryException {
- // TODO Auto-generated method stub
- return Collections.emptyList();
+ Set<String> paths = new HashSet<String>();
+ for (Row row : leftRows) {
+ paths.addAll(getLeftValues(row));
+ }
+
+ List<Constraint> constraints = new ArrayList<Constraint>();
+ for (String path : paths) {
+ if (rightSelectors.contains(descendantSelector)) {
+ constraints.add(
+ factory.descendantNode(descendantSelector, path));
+ } else {
+ constraints.add(factory.sameNode(ancestorSelector, path));
+ }
+ }
+ return constraints;
}
private Set<String> getValues(Set<String> selectors, Row row)
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinMerger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinMerger.java?rev=1025644&r1=1025643&r2=1025644&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinMerger.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinMerger.java Wed Oct 20 16:55:27 2010
@@ -47,8 +47,28 @@ import javax.jcr.query.qom.Source;
import org.apache.jackrabbit.commons.iterator.RowIterable;
import org.apache.jackrabbit.commons.iterator.RowIteratorAdapter;
+/**
+ * A join merger is used by the {@link QueryEngine} class to efficiently
+ * merge together two parts of a join query.
+ * <p>
+ * Each join condition type ({@link EquiJoinCondition equi-} and
+ * {@link SameNodeJoinCondition same}, {@link ChildNodeJoinCondition child}
+ * or {@link DescendantJoinCondition descendant} node joins) has it's own
+ * merger class that extends the functionality of this abstract base class
+ * with functionality specific to that join condition.
+ */
abstract class JoinMerger {
+ /**
+ * Static factory method for creating a merger for the given join.
+ *
+ * @param join join
+ * @param columns columns of the query
+ * @param evaluator operand evaluator
+ * @param factory QOM factory
+ * @return join merger
+ * @throws RepositoryException if the merger can not be created
+ */
public static JoinMerger getJoinMerger(
Join join, Map<String, PropertyValue> columns,
OperandEvaluator evaluator, QueryObjectModelFactory factory)
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SameNodeJoinMerger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SameNodeJoinMerger.java?rev=1025644&r1=1025643&r2=1025644&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SameNodeJoinMerger.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SameNodeJoinMerger.java Wed Oct 20 16:55:27 2010
@@ -16,7 +16,9 @@
*/
package org.apache.jackrabbit.core.query.lucene.join;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -62,8 +64,20 @@ class SameNodeJoinMerger extends JoinMer
@Override
public List<Constraint> getRightJoinConstraints(List<Row> leftRows)
throws RepositoryException {
- // TODO Auto-generated method stub
- return Collections.emptyList();
+ Set<String> paths = new HashSet<String>();
+ for (Row row : leftRows) {
+ paths.addAll(getLeftValues(row));
+ }
+
+ List<Constraint> constraints = new ArrayList<Constraint>();
+ for (String path : paths) {
+ if (rightSelectors.contains(selector1)) {
+ constraints.add(factory.sameNode(selector1, path));
+ } else {
+ constraints.add(factory.sameNode(selector2, path));
+ }
+ }
+ return constraints;
}
private Set<String> getValues(Set<String> selectors, Row row)