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 2015/10/27 14:46:51 UTC
svn commit: r1710816 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
test/java/org/apache/jackrabbit/oak/plugins/document/MongoDocumentStoreIT.java
Author: mreutegg
Date: Tue Oct 27 13:46:51 2015
New Revision: 1710816
URL: http://svn.apache.org/viewvc?rev=1710816&view=rev
Log:
OAK-3556: MongoDocumentStore may create incomplete document
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoDocumentStoreIT.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java?rev=1710816&r1=1710815&r2=1710816&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java Tue Oct 27 13:46:51 2015
@@ -871,8 +871,19 @@ public class MongoDocumentStore implemen
throw new IllegalStateException(
"SET_MAP_ENTRY must not have null revision");
}
- DBObject value = new RevisionEntry(r, op.value);
- inserts[i].put(k.getName(), value);
+ DBObject value = (DBObject) inserts[i].get(k.getName());
+ if (value == null) {
+ value = new RevisionEntry(r, op.value);
+ inserts[i].put(k.getName(), value);
+ } else if (value.keySet().size() == 1) {
+ String key = value.keySet().iterator().next();
+ Object val = value.get(key);
+ value = new BasicDBObject(key, val);
+ value.put(r.toString(), op.value);
+ inserts[i].put(k.getName(), value);
+ } else {
+ value.put(r.toString(), op.value);
+ }
break;
}
case REMOVE_MAP_ENTRY:
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoDocumentStoreIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoDocumentStoreIT.java?rev=1710816&r1=1710815&r2=1710816&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoDocumentStoreIT.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoDocumentStoreIT.java Tue Oct 27 13:46:51 2015
@@ -17,6 +17,7 @@
package org.apache.jackrabbit.oak.plugins.document;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@@ -161,4 +162,26 @@ public class MongoDocumentStoreIT extend
assertNotNull(mc2);
assertTrue(mc2.longValue() > mc1.longValue());
}
+
+ // OAK-3556
+ @Test
+ public void create() throws Exception {
+ DocumentStore store = mk.getDocumentStore();
+ String id = Utils.getIdFromPath("/test");
+ UpdateOp updateOp = new UpdateOp(id, true);
+ updateOp.set(Document.ID, id);
+ Revision r1 = Revision.newRevision(1);
+ updateOp.setMapEntry("p", r1, "a");
+ Revision r2 = Revision.newRevision(1);
+ updateOp.setMapEntry("p", r2, "b");
+ Revision r3 = Revision.newRevision(1);
+ updateOp.setMapEntry("p", r3, "c");
+ assertTrue(store.create(NODES, Collections.singletonList(updateOp)));
+
+ // maxCacheAge=0 forces loading from storage
+ NodeDocument doc = store.find(NODES, id, 0);
+ assertNotNull(doc);
+ Map<Revision, String> valueMap = doc.getValueMap("p");
+ assertEquals(3, valueMap.size());
+ }
}