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 16:59:07 UTC

svn commit: r216172 - in /incubator/jackrabbit/trunk/core/src: java/org/apache/jackrabbit/core/query/lucene/ test/org/apache/jackrabbit/core/query/

Author: mreutegg
Date: Wed Jul 13 07:59:05 2005
New Revision: 216172

URL: http://svn.apache.org/viewcvs?rev=216172&view=rev
Log:
- Keep getPosition() values continuous even in case of invalid nodes.

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/core/query/SkipDeletedNodesTest.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=216172&r1=216171&r2=216172&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 07:59:05 2005
@@ -107,12 +107,17 @@
      * of nodes actually returned by calls to hasNext() / getNextNode()! This
      * is because this iterator works on a lazy instantiation basis and while
      * iterating over the nodes some of them might have been deleted in the
-     * meantime. Those will not be returned by getNextNode().
+     * meantime. Those will not be returned by getNextNode(). As soon as an
+     * invalid node is detected, the size of this iterator is adjusted.
      *
      * @return the number of node in this iterator.
      */
     public long getSize() {
-        return uuids.length;
+        if (orderedNodes != null) {
+            return orderedNodes.getSize();
+        } else {
+            return uuids.length;
+        }
     }
 
     /**

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=216172&r1=216171&r2=216172&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 07:59:05 2005
@@ -46,6 +46,9 @@
     /** Current position in the UUID array */
     protected int pos = -1;
 
+    /** Number of invalid nodes */
+    protected int invalid = 0;
+
     /** Reference to the next node instance */
     private NodeImpl next;
 
@@ -128,12 +131,13 @@
      * of nodes actually returned by calls to hasNext() / getNextNode()! This
      * is because this iterator works on a lazy instantiation basis and while
      * iterating over the nodes some of them might have been deleted in the
-     * meantime. Those will not be returned by getNextNode().
+     * meantime. Those will not be returned by getNextNode(). As soon as an
+     * invalid node is detected, the size of this iterator is adjusted.
      *
      * @return the number of node in this iterator.
      */
     public long getSize() {
-        return uuids.length;
+        return uuids.length - invalid;
     }
 
     /**
@@ -141,7 +145,7 @@
      * @return the current position in this <code>NodeIterator</code>.
      */
     public long getPosition() {
-        return pos;
+        return pos - invalid;
     }
 
     /**
@@ -187,9 +191,10 @@
             try {
                 next = (NodeImpl) itemMgr.getItem(new NodeId(uuids[pos + 1]));
             } catch (RepositoryException e) {
-                log.error("Exception retrieving Node with UUID: "
+                log.warn("Exception retrieving Node with UUID: "
                         + uuids[pos + 1] + ": " + e.toString());
                 // try next
+                invalid++;
                 pos++;
             }
         }

Modified: incubator/jackrabbit/trunk/core/src/test/org/apache/jackrabbit/core/query/SkipDeletedNodesTest.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/test/org/apache/jackrabbit/core/query/SkipDeletedNodesTest.java?rev=216172&r1=216171&r2=216172&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/core/src/test/org/apache/jackrabbit/core/query/SkipDeletedNodesTest.java (original)
+++ incubator/jackrabbit/trunk/core/src/test/org/apache/jackrabbit/core/query/SkipDeletedNodesTest.java Wed Jul 13 07:59:05 2005
@@ -71,7 +71,9 @@
 
         // iterate over nodes
         log.println("Result nodes:");
+        int count = 0;
         for (NodeIterator it = res.getNodes(); it.hasNext(); ) {
+            assertEquals("Wrong value for getPosition().", count++, it.getPosition());
             try {
                 log.println(it.nextNode().getPath());
             } catch (InvalidItemStateException e) {
@@ -100,8 +102,10 @@
         testRootNode.save();
 
         // iterate over nodes
+        int count = 0;
         log.println("Result nodes:");
         for (NodeIterator it = res.getNodes(); it.hasNext(); ) {
+            assertEquals("Wrong value for getPosition().", count++, it.getPosition());
             try {
                 log.println(it.nextNode().getPath());
             } catch (InvalidItemStateException e) {
@@ -130,8 +134,10 @@
         testRootNode.save();
 
         // iterate over nodes
+        int count = 0;
         log.println("Result nodes:");
         for (NodeIterator it = res.getNodes(); it.hasNext(); ) {
+            assertEquals("Wrong value for getPosition().", count++, it.getPosition());
             try {
                 log.println(it.nextNode().getPath());
             } catch (InvalidItemStateException e) {
@@ -166,8 +172,48 @@
         testRootNode.save();
 
         // iterate over nodes
+        int count = 0;
         log.println("Result nodes:");
         while (it.hasNext()) {
+            assertEquals("Wrong value for getPosition().", count++, it.getPosition());
+            try {
+                log.println(it.nextNode().getPath());
+            } catch (InvalidItemStateException e) {
+                // this is allowed
+                log.println("Invalid: <deleted>");
+            }
+        }
+    }
+
+    /**
+     * Executes a query with one session and removes a node from that query
+     * result with another session.
+     * </p>This test is different from the other tests that it removes the
+     * node after another session has called hasNext() to retrieve the node
+     * that gets deleted.
+     */
+    public void testRemoveSomeNodeAfterHasNext() throws RepositoryException {
+        testRootNode.addNode("node1");
+        Node n2 = testRootNode.addNode("node2");
+        testRootNode.addNode("node3");
+        testRootNode.save();
+
+        // query the workspace for all three nodes
+        String stmt = testPath + "/*";
+        QueryResult res = qm.createQuery(stmt, Query.XPATH).execute();
+
+        NodeIterator it = res.getNodes();
+        it.hasNext();
+
+        // now remove the second node
+        n2.remove();
+        testRootNode.save();
+
+        // iterate over nodes
+        int count = 0;
+        log.println("Result nodes:");
+        while (it.hasNext()) {
+            assertEquals("Wrong value for getPosition().", count++, it.getPosition());
             try {
                 log.println(it.nextNode().getPath());
             } catch (InvalidItemStateException e) {