Author: jukka
Date: Thu Mar 20 15:11:41 2014
New Revision: 1579656

URL: http://svn.apache.org/r1579656
Log:
OAK-1584: Performance regression of adding and removinf child nodes after 
OAK-850

Optimize the ordering operations from O(n log n) to O(n)

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java?rev=1579656&r1=1579655&r2=1579656&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java
 Thu Mar 20 15:11:41 2014
@@ -22,7 +22,7 @@ import static com.google.common.base.Pre
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.Lists.newArrayList;
-import static com.google.common.collect.Sets.newLinkedHashSet;
+import static com.google.common.collect.Lists.newArrayListWithCapacity;
 import static org.apache.jackrabbit.oak.api.Type.NAMES;
 import static org.apache.jackrabbit.oak.commons.PathUtils.elements;
 import static org.apache.jackrabbit.oak.commons.PathUtils.isAbsolute;
@@ -30,7 +30,6 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.spi.state.NodeStateUtils.isHidden;
 
 import java.util.List;
-import java.util.Set;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
@@ -177,8 +176,12 @@ class MutableTree extends AbstractTree {
             nodeBuilder.remove();
             PropertyState order = 
parent.nodeBuilder.getProperty(OAK_CHILD_ORDER);
             if (order != null) {
-                Set<String> names = newLinkedHashSet(order.getValue(NAMES));
-                names.remove(name);
+                List<String> names = newArrayListWithCapacity(order.count());
+                for (String n : order.getValue(NAMES)) {
+                    if (!n.equals(name)) {
+                        names.add(n);
+                    }
+                }
                 parent.nodeBuilder.setProperty(OAK_CHILD_ORDER, names, NAMES);
             }
             root.updated();
@@ -196,7 +199,12 @@ class MutableTree extends AbstractTree {
             nodeBuilder.setChildNode(name);
             PropertyState order = nodeBuilder.getProperty(OAK_CHILD_ORDER);
             if (order != null) {
-                Set<String> names = newLinkedHashSet(order.getValue(NAMES));
+                List<String> names = newArrayListWithCapacity(order.count() + 
1);
+                for (String n : order.getValue(NAMES)) {
+                    if (!n.equals(name)) {
+                        names.add(n);
+                    }
+                }
                 names.add(name);
                 nodeBuilder.setProperty(OAK_CHILD_ORDER, names, NAMES);
             }


Reply via email to