public void ObjectWithNestedIntArrayTest() { 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("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)); } } }
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); }
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 SimpleArrayDocument() { using (var context = new JsonOperationContext(1024, 1024 * 4, SharedMultipleUseFlag.None)) { using (var builder = new ManualBlittableJsonDocumentBuilder <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 static BlittableJsonReaderObject WriteNewCountersDocument(DocumentsOperationContext context, List <string> dbIds, IEnumerable <KeyValuePair <string, List <CounterDetail> > > batch) { var toDispose = new List <IDisposable>(); try { BlittableJsonReaderObject data; using (var builder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(context)) { builder.Reset(BlittableJsonDocumentBuilder.UsageMode.None); builder.StartWriteObjectDocument(); builder.StartWriteObject(); builder.WritePropertyName(CountersStorage.DbIds); builder.StartWriteArray(); foreach (var dbId in dbIds) { builder.WriteValue(dbId); } builder.WriteArrayEnd(); builder.WritePropertyName(CountersStorage.Values); builder.StartWriteObject(); foreach (var kvp in batch) { builder.WritePropertyName(kvp.Key); var maxDbIdIndex = GetMaxDbIdIndex(context, dbIds, kvp.Value); toDispose.Add(context.Allocator.Allocate((maxDbIdIndex + 1) * CountersStorage.SizeOfCounterValues, out var newVal)); Memory.Set(newVal.Ptr, 0, newVal.Length); WriteRawBlob(context, dbIds, kvp.Value, newVal, builder); } builder.WriteObjectEnd(); builder.WriteObjectEnd(); builder.FinalizeDocument(); data = builder.CreateReader(); } return(data); } finally { foreach (var scope in toDispose) { scope.Dispose(); } } }
public void FlatObjectWithEmptyArray() { 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("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 WritePropertyValue(BlittableJsonReaderObject.PropertyDetails prop) { switch (prop.Token & BlittableJsonReaderBase.TypesMask) { case BlittableJsonToken.StartObject: if (prop.Value is BlittableJsonReaderObject obj) { WriteObject(obj); } break; case BlittableJsonToken.StartArray: _manualBlittableJsonDocumentBuilder.StartWriteArray(); if (prop.Value is BlittableJsonReaderArray array) { foreach (var entry in array) { if (entry is BlittableJsonReaderObject entryObj) { WriteObject(entryObj); } else { WritePropertyValue(prop.Name, entry); } } } _manualBlittableJsonDocumentBuilder.WriteArrayEnd(); break; case BlittableJsonToken.Integer: _manualBlittableJsonDocumentBuilder.WriteValue((long)prop.Value); break; case BlittableJsonToken.LazyNumber: if (prop.Value is LazyNumberValue ldv) { _manualBlittableJsonDocumentBuilder.WriteValue(ldv); } else if (prop.Value is double d) { _manualBlittableJsonDocumentBuilder.WriteValue(d); } else { _manualBlittableJsonDocumentBuilder.WriteValue((float)prop.Value); } break; case BlittableJsonToken.String: _manualBlittableJsonDocumentBuilder.WriteValue((LazyStringValue)prop.Value); break; case BlittableJsonToken.CompressedString: _manualBlittableJsonDocumentBuilder.WriteValue((LazyCompressedStringValue)prop.Value); break; case BlittableJsonToken.Boolean: _manualBlittableJsonDocumentBuilder.WriteValue((bool)prop.Value); break; case BlittableJsonToken.Null: _manualBlittableJsonDocumentBuilder.WriteValueNull(); break; default: throw new NotSupportedException(); } }
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(); } }
private bool TryHandleArrayValue(int index, Dictionary <string, object> result, KeyValuePair <string, BlittableJsonReaderArray> prop) { var arrays = new List <BlittableJsonReaderArray> { prop.Value }; for (var i = 0; i < _docs.Length; i++) { if (i == index) { continue; } if (_docs[i].TryGetWithoutThrowingOnError(prop.Key, out BlittableJsonReaderArray token) == false) { return(false); } if (token == null) { continue; } arrays.Add(token); } var set = new HashSet <Tuple <object, BlittableJsonToken> >(); var lastLength = arrays[0].Length; var sameSize = true; foreach (var arr in arrays) { sameSize = arr.Length == lastLength; for (var propIndex = 0; propIndex < arr.Length; propIndex++) { var tuple = arr.GetValueTokenTupleByIndex(propIndex); set.Add(tuple); } } BlittableJsonReaderArray reader; using (var mergedArray = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(_context)) { mergedArray.Reset(BlittableJsonDocumentBuilder.UsageMode.None); mergedArray.StartArrayDocument(); mergedArray.StartWriteArray(); foreach (var item in set) { mergedArray.WriteValue(item.Item2, item.Item1); } mergedArray.WriteArrayEnd(); mergedArray.FinalizeDocument(); reader = mergedArray.CreateArrayReader(); } if (sameSize && prop.Value.Equals(reader)) { result.Add(prop.Key, reader); return(true); } result.Add(prop.Key, new ArrayWithWarning(reader)); return(true); }
private void WritePropertyValue(BlittableJsonReaderObject.PropertyDetails prop) { switch (prop.Token & BlittableJsonReaderBase.TypesMask) { case BlittableJsonToken.StartArray: _manualBlittableJsonDocumentBuilder.StartWriteArray(); if (prop.Value is BlittableJsonReaderArray array) { var propDetails = new BlittableJsonReaderObject.PropertyDetails(); foreach (var entry in array) { if (entry is BlittableJsonReaderObject bjro) { _manualBlittableJsonDocumentBuilder.StartWriteObject(); var propsIndexes = bjro.GetPropertiesByInsertionOrder(); foreach (var index in propsIndexes) { bjro.GetPropertyByIndex(index, ref propDetails); _manualBlittableJsonDocumentBuilder.WritePropertyName(propDetails.Name); WritePropertyValue(propDetails); } _manualBlittableJsonDocumentBuilder.WriteObjectEnd(); } else { WritePropertyValue(prop.Name, entry); } } } _manualBlittableJsonDocumentBuilder.WriteArrayEnd(); break; case BlittableJsonToken.Integer: _manualBlittableJsonDocumentBuilder.WriteValue((long)prop.Value); break; case BlittableJsonToken.LazyNumber: if (prop.Value is LazyNumberValue ldv) { _manualBlittableJsonDocumentBuilder.WriteValue(ldv); } else if (prop.Value is double d) { _manualBlittableJsonDocumentBuilder.WriteValue(d); } else { _manualBlittableJsonDocumentBuilder.WriteValue((float)prop.Value); } break; case BlittableJsonToken.String: case BlittableJsonToken.CompressedString: _manualBlittableJsonDocumentBuilder.WriteValue(prop.Value.ToString()); break; case BlittableJsonToken.Boolean: _manualBlittableJsonDocumentBuilder.WriteValue((bool)prop.Value); break; case BlittableJsonToken.Null: _manualBlittableJsonDocumentBuilder.WriteValueNull(); break; default: throw new NotSupportedException(); } }