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/18 15:22:34 UTC

svn commit: r1023787 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join: AbstractRow.java JoinMerger.java JoinRow.java QueryEngine.java SelectorRow.java SimpleRow.java

Author: jukka
Date: Mon Oct 18 13:22:34 2010
New Revision: 1023787

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

Improved row handling

Added:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/AbstractRow.java   (with props)
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinRow.java   (with props)
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SelectorRow.java   (with props)
Removed:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SimpleRow.java
Modified:
    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/QueryEngine.java

Added: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/AbstractRow.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/AbstractRow.java?rev=1023787&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/AbstractRow.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/AbstractRow.java Mon Oct 18 13:22:34 2010
@@ -0,0 +1,78 @@
+/*
+ * 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.core.query.lucene.join;
+
+import java.util.Map;
+
+import javax.jcr.ItemNotFoundException;
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Value;
+import javax.jcr.query.Row;
+import javax.jcr.query.qom.Operand;
+import javax.jcr.query.qom.PropertyValue;
+
+abstract class AbstractRow implements Row {
+
+    private final Map<String, PropertyValue> columns;
+
+    private final OperandEvaluator evaluator;
+
+    protected AbstractRow(
+            Map<String, PropertyValue> columns, OperandEvaluator evaluator) {
+        this.columns = columns;
+        this.evaluator = evaluator;
+    }
+
+    public Value[] getValues() throws RepositoryException {
+        Value[] values = new Value[columns.size()];
+        for (Operand operand : columns.values()) {
+            values = evaluator.getValues(operand, this);
+        }
+        return values;
+    }
+
+    public Value getValue(String columnName)
+            throws ItemNotFoundException, RepositoryException {
+        Operand operand = columns.get(columnName);
+        if (operand != null) {
+            return evaluator.getValue(operand, this);
+        } else {
+            throw new ItemNotFoundException(
+                    "Column " + columnName + " is not included in this row");
+        }
+    }
+
+    public String getPath() throws RepositoryException {
+        Node node = getNode();
+        if (node != null) {
+            return node.getPath();
+        } else {
+            return null;
+        }
+    }
+
+    public String getPath(String selectorName) throws RepositoryException {
+        Node node = getNode(selectorName);
+        if (node != null) {
+            return node.getPath();
+        } else {
+            return null;
+        }
+    }
+
+}

Propchange: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/AbstractRow.java
------------------------------------------------------------------------------
    svn:eol-style = native

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=1023787&r1=1023786&r2=1023787&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 Mon Oct 18 13:22:34 2010
@@ -27,10 +27,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.UnsupportedRepositoryOperationException;
-import javax.jcr.Value;
 import javax.jcr.query.QueryResult;
 import javax.jcr.query.Row;
 import javax.jcr.query.RowIterator;
@@ -86,9 +84,9 @@ abstract class JoinMerger {
 
     private final String[] selectorNames;
 
-    private final String[] columnNames;
+    private final Map<String, PropertyValue> columns;
 
-    private final PropertyValue[] operands;
+    private final String[] columnNames;
 
     protected final OperandEvaluator evaluator;
 
@@ -109,10 +107,9 @@ abstract class JoinMerger {
         this.selectorNames =
             selectors.toArray(new String[selectors.size()]);
 
+        this.columns = columns;
         this.columnNames =
             columns.keySet().toArray(new String[columns.size()]);
-        this.operands =
-            columns.values().toArray(new PropertyValue[columns.size()]);
 
         this.evaluator = evaluator;
         this.factory = factory;
@@ -229,30 +226,8 @@ abstract class JoinMerger {
      * @throws RepositoryException if the rows can't be joined
      */
     private Row mergeRow(Row left, Row right) throws RepositoryException {
-        Node[] nodes = new Node[selectorNames.length];
-        double[] scores = new double[selectorNames.length];
-        for (int i = 0; i < selectorNames.length; i++) {
-            String selector = selectorNames[i];
-            if (left != null && leftSelectors.contains(selector)) {
-                nodes[i] = left.getNode(selector);
-                scores[i] = left.getScore(selector);
-            } else if (right != null && rightSelectors.contains(selector)) {
-                nodes[i] = right.getNode(selector);
-                scores[i] = right.getScore(selector);
-            } else {
-                nodes[i] = null;
-                scores[i] = 0.0;
-            }
-        }
-
-        Value[] values = new Value[operands.length];
-        Row row = new SimpleRow(
-                columnNames, values, selectorNames, nodes, scores);
-        for (int i = 0; i < operands.length; i++) {
-            values[i] = evaluator.getValue(operands[i], row);
-        }
-
-        return row;
+        return new JoinRow(
+                columns, evaluator, left, leftSelectors, right, rightSelectors);
     }
 
     public abstract Set<String> getLeftValues(Row row)

Added: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinRow.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinRow.java?rev=1023787&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinRow.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinRow.java Mon Oct 18 13:22:34 2010
@@ -0,0 +1,114 @@
+/*
+ * 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.core.query.lucene.join;
+
+import java.util.Map;
+import java.util.Set;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.query.Row;
+import javax.jcr.query.qom.PropertyValue;
+
+public class JoinRow extends AbstractRow {
+
+    private final Row leftRow;
+
+    private final Set<String> leftSelectors;
+
+    private final Row rightRow;
+
+    private final Set<String> rightSelectors;
+
+    public JoinRow(
+            Map<String, PropertyValue> columns, OperandEvaluator evaluator,
+            Row leftRow, Set<String> leftSelectors,
+            Row rightRow, Set<String> rightSelectors) {
+        super(columns, evaluator);
+        this.leftRow = leftRow;
+        this.leftSelectors = leftSelectors;
+        this.rightRow = rightRow;
+        this.rightSelectors = rightSelectors;
+    }
+
+    public Node getNode() throws RepositoryException {
+        throw new RepositoryException();
+    }
+
+    public Node getNode(String selectorName) throws RepositoryException {
+        Row row = getRow(selectorName);
+        if (row != null) {
+            return row.getNode(selectorName);
+        } else {
+            return null;
+        }
+    }
+
+    public double getScore() throws RepositoryException {
+        throw new RepositoryException();
+    }
+
+    public double getScore(String selectorName) throws RepositoryException {
+        Row row = getRow(selectorName);
+        if (row != null) {
+            return row.getScore(selectorName);
+        } else {
+            return 0.0;
+        }
+    }
+
+    private Row getRow(String selector) throws RepositoryException {
+        if (leftSelectors.contains(selector)) {
+            return leftRow;
+        } else if (rightSelectors.contains(selector)) {
+            return rightRow;
+        } else {
+            throw new RepositoryException(
+                    "Selector " + selector + " is not included in this row");
+        }
+    }
+
+    //--------------------------------------------------------------< Object >
+
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append("{ ");
+        for (String selector : leftSelectors) {
+            builder.append(selector);
+            builder.append("=");
+            try {
+                builder.append(leftRow.getNode(selector));
+            } catch (RepositoryException e) {
+                builder.append(e.getMessage());
+            }
+            builder.append(" ");
+        }
+        for (String selector : rightSelectors) {
+            builder.append(selector);
+            builder.append("=");
+            try {
+                builder.append(rightRow.getNode(selector));
+            } catch (RepositoryException e) {
+                builder.append(e.getMessage());
+            }
+            builder.append(" ");
+        }
+        builder.append("}");
+        return builder.toString();
+    }
+
+}

Propchange: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinRow.java
------------------------------------------------------------------------------
    svn:eol-style = native

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=1023787&r1=1023786&r2=1023787&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 Mon Oct 18 13:22:34 2010
@@ -289,51 +289,21 @@ public class QueryEngine {
         final String[] columnNames =
             columnMap.keySet().toArray(new String[columnMap.size()]);
 
-        final double[] scores = new double[] { 1.0 };
-
-//        Iterator<Node> nodes =
-//            TreeTraverser.nodeIterator(session.getRootNode());
+        final String selectorName = selector.getSelectorName();
         RangeIterator rows = new RangeIteratorAdapter(query.execute().getNodes()) {
             @Override
             public Object next() {
-                try {
-                    Value[] values = new Value[columnNames.length];
-                    Row row = new SimpleRow(
-                            columnNames, values, selectorNames,
-                            new Node[] { (Node) super.next() }, scores);
-                    for (int i = 0; i < values.length; i++) {
-                        values[i] = combine(evaluator.getValues(
-                                columnMap.get(columnNames[i]), row));
-                    }
-                    return row;
-                } catch (RepositoryException e) {
-                    throw new RuntimeException(e);
-                }
+                Node node = (Node) super.next();
+                return new SelectorRow(
+                        columnMap, evaluator, selectorName, node, 1.0);
             }
         };
 
-//        RangeIterator filtered = new FilteredRangeIterator(
-//                rows, getPredicate(selector, constraint));
         QueryResult result = new SimpleQueryResult(
                 columnNames, selectorNames, new RowIteratorAdapter(rows));
         return sort(result, orderings);
     }
 
-    private Value combine(Value[] values) throws RepositoryException {
-        if (values.length == 1) {
-            return values[0];
-        } else {
-            StringBuilder builder = new StringBuilder();
-            for (int i = 0; i < values.length; i++) {
-                if (i > 0) {
-                    builder.append('\n');
-                }
-                builder.append(values[i].getString());
-            }
-            return valueFactory.createValue(builder.toString());
-        }
-    }
-
     private Map<String, PropertyValue> getColumnMap(
             Column[] columns, Map<String, NodeType> selectors)
             throws RepositoryException {

Added: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SelectorRow.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SelectorRow.java?rev=1023787&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SelectorRow.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SelectorRow.java Mon Oct 18 13:22:34 2010
@@ -0,0 +1,76 @@
+/*
+ * 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.core.query.lucene.join;
+
+import java.util.Map;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.query.qom.PropertyValue;
+
+/**
+ * A row implementation for a query with just a single selector.
+ */
+public class SelectorRow extends AbstractRow {
+
+    private final String selector;
+
+    private final Node node;
+
+    private final double score;
+
+    public SelectorRow(
+            Map<String, PropertyValue> columns, OperandEvaluator evaluator,
+            String selector, Node node, double score) {
+        super(columns, evaluator);
+        this.selector = selector;
+        this.node = node;
+        this.score = score;
+    }
+
+    public Node getNode() {
+        return node;
+    }
+
+    public Node getNode(String selectorName) throws RepositoryException {
+        checkSelectorName(selectorName);
+        return node;
+    }
+
+    public double getScore() {
+        return score;
+    }
+
+    public double getScore(String selectorName) throws RepositoryException {
+        checkSelectorName(selectorName);
+        return score;
+    }
+
+    private void checkSelectorName(String name) throws RepositoryException {
+        if (!selector.equals(name)) {
+            throw new RepositoryException(
+                    "Selector " + name + " is not included in this row");
+        }
+    }
+
+    //--------------------------------------------------------------< Object >
+
+    public String toString() {
+        return "{ " + selector + ": " + node + " }";
+    }
+
+}

Propchange: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SelectorRow.java
------------------------------------------------------------------------------
    svn:eol-style = native