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 th...@apache.org on 2013/03/11 17:39:29 UTC
svn commit: r1455226 - in /jackrabbit/oak/trunk/oak-mongomk/src:
main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java
main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java
test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java
Author: thomasm
Date: Mon Mar 11 16:39:29 2013
New Revision: 1455226
URL: http://svn.apache.org/r1455226
Log:
OAK-619 Lock-free MongoMK implementation (support the copy operation)
Modified:
jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java
jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java
jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java
Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java?rev=1455226&r1=1455225&r2=1455226&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java Mon Mar 11 16:39:29 2013
@@ -317,6 +317,10 @@ public class Commit {
public void moveNode(String sourcePath, String targetPath) {
diff.tag('>').key(sourcePath).value(targetPath);
}
+
+ public void copyNode(String sourcePath, String targetPath) {
+ diff.tag('*').key(sourcePath).value(targetPath);
+ }
public JsopWriter getDiff() {
return diff;
Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java?rev=1455226&r1=1455225&r2=1455226&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java Mon Mar 11 16:39:29 2013
@@ -538,6 +538,7 @@ public class MongoMK implements MicroKer
commit.updatePropertyDiff(p, propertyName, value);
break;
case '>': {
+ // TODO support moving nodes that were modified within this commit
t.read(':');
String sourcePath = path;
String targetPath = t.readString();
@@ -549,14 +550,15 @@ public class MongoMK implements MicroKer
break;
}
case '*': {
- // TODO possibly support target position notation
+ // TODO support copying nodes that were modified within this commit
t.read(':');
- String target = t.readString();
- if (!PathUtils.isAbsolute(target)) {
- target = PathUtils.concat(rootPath, target);
+ String sourcePath = path;
+ String targetPath = t.readString();
+ if (!PathUtils.isAbsolute(targetPath)) {
+ targetPath = PathUtils.concat(path, targetPath);
}
- String to = PathUtils.relativize("/", target);
- // TODO support copy operations
+ commit.copyNode(sourcePath, targetPath);
+ copyNode(sourcePath, targetPath, commit);
break;
}
default:
@@ -581,7 +583,15 @@ public class MongoMK implements MicroKer
return rev.toString();
}
+ private void copyNode(String sourcePath, String targetPath, Commit commit) {
+ moveOrCopyNode(false, sourcePath, targetPath, commit);
+ }
+
private void moveNode(String sourcePath, String targetPath, Commit commit) {
+ moveOrCopyNode(true, sourcePath, targetPath, commit);
+ }
+
+ private void moveOrCopyNode(boolean move, String sourcePath, String targetPath, Commit commit) {
// TODO Optimize - Move logic would not work well with very move of very large subtrees
// At minimum we can optimize by traversing breadth wise and collect node id
// and fetch them via '$in' queries
@@ -601,13 +611,15 @@ public class MongoMK implements MicroKer
n.copyTo(newNode);
commit.addNode(newNode);
- markAsDeleted(sourcePath, commit, false);
+ if (move) {
+ markAsDeleted(sourcePath, commit, false);
+ }
Node.Children c = readChildren(sourcePath, n.getId(),
commit.getRevision(), Integer.MAX_VALUE);
for (String srcChildPath : c.children) {
String childName = PathUtils.getName(srcChildPath);
String destChildPath = PathUtils.concat(targetPath, childName);
- moveNode(srcChildPath, destChildPath, commit);
+ moveOrCopyNode(move, srcChildPath, destChildPath, commit);
}
}
Modified: jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java?rev=1455226&r1=1455225&r2=1455226&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java Mon Mar 11 16:39:29 2013
@@ -135,6 +135,30 @@ public class SimpleTest {
assertEquals("{\":childNodeCount\":0}", test);
mk.dispose();
}
+
+ @Test
+ public void move() {
+ MongoMK mk = createMK();
+ String rev = mk.commit("/", "+\"test\":{\"x\":\"1\",\"child\": {}}", null, null);
+ rev = mk.commit("/", ">\"test\": \"/test2\"", rev, null);
+ String test = mk.getNodes("/test2", rev, 0, 0, Integer.MAX_VALUE, null);
+ assertEquals("{\"x\":\"1\",\"child\":{},\":childNodeCount\":1}", test);
+ test = mk.getNodes("/test", rev, 0, 0, Integer.MAX_VALUE, null);
+ assertNull(test);
+ mk.dispose();
+ }
+
+ @Test
+ public void copy() {
+ MongoMK mk = createMK();
+ String rev = mk.commit("/", "+\"test\":{\"x\":\"1\",\"child\": {}}", null, null);
+ rev = mk.commit("/", "*\"test\": \"/test2\"", rev, null);
+ String test = mk.getNodes("/test2", rev, 0, 0, Integer.MAX_VALUE, null);
+ assertEquals("{\"x\":\"1\",\"child\":{},\":childNodeCount\":1}", test);
+ test = mk.getNodes("/test", rev, 0, 0, Integer.MAX_VALUE, null);
+ assertEquals("{\"x\":\"1\",\"child\":{},\":childNodeCount\":1}", test);
+ mk.dispose();
+ }
@Test
public void escapePropertyName() {