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