You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by md...@apache.org on 2010/08/05 19:00:54 UTC

svn commit: r982695 - in /jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons: flat/BTreeManager.java flat/Rank.java flat/TreeTraverser.java iterator/LazyIteratorChain.java

Author: mduerig
Date: Thu Aug  5 17:00:53 2010
New Revision: 982695

URL: http://svn.apache.org/viewvc?rev=982695&view=rev
Log:
JCR-2688: Provide utility for handling large number of child nodes/properties
applied Jukka's patch with some modifications

Modified:
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/BTreeManager.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/Rank.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/TreeTraverser.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/LazyIteratorChain.java

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/BTreeManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/BTreeManager.java?rev=982695&r1=982694&r2=982695&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/BTreeManager.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/BTreeManager.java Thu Aug  5 17:00:53 2010
@@ -16,12 +16,7 @@
  */
 package org.apache.jackrabbit.commons.flat;
 
-import static org.apache.jackrabbit.commons.iterator.Iterators.filterIterator;
-import static org.apache.jackrabbit.commons.iterator.Iterators.nodes;
-import static org.apache.jackrabbit.commons.iterator.Iterators.properties;
-
 import org.apache.jackrabbit.JcrConstants;
-import org.apache.jackrabbit.commons.iterator.Predicate;
 
 import javax.jcr.Item;
 import javax.jcr.Node;
@@ -32,6 +27,7 @@ import javax.jcr.RepositoryException;
 
 import java.util.Comparator;
 import java.util.Iterator;
+import java.util.NoSuchElementException;
 
 /**
  * <p>
@@ -256,31 +252,56 @@ public class BTreeManager implements Tre
     /**
      * Returns a {@link SizedIterator} of the child nodes of <code>node</code>.
      */
+    @SuppressWarnings("unchecked")
     protected SizedIterator<Node> getNodes(Node node) throws RepositoryException {
         NodeIterator nodes = node.getNodes();
-        return getSizedIterator(nodes(nodes), nodes.getSize());
+        return getSizedIterator(nodes, nodes.getSize());
     }
 
     /**
-     * Returns a {@link SizedIterator} of the properties of <code>node</code> which
-     * excludes the <code>jcr.primaryType</code> property.
+     * Returns a {@link SizedIterator} of the properties of <code>node</code>
+     * which excludes the <code>jcr.primaryType</code> property.
      */
-    protected SizedIterator<Property> getProperties(final Node node) throws RepositoryException {
+    protected SizedIterator<Property> getProperties(Node node) throws RepositoryException {
         final PropertyIterator properties = node.getProperties();
 
-        Iterator<Property> filtered = filterIterator(properties(properties), new Predicate<Property>() {
-            public boolean evaluate(Property property) {
-                try {
-                    return !JcrConstants.JCR_PRIMARYTYPE.equals(property.getName());
+        Iterator<Property> filteredIterator = new Iterator<Property>() {
+            Property next = null;
+
+            public boolean hasNext() {
+                while (next == null && properties.hasNext()) {
+                    Property p = properties.nextProperty();
+                    try {
+                        if (!JcrConstants.JCR_PRIMARYTYPE.equals(p.getName())) {
+                            next = p;
+                        }
+                    }
+                    catch (RepositoryException ignore) {
+                        next = p;
+                    }
                 }
-                catch (RepositoryException ignore) {
-                    return true;
+
+                return next != null;
+            }
+
+            public Property next() {
+                if (hasNext()) {
+                    Property property = next;
+                    next = null;
+                    return property;
                 }
+                else {
+                    throw new NoSuchElementException();
+                }
+            }
+
+            public void remove() {
+                throw new UnsupportedOperationException();
             }
-        });
+        };
 
         long size = properties.getSize();
-        return getSizedIterator(filtered, size > 0 ? size - 1 : size);
+        return getSizedIterator(filteredIterator, size > 0 ? size - 1 : size);
     }
 
     /**
@@ -311,7 +332,7 @@ public class BTreeManager implements Tre
     /**
      * Wraps <code>iterator</code> into a {@link SizedIterator} given a
      * <code>size</code>. The value of the <code>size</code> parameter must
-     * correctly reflect the number of items in <code>iterator</code>.Ê
+     * correctly reflect the number of items in <code>iterator</code>.
      */
     protected final <T> SizedIterator<T> getSizedIterator(final Iterator<T> iterator, final long size) {
         return new SizedIterator<T>() {

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/Rank.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/Rank.java?rev=982695&r1=982694&r2=982695&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/Rank.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/Rank.java Thu Aug  5 17:00:53 2010
@@ -16,11 +16,10 @@
  */
 package org.apache.jackrabbit.commons.flat;
 
-import static org.apache.jackrabbit.commons.iterator.Iterators.arrayIterator;
-import static org.apache.jackrabbit.commons.iterator.Iterators.empty;
-
 import java.lang.reflect.Array;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -192,10 +191,9 @@ public class Rank<T> {
         if (n > 0) {
             take(n, first, values.length - 1);
             first += n;
-            return arrayIterator(values, first - n, first);
-        }
-        else {
-            return empty();
+            return Arrays.asList(values).subList(first - n, first).iterator();
+        } else {
+            return Collections.<T>emptySet().iterator();
         }
     }
 

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/TreeTraverser.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/TreeTraverser.java?rev=982695&r1=982694&r2=982695&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/TreeTraverser.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/TreeTraverser.java Thu Aug  5 17:00:53 2010
@@ -16,10 +16,6 @@
  */
 package org.apache.jackrabbit.commons.flat;
 
-import static org.apache.jackrabbit.commons.iterator.Iterators.empty;
-import static org.apache.jackrabbit.commons.iterator.Iterators.iteratorChain;
-import static org.apache.jackrabbit.commons.iterator.Iterators.properties;
-import static org.apache.jackrabbit.commons.iterator.Iterators.singleton;
 import static org.apache.jackrabbit.commons.iterator.LazyIteratorChain.chain;
 
 import javax.jcr.Item;
@@ -28,6 +24,7 @@ import javax.jcr.NodeIterator;
 import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 
+import java.util.Collections;
 import java.util.Iterator;
 
 /**
@@ -247,16 +244,16 @@ public final class TreeTraverser impleme
      * Returns an iterator of the nodes of the sub-tree rooted at
      * <code>node</code>.
      */
+    @SuppressWarnings("unchecked")
     private Iterator<Node> iterator(Node node) {
         try {
             if (inclusionPolicy.include(node)) {
-                return iteratorChain(singleton(node), chain(childIterators(node)));
+                return chain(singleton(node), chain(childIterators(node)));
             }
             else {
                 return chain(childIterators(node));
             }
-        }
-        catch (RepositoryException e) {
+        } catch (RepositoryException e) {
             errorHandler.call(node, e);
             return empty();
         }
@@ -265,25 +262,21 @@ public final class TreeTraverser impleme
     /**
      * Returns an iterator of iterators of the child nodes of <code>node</code>.
      */
-    private Iterator<Iterator<Node>> childIterators(final Node node) {
+    private Iterator<Iterator<Node>> childIterators(Node node) {
         try {
+            final NodeIterator childNodes = node.getNodes();
             return new Iterator<Iterator<Node>>() {
-                private final NodeIterator childNodes = node.getNodes();
-
                 public boolean hasNext() {
                     return childNodes.hasNext();
                 }
-
                 public Iterator<Node> next() {
                     return iterator(childNodes.nextNode());
                 }
-
                 public void remove() {
                     throw new UnsupportedOperationException();
                 }
             };
-        }
-        catch (RepositoryException e) {
+        } catch (RepositoryException e) {
             errorHandler.call(node, e);
             return empty();
         }
@@ -303,12 +296,12 @@ public final class TreeTraverser impleme
                 return nodes.hasNext();
             }
 
+            @SuppressWarnings("unchecked")
             public Iterator<Property> next() {
                 Node n = nodes.next();
                 try {
-                    return properties(n.getProperties());
-                }
-                catch (RepositoryException e) {
+                    return n.getProperties();
+                } catch (RepositoryException e) {
                     errorHandler.call(n, e);
                     return empty();
                 }
@@ -320,4 +313,15 @@ public final class TreeTraverser impleme
         };
     }
 
+    // -----------------------------------------------------< utility >---
+
+    private static <T> Iterator<T> empty() {
+        return Collections.<T>emptySet().iterator();
+    }
+
+    private <T> Iterator<T> singleton(T value) {
+        return Collections.singleton(value).iterator();
+    }
+
+
 }

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/LazyIteratorChain.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/LazyIteratorChain.java?rev=982695&r1=982694&r2=982695&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/LazyIteratorChain.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/LazyIteratorChain.java Thu Aug  5 17:00:53 2010
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.commons.iterator;
 
+import java.util.Arrays;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
@@ -42,11 +43,27 @@ public class LazyIteratorChain<T> implem
         return new LazyIteratorChain<T>(iterators);
     }
 
+    /**
+     * Returns the concatenation of all iterators in <code>iterators</code>.
+     *
+     * @param <T>
+     * @param iterators
+     * @return
+     */
+    public static <T> Iterator<T> chain(Iterator<T>... iterators) {
+        return new LazyIteratorChain<T>(iterators);
+    }
+
     public LazyIteratorChain(Iterator<Iterator<T>> iterators) {
         super();
         this.iterators = iterators;
     }
 
+    public LazyIteratorChain(Iterator<T>... iterators) {
+        super();
+        this.iterators = Arrays.asList(iterators).iterator();
+    }
+
     public boolean hasNext() {
         while ((currentIterator == null || !currentIterator.hasNext()) && iterators.hasNext()) {
             currentIterator = iterators.next();