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());
+    }
 }