You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2005/07/13 15:05:03 UTC
svn commit: r216152 - in /incubator/jackrabbit/trunk/core/src:
java/org/apache/jackrabbit/core/query/lucene/
test/org/apache/jackrabbit/test/api/query/
Author: mreutegg
Date: Wed Jul 13 06:05:01 2005
New Revision: 216152
URL: http://svn.apache.org/viewcvs?rev=216152&view=rev
Log:
- Fix for wrong values returned by getPosition()
- Added test case for NodeIterator returned by QueryResult
Added:
incubator/jackrabbit/trunk/core/src/test/org/apache/jackrabbit/test/api/query/NodeIteratorTest.java (with props)
Modified:
incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/lucene/DocOrderNodeIteratorImpl.java
incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/lucene/NodeIteratorImpl.java
incubator/jackrabbit/trunk/core/src/test/org/apache/jackrabbit/test/api/query/TestAll.java
Modified: incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/lucene/DocOrderNodeIteratorImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/lucene/DocOrderNodeIteratorImpl.java?rev=216152&r1=216151&r2=216152&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/lucene/DocOrderNodeIteratorImpl.java (original)
+++ incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/lucene/DocOrderNodeIteratorImpl.java Wed Jul 13 06:05:01 2005
@@ -177,7 +177,7 @@
ScoreNode n1 = (ScoreNode) o1;
ScoreNode n2 = (ScoreNode) o2;
try {
- NodeImpl node1 = null;
+ NodeImpl node1;
try {
node1 = (NodeImpl) itemMgr.getItem(new NodeId(n1.uuid));
} catch (RepositoryException e) {
@@ -186,7 +186,7 @@
invalidUUIDs.add(n1.uuid);
throw new SortFailedException();
}
- NodeImpl node2 = null;
+ NodeImpl node2;
try {
node2 = (NodeImpl) itemMgr.getItem(new NodeId(n2.uuid));
} catch (RepositoryException e) {
Modified: incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/lucene/NodeIteratorImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/lucene/NodeIteratorImpl.java?rev=216152&r1=216151&r2=216152&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/lucene/NodeIteratorImpl.java (original)
+++ incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/lucene/NodeIteratorImpl.java Wed Jul 13 06:05:01 2005
@@ -44,7 +44,7 @@
protected final ItemManager itemMgr;
/** Current position in the UUID array */
- protected int pos = 0;
+ protected int pos = -1;
/** Reference to the next node instance */
private NodeImpl next;
@@ -113,7 +113,12 @@
if ((pos + skipNum) > uuids.length) {
throw new NoSuchElementException();
}
- pos += skipNum;
+ if (skipNum == 0) {
+ // do nothing
+ } else {
+ pos += skipNum - 1;
+ fetchNext();
+ }
}
/**
@@ -166,7 +171,7 @@
if (!hasNext()) {
throw new NoSuchElementException();
}
- return scores[pos - 1].floatValue();
+ return scores[pos].floatValue();
}
/**
@@ -178,14 +183,16 @@
protected void fetchNext() {
// reset
next = null;
- while (next == null && pos < uuids.length) {
+ while (next == null && (pos + 1) < uuids.length) {
try {
- next = (NodeImpl) itemMgr.getItem(new NodeId(uuids[pos++]));
+ next = (NodeImpl) itemMgr.getItem(new NodeId(uuids[pos + 1]));
} catch (RepositoryException e) {
log.error("Exception retrieving Node with UUID: "
- + uuids[pos - 1] + ": " + e.toString());
+ + uuids[pos + 1] + ": " + e.toString());
// try next
+ pos++;
}
}
+ pos++;
}
}
Added: incubator/jackrabbit/trunk/core/src/test/org/apache/jackrabbit/test/api/query/NodeIteratorTest.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/test/org/apache/jackrabbit/test/api/query/NodeIteratorTest.java?rev=216152&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/core/src/test/org/apache/jackrabbit/test/api/query/NodeIteratorTest.java (added)
+++ incubator/jackrabbit/trunk/core/src/test/org/apache/jackrabbit/test/api/query/NodeIteratorTest.java Wed Jul 13 06:05:01 2005
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ * as applicable.
+ *
+ * Licensed 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.test.api.query;
+
+import org.apache.jackrabbit.test.NotExecutableException;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.NodeIterator;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryResult;
+import java.util.NoSuchElementException;
+
+/**
+ * Tests methods on {@link javax.jcr.NodeIterator} returned by
+ * {@link javax.jcr.query.QueryResult#getNodes()}.
+ *
+ * @test
+ * @sources NodeIteratorTest.java
+ * @executeClass org.apache.jackrabbit.test.api.query.NodeIteratorTest
+ * @keywords level2
+ */
+public class NodeIteratorTest extends AbstractQueryTest {
+
+ /**
+ * Sets up the fixture for test cases.
+ */
+ protected void setUp() throws Exception {
+ super.setUp();
+ testRootNode.addNode(nodeName1, testNodeType);
+ testRootNode.addNode(nodeName2, testNodeType);
+ testRootNode.addNode(nodeName3, testNodeType);
+ testRootNode.save();
+ }
+
+ /**
+ * Tests if {@link javax.jcr.NodeIterator#getSize()} returns the correct
+ * size.
+ *
+ * @throws org.apache.jackrabbit.test.NotExecutableException
+ * if getSize() returns -1 (unavailable).
+ */
+ public void testGetSize() throws RepositoryException, NotExecutableException {
+ NodeIterator it = execute(testPath + "//*", Query.XPATH).getNodes();
+ long size = testRootNode.getNodes().getSize();
+ if (size != -1) {
+ long count = 0;
+ while (it.hasNext()) {
+ it.nextNode();
+ count++;
+ }
+ assertEquals("NodeIterator.getSize does not return correct number.", size, count);
+ } else {
+ throw new NotExecutableException("NodeIterator.getSize() does not return size information.");
+ }
+ }
+
+ /**
+ * Tests the method <code>NodeIterator.getPosition()</code>.
+ */
+ public void testGetPosition() throws RepositoryException {
+ QueryResult rs = execute(testPath + "//*", Query.XPATH);
+
+ // getPosition initially returns 0
+ NodeIterator it = rs.getNodes();
+ assertEquals("Initial call to getPosition() must return 0.", 0, it.getPosition());
+
+ // check getPosition while iterating
+ int index = 0;
+ while (it.hasNext()) {
+ it.nextNode();
+ assertEquals("Wrong position returned by getPosition()", ++index, it.getPosition());
+ }
+ }
+
+ /**
+ * Tests the method <code>NodeIterator.getPosition()</code> on an empty
+ * <code>NodeIterator</code>.
+ */
+ public void testGetPositionEmptyIterator() throws RepositoryException {
+ QueryResult rs = execute(testPath + "/" + nodeName4, Query.XPATH);
+
+ NodeIterator it = rs.getNodes();
+ assertFalse("NodeIterator must be empty.", it.hasNext());
+
+ assertEquals("Empty NodeIterator must return 0 on getPosition()", 0, it.getPosition());
+ }
+
+ /**
+ * Tests if a {@link java.util.NoSuchElementException} is thrown when {@link
+ * javax.jcr.NodeIterator#nextNode()} is called and there are no more nodes
+ * available.
+ */
+ public void testNoSuchElementException() throws RepositoryException {
+ NodeIterator it = execute(testPath + "//*", Query.XPATH).getNodes();
+ while (it.hasNext()) {
+ it.nextNode();
+ }
+ try {
+ it.nextNode();
+ fail("nextNode() must throw a NoSuchElementException when no nodes are available");
+ } catch (NoSuchElementException e) {
+ // success
+ }
+ }
+
+ /**
+ * Tests if {@link javax.jcr.NodeIterator#skip(long)} works correctly.
+ */
+ public void testSkip() throws RepositoryException {
+ QueryResult rs = execute(testPath + "//*", Query.XPATH);
+ NodeIterator it = rs.getNodes();
+
+ // find out if there is anything we can skip
+ int count = 0;
+ while (it.hasNext()) {
+ it.nextNode();
+ count++;
+ }
+ if (count > 1) {
+ // re-aquire iterator
+ it = rs.getNodes();
+ // skip all but one
+ it.skip(count - 1);
+ // get last one
+ it.nextNode();
+ try {
+ it.nextNode();
+ fail("nextNode() must throw a NoSuchElementException when no nodes are available");
+ } catch (NoSuchElementException e) {
+ // success
+ }
+
+ // re-aquire iterator
+ it = rs.getNodes();
+ try {
+ it.skip(count + 1);
+ fail("skip() must throw a NoSuchElementException if one tries to skip past the end of the iterator");
+ } catch (NoSuchElementException e) {
+ // success
+ }
+ }
+ }
+}
Propchange: incubator/jackrabbit/trunk/core/src/test/org/apache/jackrabbit/test/api/query/NodeIteratorTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/jackrabbit/trunk/core/src/test/org/apache/jackrabbit/test/api/query/TestAll.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/test/org/apache/jackrabbit/test/api/query/TestAll.java?rev=216152&r1=216151&r2=216152&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/core/src/test/org/apache/jackrabbit/test/api/query/TestAll.java (original)
+++ incubator/jackrabbit/trunk/core/src/test/org/apache/jackrabbit/test/api/query/TestAll.java Wed Jul 13 06:05:01 2005
@@ -58,6 +58,7 @@
suite.addTestSuite(GetStatementTest.class);
suite.addTestSuite(GetSupportedQueryLanguagesTest.class);
+ suite.addTestSuite(NodeIteratorTest.class);
suite.addTestSuite(GetPropertyNamesTest.class);
suite.addTestSuite(PredicatesTest.class);
suite.addTestSuite(SimpleSelectionTest.class);