Return-Path: Delivered-To: apmail-jackrabbit-commits-archive@www.apache.org Received: (qmail 46504 invoked from network); 18 Oct 2010 13:23:38 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 18 Oct 2010 13:23:38 -0000 Received: (qmail 41436 invoked by uid 500); 18 Oct 2010 13:23:37 -0000 Delivered-To: apmail-jackrabbit-commits-archive@jackrabbit.apache.org Received: (qmail 41343 invoked by uid 500); 18 Oct 2010 13:23:36 -0000 Mailing-List: contact commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@jackrabbit.apache.org Delivered-To: mailing list commits@jackrabbit.apache.org Received: (qmail 41336 invoked by uid 99); 18 Oct 2010 13:23:35 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 18 Oct 2010 13:23:35 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 18 Oct 2010 13:23:32 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id BE453238896F; Mon, 18 Oct 2010 13:22:34 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: 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 Date: Mon, 18 Oct 2010 13:22:34 -0000 To: commits@jackrabbit.apache.org From: jukka@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20101018132234.BE453238896F@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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 columns; + + private final OperandEvaluator evaluator; + + protected AbstractRow( + Map 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 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 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 leftSelectors; + + private final Row rightRow; + + private final Set rightSelectors; + + public JoinRow( + Map columns, OperandEvaluator evaluator, + Row leftRow, Set leftSelectors, + Row rightRow, Set 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 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 getColumnMap( Column[] columns, Map 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 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