Author: jukka
Date: Thu Mar 20 14:25:31 2014
New Revision: 1579637

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

Don't scan the full list of child nodes whenever adding or removing children 
(to an orderable node)

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=1579637&r1=1579636&r2=1579637&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 14:25:31 2014
@@ -22,6 +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 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;
@@ -29,6 +30,7 @@ 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;
@@ -173,7 +175,12 @@ class MutableTree extends AbstractTree {
         beforeWrite();
         if (parent != null && parent.hasChild(name)) {
             nodeBuilder.remove();
-            updateChildOrder(false);
+            PropertyState order = 
parent.nodeBuilder.getProperty(OAK_CHILD_ORDER);
+            if (order != null) {
+                Set<String> names = newLinkedHashSet(order.getValue(NAMES));
+                names.remove(name);
+                parent.nodeBuilder.setProperty(OAK_CHILD_ORDER, names, NAMES);
+            }
             root.updated();
             return true;
         } else {
@@ -187,7 +194,12 @@ class MutableTree extends AbstractTree {
         beforeWrite();
         if (!super.hasChild(name)) {
             nodeBuilder.setChildNode(name);
-            updateChildOrder(false);
+            PropertyState order = nodeBuilder.getProperty(OAK_CHILD_ORDER);
+            if (order != null) {
+                Set<String> names = newLinkedHashSet(order.getValue(NAMES));
+                names.add(name);
+                nodeBuilder.setProperty(OAK_CHILD_ORDER, names, NAMES);
+            }
             root.updated();
         }
         return createChild(name);


Reply via email to