public void ObjectWithNestedIntArrayTest() { using (var context = new JsonOperationContext(1024, 1024 * 4)) { using (var builder = new ManualBlittalbeJsonDocumentBuilder <UnmanagedWriteBuffer>(context)) { builder.Reset(BlittableJsonDocumentBuilder.UsageMode.None); builder.StartWriteObjectDocument(); builder.StartWriteObject(); { builder.WritePropertyName("MyNestedArrayOfNumbers"); { builder.StartWriteArray(); { for (var i = 0; i < 8; i++) { builder.StartWriteArray(); { for (var j = 0; j < 8; j++) { builder.WriteValue(j); } builder.WriteArrayEnd(); } } builder.WriteArrayEnd(); } } builder.WritePropertyName("Height"); { builder.WriteValue(55); } builder.WriteObjectEnd(); } builder.FinalizeDocument(); var reader = builder.CreateReader(); Assert.Equal(2, reader.Count); var array = reader["MyNestedArrayOfNumbers"] as BlittableJsonReaderArray; Assert.Equal(8, array.Length); for (var i = 0; i < 8; i++) { var innerArray = array[i] as BlittableJsonReaderArray; for (var j = 0; j < 8; j++) { Assert.Equal(i, int.Parse(innerArray[i].ToString(), CultureInfo.InvariantCulture)); } } Assert.Equal(55, int.Parse(reader["Height"].ToString(), CultureInfo.InvariantCulture)); } } }
public void SimpleArrayDocument() { using (var context = new JsonOperationContext(1024, 1024 * 4)) { using (var builder = new ManualBlittalbeJsonDocumentBuilder <UnmanagedWriteBuffer>(context)) { builder.Reset(BlittableJsonDocumentBuilder.UsageMode.None); builder.StartArrayDocument(); builder.StartWriteArray(); { for (var i = 0; i < 8; i++) { builder.WriteValue(i); } builder.WriteArrayEnd(); } builder.FinalizeDocument(); var reader = builder.CreateArrayReader(); Assert.Equal(8, reader.Length); for (var i = 0; i < 8; i++) { Assert.Equal(i, int.Parse(reader[i].ToString(), CultureInfo.InvariantCulture)); } } } }
private void WriteDocumentsBlittable(DocumentsOperationContext context, IEnumerable <Document> documentsToWrite, List <Document> includes) { HttpContext.Response.Headers["Content-Type"] = "binary/blittable-json"; using (var streamBuffer = new UnmanagedStreamBuffer(context, ResponseBodyStream())) using (var writer = new ManualBlittalbeJsonDocumentBuilder <UnmanagedStreamBuffer>(context, null, new BlittableWriter <UnmanagedStreamBuffer>(context, streamBuffer))) { writer.StartWriteObjectDocument(); writer.StartWriteObject(); writer.WritePropertyName("Results"); writer.StartWriteArray(); foreach (var document in documentsToWrite) { writer.WriteEmbeddedBlittableDocument(document.Data); } writer.WriteArrayEnd(); writer.WritePropertyName("Includes"); writer.StartWriteArray(); foreach (var include in includes) { writer.WriteEmbeddedBlittableDocument(include.Data); } writer.WriteArrayEnd(); writer.WriteObjectEnd(); writer.FinalizeDocument(); } }
public void FlatObjectWithEmptyArray() { using (var context = new JsonOperationContext(1024, 1024 * 4)) { using (var builder = new ManualBlittalbeJsonDocumentBuilder <UnmanagedWriteBuffer>(context)) { builder.Reset(BlittableJsonDocumentBuilder.UsageMode.None); builder.StartWriteObjectDocument(); builder.StartWriteObject(); { builder.WritePropertyName("MyEmptyArray"); { builder.StartWriteArray(); { builder.WriteArrayEnd(); } } builder.WritePropertyName("Height"); { builder.WriteValue(55); } builder.WriteObjectEnd(); } builder.FinalizeDocument(); var reader = builder.CreateReader(); Assert.Equal(2, reader.Count); var array = reader["MyEmptyArray"] as BlittableJsonReaderArray; Assert.Equal(0, array.Length); Assert.Equal(55, int.Parse(reader["Height"].ToString(), CultureInfo.InvariantCulture)); } } }
private void ToBlittableJsonReaderValue(ManualBlittalbeJsonDocumentBuilder <UnmanagedWriteBuffer> writer, JsValue v, string propertyKey, bool recursiveCall) { if (v.IsBoolean()) { writer.WriteValue(v.AsBoolean()); return; } if (v.IsString()) { const string RavenDataByteArrayToBase64 = "raven-data:byte[];base64,"; var valueAsObject = v.ToObject(); var value = valueAsObject?.ToString(); if (value != null && value.StartsWith(RavenDataByteArrayToBase64)) { value = value.Remove(0, RavenDataByteArrayToBase64.Length); var byteArray = Convert.FromBase64String(value); writer.WriteValue(Encoding.UTF8.GetString(byteArray)); return; } writer.WriteValue(value); return; } if (v.IsNumber()) { var num = v.AsNumber(); KeyValuePair <object, JsValue> property; if (_propertiesByValue.TryGetValue(propertyKey, out property)) { var originalValue = property.Key; if (originalValue is float || originalValue is int) { // If the current value is exactly as the original value, we can return the original value before we made the JS conversion, // which will convert a Int64 to jsFloat. var jsValue = property.Value; if (jsValue.IsNumber() && Math.Abs(num - jsValue.AsNumber()) < double.Epsilon) { writer.WriteValue((int)originalValue); return; } //We might have change the type of num from Integer to long in the script by design //Making sure the number isn't a real float before returning it as integer if (originalValue is int && (Math.Abs(num - Math.Floor(num)) <= double.Epsilon || Math.Abs(num - Math.Ceiling(num)) <= double.Epsilon)) { writer.WriteValue((long)num); return; } writer.WriteValue((float)num); return; //float } } // If we don't have the type, assume that if the number ending with ".0" it actually an integer. var integer = Math.Truncate(num); if (Math.Abs(num - integer) < double.Epsilon) { writer.WriteValue((long)integer); return; } writer.WriteValue(num); return; } if (v.IsNull() || v.IsUndefined()) { writer.WriteValueNull(); return; } if (v.IsArray()) { var jsArray = v.AsArray(); writer.StartWriteArray(); foreach (var property in jsArray.GetOwnProperties()) { if (InheritedProperties.Contains(property.Key)) { continue; } var jsInstance = property.Value.Value; if (!jsInstance.HasValue) { continue; } ToBlittableJsonReaderValue(writer, jsInstance.Value, propertyKey + "[" + property.Key + "]", recursiveCall); } writer.WriteArrayEnd(); return; } if (v.IsDate()) { writer.WriteValue(v.AsDate().ToDateTime().ToString(Abstractions.Default.DateTimeFormatsToWrite)); return; } if (v.IsObject()) { ToBlittableJsonReaderObject(writer, v.AsObject(), propertyKey, recursiveCall); return; } if (v.IsRegExp()) { writer.WriteValueNull(); return; } throw new NotSupportedException(v.Type.ToString()); }
public override void WriteStartArray() { _manualBlittalbeJsonDocumentBuilder.StartWriteArray(); }