You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by mr...@apache.org on 2014/11/26 17:15:20 UTC

svn commit: r1641843 - /jackrabbit/oak/trunk/oak-run/src/main/js/oak-mongo.js

Author: mreutegg
Date: Wed Nov 26 16:15:20 2014
New Revision: 1641843

URL: http://svn.apache.org/r1641843
Log:
OAK-2299: oak.removeDescendantsAndSelf() does not remove descendants with long paths

Modified:
    jackrabbit/oak/trunk/oak-run/src/main/js/oak-mongo.js

Modified: jackrabbit/oak/trunk/oak-run/src/main/js/oak-mongo.js
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/js/oak-mongo.js?rev=1641843&r1=1641842&r2=1641843&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/main/js/oak-mongo.js (original)
+++ jackrabbit/oak/trunk/oak-run/src/main/js/oak-mongo.js Wed Nov 26 16:15:20 2014
@@ -178,8 +178,28 @@ var oak = (function(global){
     api.removeDescendantsAndSelf = function(path) {
         var count = 0;
         var depth = pathDepth(path);
+        var id = depth + ":" + path;
+        // current node at path
+        var result = db.nodes.remove({_id: id});
+        count += result.nRemoved;
+        // might be a long path
+        result = db.nodes.remove(longPathQuery(path));
+        count += result.nRemoved;
+        // descendants
+        var prefix = path + "/";
+        depth++;
         while (true) {
-            var result = db.nodes.remove({_id: pathFilter(depth++, path)});
+            result = db.nodes.remove(longPathFilter(depth, prefix));
+            count += result.nRemoved;
+            result = db.nodes.remove({_id: pathFilter(depth++, prefix)});
+            count += result.nRemoved;
+            if (result.nRemoved == 0) {
+                break;
+            }
+        }
+        // descendants further down the hierarchy with long path
+        while (true) {
+            result = db.nodes.remove(longPathFilter(depth++, prefix));
             if (result.nRemoved == 0) {
                 break;
             }
@@ -333,6 +353,20 @@ var oak = (function(global){
         return new RegExp("^"+ depth + ":" + prefix);
     };
 
+    var longPathFilter = function (depth, prefix) {
+        var filter = {};
+        filter._id = new RegExp("^" + depth + ":h");
+        filter._path = new RegExp("^" + prefix);
+        return filter;
+    };
+
+    var longPathQuery = function (path) {
+        var query = {};
+        query._id = new RegExp("^" + pathDepth(path) + ":h");
+        query._path = path;
+        return query;
+    };
+
     //http://stackoverflow.com/a/20732091/1035417
     var humanFileSize = function (size) {
         var i = Math.floor( Math.log(size) / Math.log(1024) );