[ 
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)

Reply via email to