private void WriteRevisionsBlittable(DocumentsOperationContext context, IEnumerable <Document> documentsToWrite, out long 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(GetDocumentsResult.Results)); writer.StartWriteArray(); foreach (var document in documentsToWrite) { numberOfResults++; writer.WriteEmbeddedBlittableDocument(document.Data); } writer.WriteArrayEnd(); writer.WriteObjectEnd(); writer.FinalizeDocument(); } }
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, ob2); } } } }
public override void WriteValue(object value) { switch (value) { case BlittableJsonReaderObject readerObject: if (false == readerObject.HasParent) { _manualBlittableJsonDocumentBuilder.WriteEmbeddedBlittableDocument(readerObject); } else { using (var clonedBlittable = readerObject.CloneOnTheSameContext()) { _manualBlittableJsonDocumentBuilder.WriteEmbeddedBlittableDocument(clonedBlittable); } } return; case LazyStringValue lazyStringValue: _manualBlittableJsonDocumentBuilder.WriteValue(lazyStringValue); return; } base.WriteValue(value); }
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 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)); } } }