From e0c0f3c380c8fcbad998fbac2826dc9178aec057 Mon Sep 17 00:00:00 2001 From: paulovictorv Date: Mon, 6 May 2024 08:58:36 -0300 Subject: [PATCH] fix behavior when updating values where the value was previously null --- .../no2/collection/NitriteDocument.java | 10 ++++++++-- .../collection/CollectionUpdateTest.java | 19 +++++++++++++++---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/nitrite/src/main/java/org/dizitart/no2/collection/NitriteDocument.java b/nitrite/src/main/java/org/dizitart/no2/collection/NitriteDocument.java index 314d08619..513b732f0 100644 --- a/nitrite/src/main/java/org/dizitart/no2/collection/NitriteDocument.java +++ b/nitrite/src/main/java/org/dizitart/no2/collection/NitriteDocument.java @@ -176,8 +176,14 @@ public Document merge(Document document) { // if the value is a document, merge it recursively if (containsKey(key)) { // if the current document already contains the key, - // then merge the embedded document - get(key, Document.class).merge((Document) value); + // and the value is not null, merge it + Document pairs = get(key, Document.class); + if (pairs != null) { + pairs.merge((Document) value); + } else { + //otherwise, just set the value to whatever was provided + put(key, value); + } } else { // if the current document does not contain the key, // then put the embedded document as it is diff --git a/nitrite/src/test/java/org/dizitart/no2/integration/collection/CollectionUpdateTest.java b/nitrite/src/test/java/org/dizitart/no2/integration/collection/CollectionUpdateTest.java index 4dad51555..959a2b3c0 100644 --- a/nitrite/src/test/java/org/dizitart/no2/integration/collection/CollectionUpdateTest.java +++ b/nitrite/src/test/java/org/dizitart/no2/integration/collection/CollectionUpdateTest.java @@ -17,10 +17,7 @@ package org.dizitart.no2.integration.collection; -import org.dizitart.no2.collection.Document; -import org.dizitart.no2.collection.DocumentCursor; -import org.dizitart.no2.collection.NitriteCollection; -import org.dizitart.no2.collection.UpdateOptions; +import org.dizitart.no2.collection.*; import org.dizitart.no2.common.WriteResult; import org.dizitart.no2.exceptions.NitriteIOException; import org.dizitart.no2.exceptions.NotIdentifiableException; @@ -299,4 +296,18 @@ public void testIssue151() { assertEquals(coll.find(where("fruit").eq("Apple")).size(), 1); } + + @Test + public void testUpdatePreviouslyNullObject() { + Document doc1 = createDocument().put("fruitType", null); + NitriteCollection coll = db.getCollection("test"); + + WriteResult insert = coll.insert(doc1); + NitriteId next = insert.iterator().next(); + Document doc2 = createDocument().put("_id", next.getIdValue()).put("fruitType", createDocument().put("family", "citric")); + coll.update(doc2); + + assertEquals(coll.find(where("_id").eq(next.getIdValue())).size(), 1); + assertNotNull(coll.find(where("_id").eq(next.getIdValue())).firstOrNull().get("fruitType")); + } }