You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2012/07/21 18:42:59 UTC

svn commit: r1364121 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak: core/TreeImpl.java plugins/memory/MemoryNodeStateBuilder.java spi/state/NodeStateBuilder.java

Author: jukka
Date: Sat Jul 21 16:42:58 2012
New Revision: 1364121

URL: http://svn.apache.org/viewvc?rev=1364121&view=rev
Log:
OAK-175: MemoryNodeStateBuilder inefficient for large child node lists

Add NodeStateBuilder.hasChildNode() and .getChildNodeNames() to reduce the number of .getNodeState() calls.

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStateBuilder.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateBuilder.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java?rev=1364121&r1=1364120&r2=1364121&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java Sat Jul 21 16:42:58 2012
@@ -32,7 +32,6 @@ import org.apache.jackrabbit.oak.api.Cor
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.core.RootImpl.PurgeListener;
-import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStateBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeStateDiff;
@@ -214,7 +213,7 @@ public class TreeImpl implements Tree, P
 
     @Override
     public boolean hasChild(String name) {
-        return getNodeState().getChildNode(name) != null;
+        return getNodeStateBuilder().hasChildNode(name);
     }
 
     @Override
@@ -225,15 +224,14 @@ public class TreeImpl implements Tree, P
     @Override
     public Iterable<Tree> getChildren() {
         return Iterables.transform(
-                getNodeState().getChildNodeEntries(),
-                new Function<ChildNodeEntry, Tree>() {
+                getNodeStateBuilder().getChildNodeNames(),
+                new Function<String, Tree>() {
                     @Override
-                    public Tree apply(ChildNodeEntry input) {
-                        String childName = input.getName();
-                        TreeImpl child = children.get(childName);
+                    public Tree apply(String input) {
+                        TreeImpl child = children.get(input);
                         if (child == null) {
-                            child = new TreeImpl(root, TreeImpl.this, childName);
-                            children.put(childName, child);
+                            child = new TreeImpl(root, TreeImpl.this, input);
+                            children.put(input, child);
                         }
                         return  child;
                     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStateBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStateBuilder.java?rev=1364121&r1=1364120&r2=1364121&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStateBuilder.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStateBuilder.java Sat Jul 21 16:42:58 2012
@@ -18,12 +18,16 @@ package org.apache.jackrabbit.oak.plugin
 
 import org.apache.jackrabbit.oak.api.CoreValue;
 import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStateBuilder;
 
+import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
 
 import java.util.Collections;
 import java.util.HashMap;
@@ -118,6 +122,36 @@ public class MemoryNodeStateBuilder impl
         return count;
     }
 
+    public boolean hasChildNode(String name) {
+        NodeStateBuilder builder = builders.get(name);
+        if (builder != null) {
+            return true;
+        } else if (builders.containsKey(name)) {
+            return false;
+        } else {
+            return base.getChildNode(name) != null;
+        }
+    }
+
+    @Override
+    public Iterable<String> getChildNodeNames() {
+        Iterable<String> unmodified = Iterables.transform(
+                base.getChildNodeEntries(),
+                new Function<ChildNodeEntry, String>() {
+                    @Override
+                    public String apply(ChildNodeEntry input) {
+                        return input.getName();
+                    }
+                });
+        Predicate<String> unmodifiedFilter = Predicates.not(Predicates.in(
+                ImmutableSet.copyOf(builders.keySet())));
+        Set<String> modified = ImmutableSet.copyOf(
+                Maps.filterValues(builders, Predicates.notNull()).keySet());
+        return Iterables.concat(
+                Iterables.filter(unmodified, unmodifiedFilter),
+                modified);
+    }
+
     @Override
     public void setNode(String name, NodeState nodeState) {
         if (nodeState == null) {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateBuilder.java?rev=1364121&r1=1364120&r2=1364121&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateBuilder.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateBuilder.java Sat Jul 21 16:42:58 2012
@@ -45,6 +45,22 @@ public interface NodeStateBuilder {
     long getChildNodeCount();
 
     /**
+     * Checks whether the named child node currently exists.
+     *
+     * @param name child node name
+     * @return {@code true} if the named child node exists,
+     *         {@code false} otherwise
+     */
+    boolean hasChildNode(String name);
+
+    /**
+     * Returns the names of current child nodes.
+     *
+     * @return child node names
+     */
+    Iterable<String> getChildNodeNames();
+
+    /**
      * Add a sub-tree
      *
      * @param name  name child node containing the sub-tree