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:40:58 UTC

svn commit: r1024283 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query: QueryImpl.java QueryObjectModelImpl.java lucene/join/QueryEngine.java

Author: jukka
Date: Tue Oct 19 15:40:58 2010
New Revision: 1024283

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

Use the new join functionality for handling simple inner equi-joins.

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryObjectModelImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryImpl.java?rev=1024283&r1=1024282&r2=1024283&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryImpl.java Tue Oct 19 15:40:58 2010
@@ -92,12 +92,12 @@ public class QueryImpl extends AbstractQ
     /**
      * The maximum result size
      */
-    private long limit = -1;
+    protected long limit = -1;
 
     /**
      * The offset in the total result set
      */
-    private long offset;
+    protected long offset;
 
     /**
      * @inheritDoc

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryObjectModelImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryObjectModelImpl.java?rev=1024283&r1=1024282&r2=1024283&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryObjectModelImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryObjectModelImpl.java Tue Oct 19 15:40:58 2010
@@ -16,17 +16,29 @@
  */
 package org.apache.jackrabbit.core.query;
 
+import static javax.jcr.query.qom.QueryObjectModelConstants.JCR_JOIN_TYPE_INNER;
+
+import java.util.HashMap;
+import java.util.Map;
+
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
+import javax.jcr.Value;
 import javax.jcr.query.InvalidQueryException;
+import javax.jcr.query.QueryResult;
 import javax.jcr.query.qom.Column;
 import javax.jcr.query.qom.Constraint;
+import javax.jcr.query.qom.EquiJoinCondition;
+import javax.jcr.query.qom.Join;
 import javax.jcr.query.qom.Ordering;
 import javax.jcr.query.qom.QueryObjectModel;
+import javax.jcr.query.qom.QueryObjectModelConstants;
 import javax.jcr.query.qom.Source;
 
 import org.apache.jackrabbit.commons.query.QueryObjectModelBuilderRegistry;
+import org.apache.jackrabbit.core.query.lucene.join.QueryEngine;
 import org.apache.jackrabbit.core.session.SessionContext;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.commons.query.qom.QueryObjectModelTree;
 
 /**
@@ -39,6 +51,8 @@ public class QueryObjectModelImpl extend
      */
     protected QueryObjectModelTree qomTree;
 
+    private final Map<String, Value> variables = new HashMap<String, Value>();
+
     /**
      * {@inheritDoc}
      * @throws UnsupportedOperationException always.
@@ -77,9 +91,35 @@ public class QueryObjectModelImpl extend
         this.node = node;
         this.statement = QueryObjectModelBuilderRegistry.getQueryObjectModelBuilder(language).toString(this);
         this.query = handler.createExecutableQuery(sessionContext, qomTree);
+        for (Name name : query.getBindVariableNames()) {
+            variables.put(sessionContext.getJCRName(name), null);
+        }
         setInitialized();
     }
 
+    @Override
+    public void bindValue(String varName, Value value)
+            throws IllegalArgumentException, RepositoryException {
+        super.bindValue(varName, value);
+        variables.put(varName, value);
+    }
+
+    public QueryResult execute() throws RepositoryException {
+        Source source = getSource();
+        if (source instanceof Join) {
+            Join join = (Join) source;
+            if (JCR_JOIN_TYPE_INNER.equals(join.getJoinType())
+                    && join.getJoinCondition() instanceof EquiJoinCondition) {
+                QueryEngine engine =
+                    new QueryEngine(sessionContext.getSessionImpl(), variables);
+                return engine.execute(
+                        getColumns(), getSource(), getConstraint(),
+                        getOrderings(), offset, limit);
+            }
+        }
+        return super.execute();
+    }
+
     //-------------------------< QueryObjectModel >-----------------------------
 
     /**

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java?rev=1024283&r1=1024282&r2=1024283&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java Tue Oct 19 15:40:58 2010
@@ -215,8 +215,10 @@ public class QueryEngine {
             }
             rightRows = new RowIteratorAdapter(list);
         }
-        return merger.merge(
+
+        QueryResult result = merger.merge(
                 new RowIteratorAdapter(leftRows), rightRows, offset, limit);
+        return sort(result, orderings);
     }
 
     private String toSqlConstraint(Constraint constraint)