public void FlatObjectWithIntArrayTest() { using (var context = new JsonOperationContext(1024, 1024 * 4, SharedMultipleUseFlag.None)) { using (var builder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(context)) { builder.Reset(BlittableJsonDocumentBuilder.UsageMode.None); builder.StartWriteObjectDocument(); builder.StartWriteObject(); { builder.WritePropertyName("MyNumbers"); { builder.StartWriteArray(); { for (var i = 0; i < 8; i++) { builder.WriteValue(i); } builder.WriteArrayEnd(); } } builder.WritePropertyName("Height"); { builder.WriteValue(55); } builder.WriteObjectEnd(); } builder.FinalizeDocument(); var reader = builder.CreateReader(); Assert.Equal(2, reader.Count); var array = reader["MyNumbers"] as BlittableJsonReaderArray; Assert.Equal(8, array.Length); for (var i = 0; i < 8; i++) { Assert.Equal(i, int.Parse(array[i].ToString(), CultureInfo.InvariantCulture)); } Assert.Equal(55, int.Parse(reader["Height"].ToString(), CultureInfo.InvariantCulture)); } } }
private void WriteDocumentsBlittable(DocumentsOperationContext context, IEnumerable <Document> documentsToWrite, List <Document> includes, out int numberOfResults) { numberOfResults = 0; HttpContext.Response.Headers["Content-Type"] = "binary/blittable-json"; using (var streamBuffer = new UnmanagedStreamBuffer(context, ResponseBodyStream())) using (var writer = new ManualBlittableJsonDocumentBuilder <UnmanagedStreamBuffer>(context, null, new BlittableWriter <UnmanagedStreamBuffer>(context, streamBuffer))) { writer.StartWriteObjectDocument(); writer.StartWriteObject(); writer.WritePropertyName(nameof(GetDocumentResult.Results)); writer.StartWriteArray(); foreach (var document in documentsToWrite) { numberOfResults++; writer.WriteEmbeddedBlittableDocument(document.Data); } writer.WriteArrayEnd(); writer.WritePropertyName(nameof(GetDocumentResult.Includes)); writer.StartWriteObject(); foreach (var include in includes) { writer.WritePropertyName(include.Id); writer.WriteEmbeddedBlittableDocument(include.Data); } writer.WriteObjectEnd(); writer.WriteObjectEnd(); writer.FinalizeDocument(); } }
public void BasicIntNestedStructure() { using (var context = new JsonOperationContext(1024, 1024 * 4, SharedMultipleUseFlag.None)) { using (var builder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(context)) { builder.Reset(BlittableJsonDocumentBuilder.UsageMode.None); builder.StartWriteObjectDocument(); builder.StartWriteObject(); { builder.WritePropertyName("Data"); { builder.StartWriteObject(); { builder.WritePropertyName("Volume"); { builder.WriteValue(44); } builder.WritePropertyName("Height"); { builder.WriteValue(55); } builder.WriteObjectEnd(); } } builder.WritePropertyName("@MetaData"); { builder.StartWriteObject(); { builder.WritePropertyName("Ticks"); { builder.WriteValue(22); } builder.WritePropertyName("Tacks"); { builder.WriteValue(11); } builder.WriteObjectEnd(); } } builder.WriteObjectEnd(); } builder.FinalizeDocument(); var reader = builder.CreateReader(); var stream = new MemoryStream(); Assert.Equal(2, reader.Count); var data = reader["Data"] as BlittableJsonReaderObject; Assert.Equal(44, int.Parse(data["Volume"].ToString(), CultureInfo.InvariantCulture)); Assert.Equal(55, int.Parse(data["Height"].ToString(), CultureInfo.InvariantCulture)); var metadata = reader["@MetaData"] as BlittableJsonReaderObject; Assert.Equal(22, int.Parse(metadata["Ticks"].ToString(), CultureInfo.InvariantCulture)); Assert.Equal(11, int.Parse(metadata["Tacks"].ToString(), CultureInfo.InvariantCulture)); } } }
public void BigDepthTest(int propertiesAmount) { using (var context = new JsonOperationContext(1024, 1024 * 4, SharedMultipleUseFlag.None)) { using (var builder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(context)) { builder.Reset(BlittableJsonDocumentBuilder.UsageMode.None); builder.StartWriteObjectDocument(); builder.StartWriteObject(); for (int i = 0; i < propertiesAmount; i++) { builder.WritePropertyName("Data" + i); builder.StartWriteObject(); builder.WritePropertyName("Age" + i); builder.WriteValue(i); } for (int i = 0; i < propertiesAmount; i++) { builder.WriteObjectEnd(); } builder.WriteObjectEnd(); builder.FinalizeDocument(); var reader = builder.CreateReader(); Assert.Equal(1, reader.Count); for (var i = 0; i < propertiesAmount; i++) { reader = reader["Data" + i] as BlittableJsonReaderObject; var val = reader["Age" + i]; Assert.Equal(i, int.Parse(val.ToString(), CultureInfo.InvariantCulture)); } } } }
private static void WriteToken(ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer> writer, string propertyName, object propertyValue) { writer.WritePropertyName(propertyName); if (propertyValue is BlittableJsonReaderObject.PropertyDetails) { var prop = (BlittableJsonReaderObject.PropertyDetails)propertyValue; writer.WriteValue(prop.Token, prop.Value); return; } var conflicted = propertyValue as Conflicted; if (conflicted != null) { writer.StartWriteArray(); writer.WriteValue(">>>> conflict start"); foreach (BlittableJsonReaderObject.PropertyDetails item in conflicted.Values) { writer.WriteValue(item.Token, item.Value); } writer.WriteValue("<<<< conflict end"); writer.WriteArrayEnd(); return; } var arrayWithWarning = propertyValue as ArrayWithWarning; if (arrayWithWarning != null) { writer.StartWriteArray(); writer.WriteValue(">>>> auto merged array start"); arrayWithWarning.MergedArray.AddItemsToStream(writer); writer.WriteValue("<<<< auto merged array end"); writer.WriteArrayEnd(); return; } var array = propertyValue as BlittableJsonReaderArray; if (array != null) { writer.StartWriteArray(); array.AddItemsToStream(writer); writer.WriteArrayEnd(); return; } throw new InvalidOperationException("Could not understand how to deal with: " + propertyValue); }
public void BasicObject() { using (var context = new JsonOperationContext(1024, 1024 * 4, SharedMultipleUseFlag.None)) { using (var builder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(context)) { builder.Reset(BlittableJsonDocumentBuilder.UsageMode.None); builder.StartWriteObjectDocument(); builder.StartWriteObject(); builder.WritePropertyName("Age"); builder.WriteValue(1); builder.WriteObjectEnd(); builder.FinalizeDocument(); using (var reader = builder.CreateReader()) Assert.Equal(1, reader.Count); } } }
public void Equals_blittables_created_manually() { using (var ctx = JsonOperationContext.ShortTermSingleUse()) { BlittableJsonReaderObject CreateBlittable() { using (var builder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(ctx)) using (var officeBuilder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(ctx)) using (var companyBuilder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(ctx)) { builder.Reset(BlittableJsonDocumentBuilder.UsageMode.None); officeBuilder.Reset(BlittableJsonDocumentBuilder.UsageMode.None); companyBuilder.Reset(BlittableJsonDocumentBuilder.UsageMode.None); companyBuilder.StartWriteObjectDocument(); companyBuilder.StartWriteObject(); companyBuilder.WritePropertyName("Name"); companyBuilder.WriteValue("Hibernating Rhinos"); companyBuilder.WritePropertyName("Type"); companyBuilder.WriteValue("LTD"); companyBuilder.WriteObjectEnd(); companyBuilder.FinalizeDocument(); var embeddedCompany = companyBuilder.CreateReader(); officeBuilder.StartWriteObjectDocument(); officeBuilder.StartWriteObject(); officeBuilder.WritePropertyName("Company"); officeBuilder.WriteEmbeddedBlittableDocument(embeddedCompany); officeBuilder.WritePropertyName("Street"); officeBuilder.WriteValue("Hanasi 21"); officeBuilder.WritePropertyName("City"); officeBuilder.WriteValue("Hadera"); officeBuilder.WriteObjectEnd(); officeBuilder.FinalizeDocument(); var embeddedOffice = officeBuilder.CreateReader(); builder.StartWriteObjectDocument(); builder.StartWriteObject(); builder.WritePropertyName("Office"); builder.WriteEmbeddedBlittableDocument(embeddedOffice); builder.WriteObjectEnd(); builder.FinalizeDocument(); return(builder.CreateReader()); } } using (var blittable1 = CreateBlittable()) using (var blittable2 = CreateBlittable()) { Assert.Equal(blittable1, blittable2); Assert.Equal(blittable1.GetHashCode(), blittable2.GetHashCode()); blittable1.TryGet("Office", out BlittableJsonReaderObject ob1); blittable2.TryGet("Office", out BlittableJsonReaderObject ob2); Assert.Equal(ob1.GetHashCode(), ob2.GetHashCode()); Assert.Equal(ob1, ob2); } } }
public void Equals_when_creating_blittable_in_different_ways() { using (var ctx = JsonOperationContext.ShortTermSingleUse()) { using (var builder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(ctx)) using (var embeddedBuilder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(ctx)) { builder.Reset(BlittableJsonDocumentBuilder.UsageMode.None); embeddedBuilder.Reset(BlittableJsonDocumentBuilder.UsageMode.None); embeddedBuilder.StartWriteObjectDocument(); embeddedBuilder.StartWriteObject(); embeddedBuilder.WritePropertyName("Name"); embeddedBuilder.WriteValue("Hibernating Rhinos"); embeddedBuilder.WritePropertyName("Type"); embeddedBuilder.WriteValue("LTD"); embeddedBuilder.WriteObjectEnd(); embeddedBuilder.FinalizeDocument(); var embeddedCompany = embeddedBuilder.CreateReader(); builder.StartWriteObjectDocument(); builder.StartWriteObject(); builder.WritePropertyName("Company"); builder.WriteEmbeddedBlittableDocument(embeddedCompany); builder.WritePropertyName("Street"); builder.WriteValue("Hanasi 21"); builder.WritePropertyName("City"); builder.WriteValue("Hadera"); builder.WriteObjectEnd(); builder.FinalizeDocument(); var blittable1 = builder.CreateReader(); var json2 = new DynamicJsonValue() { ["Company"] = new DynamicJsonValue() { ["Name"] = "Hibernating Rhinos", ["Type"] = "LTD", }, ["Street"] = "Hanasi 21", ["City"] = "Hadera", }; using (var blittable2 = ctx.ReadObject(json2, "foo")) { Assert.Equal(blittable1, blittable2); Assert.Equal(blittable1.GetHashCode(), blittable2.GetHashCode()); blittable1.TryGet("Company", out BlittableJsonReaderObject ob1); blittable2.TryGet("Company", out BlittableJsonReaderObject ob2); Assert.Equal(ob1.GetHashCode(), ob2.GetHashCode()); Assert.Equal(ob1, ob2); } } } }
private void WriteMetadata() { if (_documentInfo == null) { return; } if (_documentInfo.Metadata?.Modifications != null && (_documentInfo.Metadata.Modifications.Properties.Count > 0)) { _manualBlittableJsonDocumentBuilder.WritePropertyName(Constants.Documents.Metadata.Key); _manualBlittableJsonDocumentBuilder.StartWriteObject(); foreach (var prop in _documentInfo.Metadata.Modifications.Properties) { if (prop.Name.Length > 0 && prop.Name[0] == '@') { if (prop.Name != Constants.Documents.Metadata.Collection && prop.Name != Constants.Documents.Metadata.Expires && prop.Name != Constants.Documents.Metadata.Refresh && prop.Name != Constants.Documents.Metadata.Edges) { continue; // system property, ignoring it } } _manualBlittableJsonDocumentBuilder.WritePropertyName(prop.Item1); WritePropertyValue(prop.Name, prop.Value); } if (_documentInfo.Collection != null) { _manualBlittableJsonDocumentBuilder.WritePropertyName(Constants.Documents.Metadata.Collection); _manualBlittableJsonDocumentBuilder.WriteValue(_documentInfo.Collection); } _manualBlittableJsonDocumentBuilder.WriteObjectEnd(); _documentInfo.Metadata.Modifications = null; } else if (_documentInfo.Metadata != null) { _manualBlittableJsonDocumentBuilder.WritePropertyName(Constants.Documents.Metadata.Key); _manualBlittableJsonDocumentBuilder.StartWriteObject(); for (int i = 0; i < _documentInfo.Metadata.Count; i++) { var propertyDetails = new BlittableJsonReaderObject.PropertyDetails(); _documentInfo.Metadata.GetPropertyByIndex(i, ref propertyDetails); _manualBlittableJsonDocumentBuilder.WritePropertyName(propertyDetails.Name); WritePropertyValue(propertyDetails); } _manualBlittableJsonDocumentBuilder.WriteObjectEnd(); } else if (_documentInfo.MetadataInstance != null) { _manualBlittableJsonDocumentBuilder.WritePropertyName(Constants.Documents.Metadata.Key); _manualBlittableJsonDocumentBuilder.StartWriteObject(); foreach (var kvp in _documentInfo.MetadataInstance) { _manualBlittableJsonDocumentBuilder.WritePropertyName(kvp.Key); WritePropertyValue(kvp.Key, kvp.Value); } _manualBlittableJsonDocumentBuilder.WriteObjectEnd(); } else if (_documentInfo.Collection != null) { _manualBlittableJsonDocumentBuilder.WritePropertyName(Constants.Documents.Metadata.Key); _manualBlittableJsonDocumentBuilder.StartWriteObject(); _manualBlittableJsonDocumentBuilder.WritePropertyName(Constants.Documents.Metadata.Collection); _manualBlittableJsonDocumentBuilder.WriteValue(_documentInfo.Collection); if (_documentInfo.Id != null) { _manualBlittableJsonDocumentBuilder.WritePropertyName(Constants.Documents.Metadata.Id); _manualBlittableJsonDocumentBuilder.WriteValue(_documentInfo.Id); } _manualBlittableJsonDocumentBuilder.WriteObjectEnd(); } }
public unsafe void ReadDataTypesTest() { using (var context = new JsonOperationContext(1024, 1024 * 4, SharedMultipleUseFlag.None)) { BlittableJsonReaderObject embeddedReader; using (var builder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(context)) { builder.Reset(BlittableJsonDocumentBuilder.UsageMode.None); builder.StartWriteObjectDocument(); builder.StartWriteObject(); builder.WritePropertyName("Value"); builder.WriteValue(1000); builder.WriteObjectEnd(); builder.FinalizeDocument(); embeddedReader = builder.CreateReader(); } using (var builder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(context)) { var lonEscapedCharsString = string.Join(",", Enumerable.Repeat("\"Cool\"", 200).ToArray()); var longEscapedCharsAndNonAsciiString = string.Join(",", Enumerable.Repeat("\"מגניב\"", 200).ToArray()); builder.Reset(BlittableJsonDocumentBuilder.UsageMode.None); builder.StartWriteObjectDocument(); builder.StartWriteObject(); builder.WritePropertyName("FloatMin"); builder.WriteValue(float.MinValue); builder.WritePropertyName("FloatMax"); builder.WriteValue(float.MaxValue); builder.WritePropertyName("UshortMin"); builder.WriteValue(ushort.MinValue); builder.WritePropertyName("UshortMax"); builder.WriteValue(ushort.MaxValue); builder.WritePropertyName("UintMin"); builder.WriteValue(uint.MinValue); builder.WritePropertyName("UintMax"); builder.WriteValue(uint.MaxValue); builder.WritePropertyName("DoubleMin"); builder.WriteValue(double.MinValue); builder.WritePropertyName("DoubleMax"); builder.WriteValue(double.MaxValue); builder.WritePropertyName("LongMin"); builder.WriteValue(long.MinValue); builder.WritePropertyName("LongMax"); builder.WriteValue(long.MaxValue); builder.WritePropertyName("StringEmpty"); builder.WriteValue(string.Empty); builder.WritePropertyName("StringSimple"); builder.WriteValue("StringSimple"); builder.WritePropertyName("StringEscapedChars"); builder.WriteValue("\"Cool\""); builder.WritePropertyName("StringLongEscapedChars"); builder.WriteValue(lonEscapedCharsString); builder.WritePropertyName("StringEscapedCharsAndNonAscii"); builder.WriteValue(longEscapedCharsAndNonAsciiString); var lsvString = "\"fooאbar\""; var lsvStringBytes = Encoding.UTF8.GetBytes(lsvString); fixed(byte *b = lsvStringBytes) { var escapePositionsMaxSize = JsonParserState.FindEscapePositionsMaxSize(lsvString); var lsv = context.AllocateStringValue(null, b, lsvStringBytes.Length); var escapePositions = new FastList <int>(); var len = lsvStringBytes.Length; JsonParserState.FindEscapePositionsIn(escapePositions, b, ref len, escapePositionsMaxSize); lsv.EscapePositions = escapePositions.ToArray(); builder.WritePropertyName("LSVString"); builder.WriteValue(lsv); } builder.WritePropertyName("Embedded"); builder.WriteEmbeddedBlittableDocument(embeddedReader); builder.WriteObjectEnd(); builder.FinalizeDocument(); var reader = builder.CreateReader(); reader.BlittableValidation(); Assert.Equal(17, reader.Count); Assert.Equal(float.MinValue, float.Parse(reader["FloatMin"].ToString(), CultureInfo.InvariantCulture)); Assert.Equal(float.MaxValue, float.Parse(reader["FloatMax"].ToString(), CultureInfo.InvariantCulture)); Assert.Equal(ushort.MinValue, ushort.Parse(reader["UshortMin"].ToString(), CultureInfo.InvariantCulture)); Assert.Equal(ushort.MaxValue, ushort.Parse(reader["UshortMax"].ToString(), CultureInfo.InvariantCulture)); Assert.Equal(uint.MinValue, uint.Parse(reader["UintMin"].ToString(), CultureInfo.InvariantCulture)); Assert.Equal(uint.MaxValue, uint.Parse(reader["UintMax"].ToString(), CultureInfo.InvariantCulture)); Assert.Equal(double.MinValue, double.Parse(reader["DoubleMin"].ToString(), CultureInfo.InvariantCulture)); Assert.Equal(double.MaxValue, double.Parse(reader["DoubleMax"].ToString(), CultureInfo.InvariantCulture)); Assert.Equal(long.MinValue, long.Parse(reader["LongMin"].ToString(), CultureInfo.InvariantCulture)); Assert.Equal(long.MaxValue, long.Parse(reader["LongMax"].ToString(), CultureInfo.InvariantCulture)); Assert.Equal(string.Empty, reader["StringEmpty"].ToString()); Assert.Equal("StringSimple", reader["StringSimple"].ToString()); Assert.Equal("\"Cool\"", reader["StringEscapedChars"].ToString()); Assert.Equal(lonEscapedCharsString, reader["StringLongEscapedChars"].ToString()); Assert.Equal(longEscapedCharsAndNonAsciiString, reader["StringEscapedCharsAndNonAscii"].ToString()); Assert.Equal(lsvString, reader["LSVString"].ToString()); Assert.Equal(1000, int.Parse((reader["Embedded"] as BlittableJsonReaderObject)["Value"].ToString(), CultureInfo.InvariantCulture)); } } }
private void WriteMetadata() { if (_documentInfo == null) { return; } if (_documentInfo.Metadata?.Modifications != null && (_documentInfo.Metadata.Modifications.Properties.Count > 0)) { _manualBlittableJsonDocumentBuilder.WritePropertyName(Constants.Documents.Metadata.Key); _manualBlittableJsonDocumentBuilder.StartWriteObject(); foreach (var prop in _documentInfo.Metadata.Modifications.Properties) { if (prop.Name.Length > 0 && prop.Name[0] == '@') { if (prop.Name != Constants.Documents.Metadata.Collection && prop.Name != Constants.Documents.Metadata.Expires) { continue; // system property, ignoring it } } _manualBlittableJsonDocumentBuilder.WritePropertyName(prop.Item1); var value = prop.Item2; if (value == null) { _manualBlittableJsonDocumentBuilder.WriteValueNull(); continue; } var strValue = value as string; if (strValue != null) { _manualBlittableJsonDocumentBuilder.WriteValue(strValue); } else if (value is long) { _manualBlittableJsonDocumentBuilder.WriteValue((long)value); } else if (value is double) { _manualBlittableJsonDocumentBuilder.WriteValue((double)value); } else if (value is decimal decVal) { BlittableJsonReader.AssertDecimalValueInDoublePercisionBoundries(decVal); _manualBlittableJsonDocumentBuilder.WriteValue((decimal)value); } else if (value is float) { _manualBlittableJsonDocumentBuilder.WriteValue((float)value); } else if (value is bool) { _manualBlittableJsonDocumentBuilder.WriteValue((bool)value); } else if (value is LazyNumberValue) { _manualBlittableJsonDocumentBuilder.WriteValue((LazyNumberValue)value); } else { throw new NotSupportedException($"The value type {value.GetType().FullName} of key {prop.Item1} is not supported in the metadata"); } } if (_documentInfo.Collection != null) { _manualBlittableJsonDocumentBuilder.WritePropertyName(Constants.Documents.Metadata.Collection); _manualBlittableJsonDocumentBuilder.WriteValue(_documentInfo.Collection); } _manualBlittableJsonDocumentBuilder.WriteObjectEnd(); _documentInfo.Metadata.Modifications = null; } else if (_documentInfo.Metadata != null) { _manualBlittableJsonDocumentBuilder.WritePropertyName(Constants.Documents.Metadata.Key); _manualBlittableJsonDocumentBuilder.StartWriteObject(); var ids = _documentInfo.Metadata.GetPropertiesByInsertionOrder(); foreach (var id in ids) { var propertyDetails = new BlittableJsonReaderObject.PropertyDetails(); _documentInfo.Metadata.GetPropertyByIndex(id, ref propertyDetails); _manualBlittableJsonDocumentBuilder.WritePropertyName(propertyDetails.Name); switch (propertyDetails.Token & BlittableJsonReaderBase.TypesMask) { case BlittableJsonToken.StartArray: _manualBlittableJsonDocumentBuilder.StartWriteArray(); var array = propertyDetails.Value as BlittableJsonReaderArray; if (array != null) { var propDetails = new BlittableJsonReaderObject.PropertyDetails(); foreach (BlittableJsonReaderObject entry in array) { _manualBlittableJsonDocumentBuilder.StartWriteObject(); var propsIndexes = entry.GetPropertiesByInsertionOrder(); foreach (var index in propsIndexes) { entry.GetPropertyByIndex(index, ref propDetails); _manualBlittableJsonDocumentBuilder.WritePropertyName(propDetails.Name); switch (propDetails.Token) { case BlittableJsonToken.Integer: _manualBlittableJsonDocumentBuilder.WriteValue((long)propDetails.Value); break; case BlittableJsonToken.String: _manualBlittableJsonDocumentBuilder.WriteValue(propDetails.Value.ToString()); break; default: throw new NotSupportedException($"Found property token of type '{propDetails.Token}' which is not supported."); } } _manualBlittableJsonDocumentBuilder.WriteObjectEnd(); } } _manualBlittableJsonDocumentBuilder.WriteArrayEnd(); break; case BlittableJsonToken.Integer: _manualBlittableJsonDocumentBuilder.WriteValue((long)propertyDetails.Value); break; case BlittableJsonToken.LazyNumber: if (propertyDetails.Value is LazyNumberValue ldv) { _manualBlittableJsonDocumentBuilder.WriteValue(ldv); } else if (propertyDetails.Value is double d) { _manualBlittableJsonDocumentBuilder.WriteValue(d); } else { _manualBlittableJsonDocumentBuilder.WriteValue((float)propertyDetails.Value); } break; case BlittableJsonToken.String: _manualBlittableJsonDocumentBuilder.WriteValue(propertyDetails.Value.ToString()); break; case BlittableJsonToken.CompressedString: _manualBlittableJsonDocumentBuilder.WriteValue(propertyDetails.Value.ToString()); break; case BlittableJsonToken.Boolean: _manualBlittableJsonDocumentBuilder.WriteValue((bool)propertyDetails.Value); break; case BlittableJsonToken.Null: _manualBlittableJsonDocumentBuilder.WriteValueNull(); break; default: throw new NotSupportedException(); } } _manualBlittableJsonDocumentBuilder.WriteObjectEnd(); } else if (_documentInfo.Collection != null) { _manualBlittableJsonDocumentBuilder.WritePropertyName(Constants.Documents.Metadata.Key); _manualBlittableJsonDocumentBuilder.StartWriteObject(); _manualBlittableJsonDocumentBuilder.WritePropertyName(Constants.Documents.Metadata.Collection); _manualBlittableJsonDocumentBuilder.WriteValue(_documentInfo.Collection); if (_documentInfo.Id != null) { _manualBlittableJsonDocumentBuilder.WritePropertyName(Constants.Documents.Metadata.Id); _manualBlittableJsonDocumentBuilder.WriteValue(_documentInfo.Id); } _manualBlittableJsonDocumentBuilder.WriteObjectEnd(); } }