diff --git a/CHANGELOG.md b/CHANGELOG.md index 669dda3ba..8b17b1a04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ - Nitrite now supports JPMS. It is now modular and can be used in Java 9 or above. - Version upgrade for several dependencies +### Issue Fixes + +- Fix for #935 + ## Release 4.2.2 - Mar 5, 2024 ### Issue Fixes diff --git a/nitrite-jackson-mapper/src/test/java/org/dizitart/no2/common/mapper/JacksonMapperTest.java b/nitrite-jackson-mapper/src/test/java/org/dizitart/no2/common/mapper/JacksonMapperTest.java index 4bf36c02d..87efabe06 100644 --- a/nitrite-jackson-mapper/src/test/java/org/dizitart/no2/common/mapper/JacksonMapperTest.java +++ b/nitrite-jackson-mapper/src/test/java/org/dizitart/no2/common/mapper/JacksonMapperTest.java @@ -17,183 +17,24 @@ package org.dizitart.no2.common.mapper; -import com.fasterxml.jackson.databind.DeserializationConfig; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.cfg.ContextAttributes; -import com.fasterxml.jackson.databind.introspect.VisibilityChecker; -import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator; -import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.BinaryNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import org.dizitart.no2.NitriteConfig; -import org.dizitart.no2.common.mapper.modules.NitriteIdModule; import org.dizitart.no2.exceptions.ObjectMappingException; import org.junit.Test; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; -import java.text.DateFormat; import static org.junit.Assert.*; public class JacksonMapperTest { - @Test - public void testConstructor() { - ObjectMapper objectMapper = (new JacksonMapper()).getObjectMapper(); - PolymorphicTypeValidator polymorphicTypeValidator = objectMapper.getPolymorphicTypeValidator(); - assertTrue(polymorphicTypeValidator instanceof LaissezFaireSubTypeValidator); - VisibilityChecker visibilityChecker = objectMapper.getVisibilityChecker(); - assertTrue(visibilityChecker instanceof VisibilityChecker.Std); - assertNull(objectMapper.getPropertyNamingStrategy()); - assertTrue(objectMapper - .getDeserializationContext() instanceof com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.Impl); - assertSame(objectMapper.getFactory(), objectMapper.getJsonFactory()); - assertTrue(objectMapper.getSerializerFactory() instanceof com.fasterxml.jackson.databind.ser.BeanSerializerFactory); - assertTrue(objectMapper - .getSerializerProvider() instanceof com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.Impl); - assertTrue(objectMapper - .getSerializerProviderInstance() instanceof com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.Impl); - assertTrue( - objectMapper.getSubtypeResolver() instanceof com.fasterxml.jackson.databind.jsontype.impl.StdSubtypeResolver); - DeserializationConfig deserializationConfig = objectMapper.getDeserializationConfig(); - assertTrue(deserializationConfig - .getAnnotationIntrospector() instanceof com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector); - assertNull(deserializationConfig.getActiveView()); - assertNull(deserializationConfig.getHandlerInstantiator()); - assertSame(visibilityChecker, deserializationConfig.getDefaultVisibilityChecker()); - assertTrue(deserializationConfig - .getClassIntrospector() instanceof com.fasterxml.jackson.databind.introspect.BasicClassIntrospector); - DateFormat expectedDateFormat = objectMapper.getDateFormat(); - assertSame(expectedDateFormat, deserializationConfig.getDateFormat()); - assertNull(deserializationConfig.getFullRootName()); - JsonNodeFactory expectedNodeFactory = objectMapper.getNodeFactory(); - assertSame(expectedNodeFactory, deserializationConfig.getNodeFactory()); - assertSame(polymorphicTypeValidator, deserializationConfig.getPolymorphicTypeValidator()); - assertNull(deserializationConfig.getDefaultMergeable()); - assertEquals(237020288, deserializationConfig.getDeserializationFeatures()); - assertTrue(deserializationConfig.getAttributes() instanceof ContextAttributes.Impl); - } - - @Test - public void testConstructor2() { - NitriteIdModule nitriteIdModule = new NitriteIdModule(); - NitriteIdModule nitriteIdModule1 = new NitriteIdModule(); - JacksonMapper jacksonMapper = new JacksonMapper(); - jacksonMapper.registerJacksonModule(nitriteIdModule); - jacksonMapper.registerJacksonModule(nitriteIdModule1); - jacksonMapper.registerJacksonModule(new NitriteIdModule()); - ObjectMapper objectMapper = jacksonMapper.getObjectMapper(); - PolymorphicTypeValidator polymorphicTypeValidator = objectMapper.getPolymorphicTypeValidator(); - assertTrue(polymorphicTypeValidator instanceof LaissezFaireSubTypeValidator); - VisibilityChecker visibilityChecker = objectMapper.getVisibilityChecker(); - assertTrue(visibilityChecker instanceof VisibilityChecker.Std); - assertNull(objectMapper.getPropertyNamingStrategy()); - assertTrue(objectMapper - .getDeserializationContext() instanceof com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.Impl); - assertSame(objectMapper.getFactory(), objectMapper.getJsonFactory()); - assertTrue(objectMapper.getSerializerFactory() instanceof com.fasterxml.jackson.databind.ser.BeanSerializerFactory); - assertTrue(objectMapper - .getSerializerProvider() instanceof com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.Impl); - assertTrue(objectMapper - .getSerializerProviderInstance() instanceof com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.Impl); - assertTrue( - objectMapper.getSubtypeResolver() instanceof com.fasterxml.jackson.databind.jsontype.impl.StdSubtypeResolver); - DeserializationConfig deserializationConfig = objectMapper.getDeserializationConfig(); - assertTrue(deserializationConfig - .getAnnotationIntrospector() instanceof com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector); - assertNull(deserializationConfig.getActiveView()); - assertNull(deserializationConfig.getHandlerInstantiator()); - assertSame(visibilityChecker, deserializationConfig.getDefaultVisibilityChecker()); - assertTrue(deserializationConfig - .getClassIntrospector() instanceof com.fasterxml.jackson.databind.introspect.BasicClassIntrospector); - DateFormat expectedDateFormat = objectMapper.getDateFormat(); - assertSame(expectedDateFormat, deserializationConfig.getDateFormat()); - assertNull(deserializationConfig.getFullRootName()); - JsonNodeFactory expectedNodeFactory = objectMapper.getNodeFactory(); - assertSame(expectedNodeFactory, deserializationConfig.getNodeFactory()); - assertSame(polymorphicTypeValidator, deserializationConfig.getPolymorphicTypeValidator()); - assertNull(deserializationConfig.getDefaultMergeable()); - assertEquals(237020288, deserializationConfig.getDeserializationFeatures()); - assertTrue(deserializationConfig.getAttributes() instanceof ContextAttributes.Impl); - } - - @Test - public void testConstructor3() { - JacksonMapper jacksonMapper = new JacksonMapper(); - jacksonMapper.registerJacksonModule(new NitriteIdModule()); - ObjectMapper objectMapper = jacksonMapper.getObjectMapper(); - PolymorphicTypeValidator polymorphicTypeValidator = objectMapper.getPolymorphicTypeValidator(); - assertTrue(polymorphicTypeValidator instanceof LaissezFaireSubTypeValidator); - VisibilityChecker visibilityChecker = objectMapper.getVisibilityChecker(); - assertTrue(visibilityChecker instanceof VisibilityChecker.Std); - assertNull(objectMapper.getPropertyNamingStrategy()); - assertTrue(objectMapper - .getDeserializationContext() instanceof com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.Impl); - assertSame(objectMapper.getFactory(), objectMapper.getJsonFactory()); - assertTrue(objectMapper.getSerializerFactory() instanceof com.fasterxml.jackson.databind.ser.BeanSerializerFactory); - assertTrue(objectMapper - .getSerializerProvider() instanceof com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.Impl); - assertTrue(objectMapper - .getSerializerProviderInstance() instanceof com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.Impl); - assertTrue( - objectMapper.getSubtypeResolver() instanceof com.fasterxml.jackson.databind.jsontype.impl.StdSubtypeResolver); - DeserializationConfig deserializationConfig = objectMapper.getDeserializationConfig(); - assertTrue(deserializationConfig - .getAnnotationIntrospector() instanceof com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector); - assertNull(deserializationConfig.getActiveView()); - assertNull(deserializationConfig.getHandlerInstantiator()); - assertSame(visibilityChecker, deserializationConfig.getDefaultVisibilityChecker()); - assertTrue(deserializationConfig - .getClassIntrospector() instanceof com.fasterxml.jackson.databind.introspect.BasicClassIntrospector); - DateFormat expectedDateFormat = objectMapper.getDateFormat(); - assertSame(expectedDateFormat, deserializationConfig.getDateFormat()); - assertNull(deserializationConfig.getFullRootName()); - JsonNodeFactory expectedNodeFactory = objectMapper.getNodeFactory(); - assertSame(expectedNodeFactory, deserializationConfig.getNodeFactory()); - assertSame(polymorphicTypeValidator, deserializationConfig.getPolymorphicTypeValidator()); - assertNull(deserializationConfig.getDefaultMergeable()); - assertEquals(237020288, deserializationConfig.getDeserializationFeatures()); - assertTrue(deserializationConfig.getAttributes() instanceof ContextAttributes.Impl); - } - @Test public void testGetObjectMapper() { ObjectMapper actualCreateObjectMapperResult = (new JacksonMapper()).getObjectMapper(); - PolymorphicTypeValidator polymorphicTypeValidator = actualCreateObjectMapperResult.getPolymorphicTypeValidator(); - assertTrue(polymorphicTypeValidator instanceof LaissezFaireSubTypeValidator); - VisibilityChecker visibilityChecker = actualCreateObjectMapperResult.getVisibilityChecker(); - assertTrue(visibilityChecker instanceof VisibilityChecker.Std); - assertNull(actualCreateObjectMapperResult.getPropertyNamingStrategy()); - assertTrue(actualCreateObjectMapperResult - .getDeserializationContext() instanceof com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.Impl); - assertSame(actualCreateObjectMapperResult.getFactory(), actualCreateObjectMapperResult.getJsonFactory()); - assertTrue(actualCreateObjectMapperResult - .getSerializerFactory() instanceof com.fasterxml.jackson.databind.ser.BeanSerializerFactory); - assertTrue(actualCreateObjectMapperResult - .getSerializerProvider() instanceof com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.Impl); - assertTrue(actualCreateObjectMapperResult - .getSerializerProviderInstance() instanceof com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.Impl); - assertTrue(actualCreateObjectMapperResult - .getSubtypeResolver() instanceof com.fasterxml.jackson.databind.jsontype.impl.StdSubtypeResolver); - DeserializationConfig deserializationConfig = actualCreateObjectMapperResult.getDeserializationConfig(); - assertTrue(deserializationConfig.getAttributes() instanceof ContextAttributes.Impl); - assertTrue(deserializationConfig - .getAnnotationIntrospector() instanceof com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector); - assertNull(deserializationConfig.getActiveView()); - assertEquals(237020288, deserializationConfig.getDeserializationFeatures()); - DateFormat expectedDateFormat = actualCreateObjectMapperResult.getDateFormat(); - assertSame(expectedDateFormat, deserializationConfig.getDateFormat()); - assertNull(deserializationConfig.getDefaultMergeable()); - assertSame(visibilityChecker, deserializationConfig.getDefaultVisibilityChecker()); - assertNull(deserializationConfig.getHandlerInstantiator()); - JsonNodeFactory expectedNodeFactory = actualCreateObjectMapperResult.getNodeFactory(); - assertSame(expectedNodeFactory, deserializationConfig.getNodeFactory()); - assertSame(polymorphicTypeValidator, deserializationConfig.getPolymorphicTypeValidator()); - assertTrue(deserializationConfig - .getClassIntrospector() instanceof com.fasterxml.jackson.databind.introspect.BasicClassIntrospector); - assertNull(deserializationConfig.getFullRootName()); - assertNull(deserializationConfig.getProblemHandlers()); + assertNotNull(actualCreateObjectMapperResult); } @Test diff --git a/nitrite-mvstore-adapter/src/test/java/org/dizitart/no2/integration/collection/CollectionFindTest.java b/nitrite-mvstore-adapter/src/test/java/org/dizitart/no2/integration/collection/CollectionFindTest.java index 7dedc072f..4d7814e5b 100644 --- a/nitrite-mvstore-adapter/src/test/java/org/dizitart/no2/integration/collection/CollectionFindTest.java +++ b/nitrite-mvstore-adapter/src/test/java/org/dizitart/no2/integration/collection/CollectionFindTest.java @@ -822,4 +822,32 @@ public void testByIdFilter() { result = collection.find(or(byId(nitriteId), where("tag").eq(document.get("tag")))).firstOrNull(); assertEquals(document, result); } + + @Test + public void testByNonExistingId() { + Document doc1 = createDocument("age", 31).put("tag", "one"); + Document doc2 = createDocument("age", 32).put("tag", "two"); + Document doc3 = createDocument("age", 33).put("tag", "three"); + Document doc4 = createDocument("age", 34).put("tag", "four"); + Document doc5 = createDocument("age", 35).put("tag", "five"); + + NitriteCollection collection = db.getCollection("tag"); + collection.insert(doc1, doc2, doc3, doc4, doc5); + + NitriteId nitriteId = NitriteId.newId(); + Document result = collection.find(byId(nitriteId)).firstOrNull(); + assertNull(result); + + result = collection.find(and(byId(nitriteId), where("age").notEq(null))).firstOrNull(); + assertNull(result); + + result = collection.find(or(byId(nitriteId), where("tag").eq("one"))).firstOrNull(); + assertNotNull(result); + assertEquals(result.get("tag"), "one"); + + DocumentCursor cursor = collection.find(where("_id").eq(nitriteId.getIdValue())); + Iterator idIter = cursor.iterator(); + assertFalse(idIter.hasNext()); + assertEquals(cursor.size(), 0); + } } diff --git a/nitrite-rocksdb-adapter/src/test/java/org/dizitart/no2/integration/collection/CollectionFindTest.java b/nitrite-rocksdb-adapter/src/test/java/org/dizitart/no2/integration/collection/CollectionFindTest.java index 7dedc072f..4d7814e5b 100644 --- a/nitrite-rocksdb-adapter/src/test/java/org/dizitart/no2/integration/collection/CollectionFindTest.java +++ b/nitrite-rocksdb-adapter/src/test/java/org/dizitart/no2/integration/collection/CollectionFindTest.java @@ -822,4 +822,32 @@ public void testByIdFilter() { result = collection.find(or(byId(nitriteId), where("tag").eq(document.get("tag")))).firstOrNull(); assertEquals(document, result); } + + @Test + public void testByNonExistingId() { + Document doc1 = createDocument("age", 31).put("tag", "one"); + Document doc2 = createDocument("age", 32).put("tag", "two"); + Document doc3 = createDocument("age", 33).put("tag", "three"); + Document doc4 = createDocument("age", 34).put("tag", "four"); + Document doc5 = createDocument("age", 35).put("tag", "five"); + + NitriteCollection collection = db.getCollection("tag"); + collection.insert(doc1, doc2, doc3, doc4, doc5); + + NitriteId nitriteId = NitriteId.newId(); + Document result = collection.find(byId(nitriteId)).firstOrNull(); + assertNull(result); + + result = collection.find(and(byId(nitriteId), where("age").notEq(null))).firstOrNull(); + assertNull(result); + + result = collection.find(or(byId(nitriteId), where("tag").eq("one"))).firstOrNull(); + assertNotNull(result); + assertEquals(result.get("tag"), "one"); + + DocumentCursor cursor = collection.find(where("_id").eq(nitriteId.getIdValue())); + Iterator idIter = cursor.iterator(); + assertFalse(idIter.hasNext()); + assertEquals(cursor.size(), 0); + } } diff --git a/nitrite/src/main/java/org/dizitart/no2/collection/operation/ReadOperations.java b/nitrite/src/main/java/org/dizitart/no2/collection/operation/ReadOperations.java index 807b47d98..3cf02c575 100644 --- a/nitrite/src/main/java/org/dizitart/no2/collection/operation/ReadOperations.java +++ b/nitrite/src/main/java/org/dizitart/no2/collection/operation/ReadOperations.java @@ -136,8 +136,12 @@ private RecordStream> findSuitableStream(FindPlan find if (findPlan.getByIdFilter() != null) { FieldBasedFilter byIdFilter = findPlan.getByIdFilter(); NitriteId nitriteId = NitriteId.createId((String) byIdFilter.getValue()); - Document document = nitriteMap.get(nitriteId); - rawStream = RecordStream.single(pair(nitriteId, document)); + if (nitriteMap.containsKey(nitriteId)) { + Document document = nitriteMap.get(nitriteId); + rawStream = RecordStream.single(pair(nitriteId, document)); + } else { + rawStream = RecordStream.empty(); + } } else { IndexDescriptor indexDescriptor = findPlan.getIndexDescriptor(); if (indexDescriptor != null) { diff --git a/nitrite/src/test/java/org/dizitart/no2/integration/collection/CollectionFindTest.java b/nitrite/src/test/java/org/dizitart/no2/integration/collection/CollectionFindTest.java index 5fd707307..49c501185 100644 --- a/nitrite/src/test/java/org/dizitart/no2/integration/collection/CollectionFindTest.java +++ b/nitrite/src/test/java/org/dizitart/no2/integration/collection/CollectionFindTest.java @@ -852,4 +852,32 @@ public void testByIdFilter() { result = collection.find(or(byId(nitriteId), where("tag").eq(document.get("tag")))).firstOrNull(); assertEquals(document, result); } + + @Test + public void testByNonExistingId() { + Document doc1 = createDocument("age", 31).put("tag", "one"); + Document doc2 = createDocument("age", 32).put("tag", "two"); + Document doc3 = createDocument("age", 33).put("tag", "three"); + Document doc4 = createDocument("age", 34).put("tag", "four"); + Document doc5 = createDocument("age", 35).put("tag", "five"); + + NitriteCollection collection = db.getCollection("tag"); + collection.insert(doc1, doc2, doc3, doc4, doc5); + + NitriteId nitriteId = NitriteId.newId(); + Document result = collection.find(byId(nitriteId)).firstOrNull(); + assertNull(result); + + result = collection.find(and(byId(nitriteId), where("age").notEq(null))).firstOrNull(); + assertNull(result); + + result = collection.find(or(byId(nitriteId), where("tag").eq("one"))).firstOrNull(); + assertNotNull(result); + assertEquals(result.get("tag"), "one"); + + DocumentCursor cursor = collection.find(where("_id").eq(nitriteId.getIdValue())); + Iterator idIter = cursor.iterator(); + assertFalse(idIter.hasNext()); + assertEquals(cursor.size(), 0); + } }