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);
        }
示例#3
0
        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));
                    }
                }
            }
        }
示例#5
0
        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));
                }
            }
        }
示例#7
0
        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();
            }
        }
示例#8
0
        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);
        }
示例#10
0
        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();
            }
        }