Return-Path: Delivered-To: apmail-jackrabbit-commits-archive@www.apache.org Received: (qmail 73431 invoked from network); 13 Jul 2007 12:38:38 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 13 Jul 2007 12:38:38 -0000 Received: (qmail 3307 invoked by uid 500); 13 Jul 2007 12:38:41 -0000 Delivered-To: apmail-jackrabbit-commits-archive@jackrabbit.apache.org Received: (qmail 3287 invoked by uid 500); 13 Jul 2007 12:38:41 -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 3278 invoked by uid 99); 13 Jul 2007 12:38:40 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 13 Jul 2007 05:38:40 -0700 X-ASF-Spam-Status: No, hits=-99.5 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 13 Jul 2007 05:38:37 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id 523071A981A; Fri, 13 Jul 2007 05:38:17 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r555971 - in /jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query: QueryImpl.java QueryResultImpl.java RowIteratorImpl.java Date: Fri, 13 Jul 2007 12:38:17 -0000 To: commits@jackrabbit.apache.org From: mreutegg@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20070713123817.523071A981A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: mreutegg Date: Fri Jul 13 05:38:16 2007 New Revision: 555971 URL: http://svn.apache.org/viewvc?view=rev&rev=555971 Log: JCR-1031: RowIteratorImpl should make use of QueryResultRow.getValues() Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryImpl.java jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryResultImpl.java jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/RowIteratorImpl.java Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryImpl.java?view=diff&rev=555971&r1=555970&r2=555971 ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryImpl.java (original) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryImpl.java Fri Jul 13 05:38:16 2007 @@ -163,7 +163,8 @@ public QueryResult execute() throws RepositoryException { QueryInfo qI = wspManager.executeQuery(statement, language, nsResolver.getLocalNamespaceMappings()); - return new QueryResultImpl(itemManager, hierarchyManager, qI, nsResolver); + return new QueryResultImpl(itemManager, hierarchyManager, + qI, nsResolver, session.getValueFactory()); } /** Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryResultImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryResultImpl.java?view=diff&rev=555971&r1=555970&r2=555971 ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryResultImpl.java (original) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryResultImpl.java Fri Jul 13 05:38:16 2007 @@ -28,6 +28,7 @@ import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; +import javax.jcr.ValueFactory; import javax.jcr.query.QueryResult; import javax.jcr.query.RowIterator; @@ -62,19 +63,29 @@ private final NamespaceResolver nsResolver; /** + * The JCR value factory. + */ + private final ValueFactory valueFactory; + + /** * Creates a new query result. * - * @param itemMgr the item manager of the session executing the query. - * @param hierarchyMgr the HierarchyManager of the session executing the query. - * @param queryInfo the spi query result. - * @param nsResolver the namespace nsResolver of the session executing the query. + * @param itemMgr the item manager of the session executing the query. + * @param hierarchyMgr the HierarchyManager of the session executing the + * query. + * @param queryInfo the spi query result. + * @param nsResolver the namespace nsResolver of the session executing the + * query. + * @param valueFactory the JCR value factory. */ QueryResultImpl(ItemManager itemMgr, HierarchyManager hierarchyMgr, - QueryInfo queryInfo, NamespaceResolver nsResolver) { + QueryInfo queryInfo, NamespaceResolver nsResolver, + ValueFactory valueFactory) { this.itemMgr = itemMgr; this.hierarchyMgr = hierarchyMgr; this.queryInfo = queryInfo; this.nsResolver = nsResolver; + this.valueFactory = valueFactory; } /** @@ -107,7 +118,7 @@ * {@inheritDoc} */ public RowIterator getRows() throws RepositoryException { - return new RowIteratorImpl(getNodeIterator(), queryInfo.getColumnNames(), nsResolver); + return new RowIteratorImpl(queryInfo, nsResolver, valueFactory); } /** Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/RowIteratorImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/RowIteratorImpl.java?view=diff&rev=555971&r1=555970&r2=555971 ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/RowIteratorImpl.java (original) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/RowIteratorImpl.java Fri Jul 13 05:38:16 2007 @@ -16,32 +16,28 @@ */ package org.apache.jackrabbit.jcr2spi.query; -import java.util.Arrays; -import java.util.HashSet; import java.util.Iterator; import java.util.NoSuchElementException; -import java.util.Set; +import java.util.HashMap; +import java.util.Map; import javax.jcr.ItemNotFoundException; -import javax.jcr.Node; -import javax.jcr.Property; -import javax.jcr.PropertyType; import javax.jcr.RangeIterator; import javax.jcr.RepositoryException; import javax.jcr.Value; +import javax.jcr.ValueFactory; import javax.jcr.query.Row; import javax.jcr.query.RowIterator; import org.apache.jackrabbit.name.IllegalNameException; import org.apache.jackrabbit.name.NameFormat; import org.apache.jackrabbit.name.NamespaceResolver; -import org.apache.jackrabbit.name.NoPrefixDeclaredException; import org.apache.jackrabbit.name.QName; import org.apache.jackrabbit.name.UnknownPrefixException; -import org.apache.jackrabbit.value.DoubleValue; -import org.apache.jackrabbit.value.LongValue; -import org.apache.jackrabbit.value.PathValue; -import org.apache.jackrabbit.value.StringValue; +import org.apache.jackrabbit.value.ValueFormat; +import org.apache.jackrabbit.spi.QueryInfo; +import org.apache.jackrabbit.spi.QueryResultRow; +import org.apache.jackrabbit.spi.QValue; /** * Implements the {@link javax.jcr.query.RowIterator} interface returned by @@ -50,14 +46,14 @@ class RowIteratorImpl implements RowIterator { /** - * Iterator over nodes, that constitute the result set. + * The result rows from the SPI implementation. */ - private final ScoreNodeIterator nodes; + private final RangeIterator rows; /** - * Array of select property names + * The column names. */ - private final QName[] properties; + private final QName[] columnNames; /** * The NamespaceResolver of the user Session. @@ -65,19 +61,24 @@ private final NamespaceResolver nsResolver; /** + * The JCR value factory. + */ + private final ValueFactory vFactory; + + /** * Creates a new RowIteratorImpl that iterates over the result * nodes. * - * @param nodes a ScoreNodeIterator that contains the nodes of - * the query result. - * @param properties QName of the select properties. - * @param resolver NamespaceResolver of the user - * Session. - */ - RowIteratorImpl(ScoreNodeIterator nodes, QName[] properties, NamespaceResolver resolver) { - this.nodes = nodes; - this.properties = properties; + * @param queryInfo the query info. + * @param resolver NamespaceResolver of the user + * Session. + * @param vFactory the JCR value factory. + */ + RowIteratorImpl(QueryInfo queryInfo, NamespaceResolver resolver, ValueFactory vFactory) { + this.rows = queryInfo.getRows(); + this.columnNames = queryInfo.getColumnNames(); this.nsResolver = resolver; + this.vFactory = vFactory; } //--------------------------------------------------------< RowIterator >--- @@ -89,7 +90,7 @@ * @see RowIterator#nextRow() */ public Row nextRow() throws NoSuchElementException { - return new RowImpl(nodes.getScore(), nodes.nextNode()); + return new RowImpl((QueryResultRow) rows.next()); } //------------------------------------------------------< RangeIterator >--- @@ -102,7 +103,7 @@ * @see javax.jcr.RangeIterator#skip(long) */ public void skip(long skipNum) throws NoSuchElementException { - nodes.skip(skipNum); + rows.skip(skipNum); } /** @@ -112,7 +113,7 @@ * @see RangeIterator#getSize() */ public long getSize() { - return nodes.getSize(); + return rows.getSize(); } /** @@ -127,7 +128,7 @@ * @see RangeIterator#getPosition() */ public long getPosition() { - return nodes.getPosition(); + return rows.getPosition(); } /** @@ -147,7 +148,7 @@ * @see Iterator#hasNext() */ public boolean hasNext() { - return nodes.hasNext(); + return rows.hasNext(); } /** @@ -169,14 +170,9 @@ class RowImpl implements Row { /** - * The score for this result row - */ - private final double score; - - /** - * The underlying Node of this result row. + * The underlying QueryResultRow. */ - private final Node node; + private final QueryResultRow row; /** * Cached value array for returned by {@link #getValues()}. @@ -184,19 +180,19 @@ private Value[] values; /** - * Set of select property QNames. + * Map of select property QNames. Key: QName, Value: + * Integer, which refers to the array index in {@link #values}. */ - private Set propertySet; + private Map propertyMap; /** - * Creates a new RowImpl instance based on node. + * Creates a new RowImpl instance based on a SPI result + * row. * - * @param score the score value for this result row - * @param node the underlying Node for this Row. + * @param row the underlying query result row */ - private RowImpl(double score, Node node) { - this.score = score; - this.node = node; + private RowImpl(QueryResultRow row) { + this.row = row; } //------------------------------------------------------------< Row >--- @@ -212,35 +208,14 @@ */ public Value[] getValues() throws RepositoryException { if (values == null) { - Value[] tmp = new Value[properties.length]; - for (int i = 0; i < properties.length; i++) { - String propName; - try { - propName = NameFormat.format(properties[i], nsResolver); - } catch (NoPrefixDeclaredException e) { - throw new RepositoryException(e.getMessage(), e); - } - if (node.hasProperty(propName)) { - Property prop = node.getProperty(propName); - if (!prop.getDefinition().isMultiple()) { - if (prop.getDefinition().getRequiredType() == PropertyType.UNDEFINED) { - tmp[i] = new StringValue(prop.getString()); - } else { - tmp[i] = prop.getValue(); - } - } else { - // mvp values cannot be returned - tmp[i] = null; - } + QValue[] qVals = row.getValues(); + Value[] tmp = new Value[qVals.length]; + for (int i = 0; i < qVals.length; i++) { + if (qVals[i] == null) { + tmp[i] = null; } else { - // property not set or jcr:path / jcr:score - if (QName.JCR_PATH.equals(properties[i])) { - tmp[i] = PathValue.valueOf(node.getPath()); - } else if (QName.JCR_SCORE.equals(properties[i])) { - tmp[i] = new DoubleValue(score); - } else { - tmp[i] = null; - } + tmp[i] = ValueFormat.getJCRValue( + qVals[i], nsResolver, vFactory); } } values = tmp; @@ -265,34 +240,25 @@ * @see Row#getValue(String) */ public Value getValue(String propertyName) throws ItemNotFoundException, RepositoryException { - if (propertySet == null) { - // create the set first - Set tmp = new HashSet(); - tmp.addAll(Arrays.asList(properties)); - propertySet = tmp; + if (propertyMap == null) { + // create the map first + Map tmp = new HashMap(); + for (int i = 0; i < columnNames.length; i++) { + tmp.put(columnNames[i], new Integer(i)); + } + propertyMap = tmp; } try { QName prop = NameFormat.parse(propertyName, nsResolver); - if (!propertySet.contains(prop)) { + Integer idx = (Integer) propertyMap.get(prop); + if (idx == null) { throw new ItemNotFoundException(propertyName); } - if (node.hasProperty(propertyName)) { - Property p = node.getProperty(propertyName); - if (p.getDefinition().getRequiredType() == PropertyType.UNDEFINED) { - return new StringValue(p.getString()); - } else { - return p.getValue(); - } - } else { - // either jcr:score, jcr:path or not set - if (QName.JCR_PATH.equals(prop)) { - return PathValue.valueOf(node.getPath()); - } else if (QName.JCR_SCORE.equals(prop)) { - return new LongValue((int) (score * 1000f)); - } else { - return null; - } + // make sure values are there + if (values == null) { + getValues(); } + return values[idx.intValue()]; } catch (IllegalNameException e) { throw new RepositoryException(e.getMessage(), e); } catch (UnknownPrefixException e) {