[ https://issues.apache.org/jira/browse/JCR-3793?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14048852#comment-14048852 ]
Thomas Mueller commented on JCR-3793: ------------------------------------- Potential patch for Oak (doesn't help much unfortunately): {noformat} ### Eclipse Workspace Patch 1.0 #P oak-core Index: src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java =================================================================== --- src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java (revision 1604905) +++ src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java (working copy) @@ -249,6 +249,23 @@ if (name == null) { names.add(this.name); } + PropertyState old = parent.nodeBuilder.getProperty(OAK_CHILD_ORDER); + boolean isChanged; + if (old.count() != names.size()) { + isChanged = true; + } else { + isChanged = false; + for (int i = 0; i < old.count(); i++) { + String oldName = old.getValue(Type.STRING, i); + if (!oldName.equals(names.get(i))) { + isChanged = true; + break; + } + } + } + if (!isChanged) { + return false; + } parent.nodeBuilder.setProperty(OAK_CHILD_ORDER, names, NAMES); root.updated(); return true; {noformat} > vlt: with many child nodes, NodeNameList.restoreOrder is very slow with Oak > --------------------------------------------------------------------------- > > Key: JCR-3793 > URL: https://issues.apache.org/jira/browse/JCR-3793 > Project: Jackrabbit Content Repository > Issue Type: Improvement > Reporter: Thomas Mueller > Attachments: JCR-3793.patch, ReorderTest.java > > > The method org.apache.jackrabbit.vault.fs.api.NodeNameList.restoreOrder > re-orders orderable child nodes by using Node.orderBefore. This is very slow > if there are many child nodes, specially with Oak (minutes for 10'000 nodes, > while only about 1 second for Jackrabbit 2.x). > [~tripod], I wonder if a possible solution is to first check whether > re-ordering is needed? For example using: > {noformat} > boolean isOrdered(ArrayList<String> names, Node parent) > throws RepositoryException { > NodeIterator it1 = parent.getNodes(); > for (Iterator<String> it2 = names.iterator(); it2.hasNext();) { > if (!it1.hasNext() || > !it1.nextNode().getName().equals(it2.next())) { > return false; > } > } > return !it1.hasNext(); > } > {noformat} -- This message was sent by Atlassian JIRA (v6.2#6252)