protected override void WriteJson(BlittableJsonWriter writer, CounterOperation value, JsonSerializer serializer) { if (value == null) { writer.WriteNull(); return; } writer.WriteStartObject(); writer.WritePropertyName(nameof(CounterOperation.CounterName)); if (value.CounterName != null) { writer.WriteValue(value.CounterName); } else { writer.WriteNull(); } writer.WritePropertyName(nameof(CounterOperation.Delta)); writer.WriteValue(value.Delta); writer.WritePropertyName(nameof(CounterOperation.Type)); writer.WriteValue(value.Type); writer.WritePropertyName(nameof(CounterOperation.DocumentId)); if (value.DocumentId != null) { writer.WriteValue(value.DocumentId); } else { writer.WriteNull(); } writer.WritePropertyName(nameof(CounterOperation.ChangeVector)); if (value.ChangeVector != null) { writer.WriteValue(value.ChangeVector); } else { writer.WriteNull(); } writer.WriteEndObject(); }
public void ConcurrentWrite_WhenResetCachedPropertiesForNewDocument_ShouldThrowInformativeException() { Assert.Throws <InvalidOperationException>(() => { using (var context = JsonOperationContext.ShortTermSingleUse()) using (var writer = new BlittableJsonWriter(context)) using (var secondWriter = new BlittableJsonWriter(context)) { secondWriter.WriteStartObject(); secondWriter.WritePropertyName("Property1"); secondWriter.WriteValue(4); secondWriter.WriteEndObject(); context.CachedProperties.NewDocument(); writer.WriteStartObject(); writer.WritePropertyName("ObjectProp"); writer.WriteValue(4); writer.WriteEndObject(); writer.FinalizeDocument(); var first = writer.CreateReader(); secondWriter.FinalizeDocument(); var second = secondWriter.CreateReader(); } }); }
public bool MoveNext() { if (_enumerator.MoveNext() == false) { return(false); } var output = _enumerator.Current; _parent._indexContext.CachedProperties.NewDocument(); using (_createBlittableResult.Start()) using (var writer = new BlittableJsonWriter(_parent._indexContext)) { IPropertyAccessor accessor; if (_parent._isMultiMap == false) { accessor = _parent._propertyAccessor ?? (_parent._propertyAccessor = PropertyAccessor.CreateMapReduceOutputAccessor(output.GetType(), output, _groupByFields)); } else { accessor = TypeConverter.GetPropertyAccessorForMapReduceOutput(output, _groupByFields); } _reduceKeyProcessor.Reset(); writer.WriteStartObject(); foreach (var property in accessor.GetPropertiesInOrder(output)) { var value = property.Value; var blittableValue = TypeConverter.ToBlittableSupportedType(value, context: _parent._indexContext); writer.WritePropertyName(property.Key); WriteValue(writer, blittableValue); if (property.IsGroupByField) { var valueForProcessor = property.GroupByField.GetValue(value, blittableValue); _reduceKeyProcessor.Process(_parent._indexContext.Allocator, valueForProcessor); } } writer.WriteEndObject(); if (_reduceKeyProcessor.ProcessedFields != _groupByFields.Count) { ThrowMissingGroupByFieldsInMapOutput(output, _groupByFields, _parent._compiledIndex); } var reduceHashKey = _reduceKeyProcessor.Hash; writer.FinalizeDocument(); Current.Data = writer.CreateReader(); Current.ReduceKeyHash = reduceHashKey; } return(true);
private object AddTypeNameToValueIfNeeded(Type propertyType, object value) { var typeOfValue = value.GetType(); if (propertyType == typeOfValue || typeOfValue.IsClass == false) { return(value); } using (var writer = new BlittableJsonWriter(Context)) { // the type of the object that's being serialized // is not the same as its declared type. // so we need to include $type in json var serializer = Conventions.CreateSerializer(); serializer.TypeNameHandling = TypeNameHandling.Objects; writer.WriteStartObject(); writer.WritePropertyName("Value"); serializer.Serialize(writer, value); writer.WriteEndObject(); writer.FinalizeDocument(); var reader = writer.CreateReader(); return(reader["Value"]); } }
static void WriteValue(BlittableJsonWriter writer, object value) { switch (value) { case bool val: writer.WriteValue(val); break; case decimal val: writer.WriteValue(val); break; case double val: writer.WriteValue(val); break; case float val: writer.WriteValue(val); break; case LazyCompressedStringValue val: writer.WriteValue(val); break; case LazyNumberValue val: writer.WriteValue(val); break; case LazyStringValue val: writer.WriteValue(val); break; case long val: writer.WriteValue(val); break; case int val: writer.WriteValue(val); break; case string val: writer.WriteValue(val); break; case ulong val: writer.WriteValue(val); break; case uint val: writer.WriteValue(val); break; case short val: writer.WriteValue(val); break; case byte val: writer.WriteValue(val); break; case DateTime val: writer.WriteValue(val); break; case DateTimeOffset val: writer.WriteValue(val); break; case TimeSpan val: writer.WriteValue(val); break; case BlittableJsonReaderObject val: var propertyDetails = new BlittableJsonReaderObject.PropertyDetails(); writer.WriteStartObject(); for (int i = 0; i < val.Count; i++) { val.GetPropertyByIndex(i, ref propertyDetails); writer.WritePropertyName(propertyDetails.Name); WriteValue(writer, propertyDetails.Value); } writer.WriteEndObject(); break; case BlittableJsonReaderArray val: writer.WriteStartArray(); foreach (var property in val) { WriteValue(writer, property); } writer.WriteEndArray(); break; case null: writer.WriteNull(); break; case DynamicJsonValue val: writer.WriteStartObject(); foreach (var property in val.Properties) { writer.WritePropertyName(property.Name); WriteValue(writer, property.Value); } writer.WriteEndObject(); break; case DynamicJsonArray val: writer.WriteStartArray(); foreach (var item in val) { WriteValue(writer, item); } writer.WriteEndArray(); break; default: throw new NotSupportedException($"Not supported value type '{value?.GetType().Name}'."); } }