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/19 17:06:54 UTC

svn commit: r1024260 - /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryFactory.java

Author: jukka
Date: Tue Oct 19 15:06:54 2010
New Revision: 1024260

URL: http://svn.apache.org/viewvc?rev=1024260&view=rev
Log:
JCR-2715: Improved join query performance

Simplify selector query construction in LuceneQueryFactory

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryFactory.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=1024260&r1=1024259&r2=1024260&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 Tue Oct 19 15:06:54 2010
@@ -16,6 +16,11 @@
  */
 package org.apache.jackrabbit.core.query.lucene;
 
+import static org.apache.jackrabbit.core.query.lucene.FieldNames.PROPERTIES;
+import static org.apache.jackrabbit.spi.commons.name.NameConstants.JCR_MIXINTYPES;
+import static org.apache.jackrabbit.spi.commons.name.NameConstants.JCR_PRIMARYTYPE;
+import static org.apache.lucene.search.BooleanClause.Occur.SHOULD;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -28,6 +33,7 @@ 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;
@@ -40,6 +46,7 @@ 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;
@@ -62,6 +69,11 @@ public class LuceneQueryFactory {
     private final SessionImpl session;
 
     /**
+     * Node type manager
+     */
+    private final NodeTypeManager ntManager;
+
+    /**
      * The hierarchy manager.
      */
     private final HierarchyManager hmgr;
@@ -96,6 +108,10 @@ public class LuceneQueryFactory {
      */
     private final Map<Name, Value> bindVariables;
 
+    private final String mixinTypesField;
+
+    private final String primaryTypeField;
+
     /**
      * Creates a new lucene query factory.
      *
@@ -112,8 +128,9 @@ public class LuceneQueryFactory {
             SessionImpl session, HierarchyManager hmgr,
             NamespaceMappings nsMappings, Analyzer analyzer,
             SynonymProvider synonymProvider, IndexFormatVersion version,
-            Map<Name, Value> bindVariables) {
+            Map<Name, Value> bindVariables) throws RepositoryException {
         this.session = session;
+        this.ntManager = session.getWorkspace().getNodeTypeManager();
         this.hmgr = hmgr;
         this.nsMappings = nsMappings;
         this.analyzer = analyzer;
@@ -121,6 +138,8 @@ public class LuceneQueryFactory {
         this.version = version;
         this.npResolver = NamePathResolverImpl.create(nsMappings);
         this.bindVariables = bindVariables;
+        this.mixinTypesField = nsMappings.translateName(JCR_MIXINTYPES);
+        this.primaryTypeField = nsMappings.translateName(JCR_PRIMARYTYPE);
     }
 
     /**
@@ -131,66 +150,43 @@ public class LuceneQueryFactory {
      * @throws RepositoryException if an error occurs while creating the query.
      */
     public Query create(SelectorImpl selector) throws RepositoryException {
-        List<Term> terms = new ArrayList<Term>();
-        String mixinTypesField = npResolver.getJCRName(NameConstants.JCR_MIXINTYPES);
-        String primaryTypeField = npResolver.getJCRName(NameConstants.JCR_PRIMARYTYPE);
-
-        NodeTypeManager ntMgr = session.getWorkspace().getNodeTypeManager();
-        NodeType base = null;
-        try {
-            base = ntMgr.getNodeType(session.getJCRName(selector.getNodeTypeQName()));
-        } catch (RepositoryException e) {
-            // node type does not exist
-        }
+        return create(ntManager.getNodeType(selector.getNodeTypeName()));
+    }
 
-        if (base != null && base.isMixin()) {
+    private Term createNodeTypeTerm(NodeType type) throws RepositoryException {
+        String field;
+        if (type.isMixin()) {
             // search for nodes where jcr:mixinTypes is set to this mixin
-            Term t = new Term(FieldNames.PROPERTIES,
-                    FieldNames.createNamedValue(mixinTypesField,
-                            npResolver.getJCRName(selector.getNodeTypeQName())));
-            terms.add(t);
+            field = mixinTypesField;
         } else {
             // search for nodes where jcr:primaryType is set to this type
-            Term t = new Term(FieldNames.PROPERTIES,
-                    FieldNames.createNamedValue(primaryTypeField,
-                            npResolver.getJCRName(selector.getNodeTypeQName())));
-            terms.add(t);
+            field = primaryTypeField;
         }
+        String name = nsMappings.translateName(session.getQName(type.getName()));
+        return new Term(PROPERTIES, FieldNames.createNamedValue(field, name));
+    }
 
-        // now search for all node types that are derived from base
-        if (base != null) {
-            NodeTypeIterator allTypes = ntMgr.getAllNodeTypes();
-            while (allTypes.hasNext()) {
-                NodeType nt = allTypes.nextNodeType();
-                NodeType[] superTypes = nt.getSupertypes();
-                if (Arrays.asList(superTypes).contains(base)) {
-                    Name n = session.getQName(nt.getName());
-                    String ntName = nsMappings.translateName(n);
-                    Term t;
-                    if (nt.isMixin()) {
-                        // search on jcr:mixinTypes
-                        t = new Term(FieldNames.PROPERTIES,
-                                FieldNames.createNamedValue(mixinTypesField, ntName));
-                    } else {
-                        // search on jcr:primaryType
-                        t = new Term(FieldNames.PROPERTIES,
-                                FieldNames.createNamedValue(primaryTypeField, ntName));
-                    }
-                    terms.add(t);
-                }
+    private Query create(NodeType type) throws RepositoryException {
+        List<Term> terms = new ArrayList<Term>();
+
+        String name = type.getName();
+        NodeTypeIterator allTypes = ntManager.getAllNodeTypes();
+        while (allTypes.hasNext()) {
+            NodeType nt = allTypes.nextNodeType();
+            if (nt.isNodeType(name)) {
+                terms.add(createNodeTypeTerm(nt));
             }
         }
-        Query q;
+
         if (terms.size() == 1) {
-            q = new JackrabbitTermQuery(terms.get(0));
+            return new JackrabbitTermQuery(terms.get(0));
         } else {
             BooleanQuery b = new BooleanQuery();
             for (Term term : terms) {
-                b.add(new JackrabbitTermQuery(term), BooleanClause.Occur.SHOULD);
+                b.add(new JackrabbitTermQuery(term), SHOULD);
             }
-            q = b;
+            return b;
         }
-        return q;
     }
 
     /**