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);
}