static long GetLong(object value) { return(value switch { long l => l, LazyNumberValue lnv => lnv, _ => throw new NotSupportedException($"Not supported type. Was expecting number, but got '{value}'."), });
public void WriteValue(LazyNumberValue value) { if (value != null) { _manualBlittableJsonDocumentBuilder.WriteValue(value); } else { _manualBlittableJsonDocumentBuilder.WriteValueNull(); } }
private object Clone(object value) { if (value == null || value == NullBucket) { return(NullBucket); } return(value switch { LazyStringValue lsv => lsv.ToString(), string s => s, DateTime time => time.ToString("O"), DateTimeOffset offset => offset.ToString("O"), TimeSpan span => span.ToString("c"), ValueType _ => value, LazyCompressedStringValue lcsv => lcsv.ToString(), LazyNumberValue lnv => lnv.ToDouble(CultureInfo.InvariantCulture), BlittableJsonReaderObject json => json.CloneOnTheSameContext(), BlittableJsonReaderArray arr => arr.Clone(_context), Document doc => doc, _ => throw new NotSupportedException($"Unable to group by type: {value.GetType()}") });
private bool SetToken(BlittableJsonToken token, object value) { switch (token & BlittableJsonReaderBase.TypesMask) { case BlittableJsonToken.EmbeddedBlittable: SetToken(JsonToken.Raw, value); return(true); case BlittableJsonToken.StartObject: var obj = (BlittableJsonReaderObject)value; var newObject = new CurrentItem { Object = (BlittableJsonReaderObject)value, Buffers = obj.GetPropertiesByInsertionOrder() }; _items.Push(newObject); //The value is passed in case the field/property should remains BlittableJsonReaderObject SetToken(JsonToken.StartObject, value); return(true); case BlittableJsonToken.StartArray: var newArray = new CurrentItem { Array = (BlittableJsonReaderArray)value }; _items.Push(newArray); //The value is passed in case the field/property should remains BlittableJsonReaderArray SetToken(JsonToken.StartArray, value); return(true); case BlittableJsonToken.Integer: SetToken(JsonToken.Integer, (long)value); return(true); case BlittableJsonToken.LazyNumber: if (_readAsLazyNumber) { SetToken(JsonToken.Float, value); } else { LazyNumberValue lnv = (LazyNumberValue)value; if (lnv.TryParseULong(out var ulongValue)) { SetToken(JsonToken.Integer, ulongValue); } else if (lnv.TryParseDecimal(out var decimalValue)) { SetToken(JsonToken.Float, decimalValue); } else { SetToken(JsonToken.Float, (double)lnv); } } return(true); case BlittableJsonToken.String: case BlittableJsonToken.CompressedString: SetToken(JsonToken.String, value.ToString()); return(true); case BlittableJsonToken.Boolean: SetToken(JsonToken.Boolean, (bool)value); return(true); case BlittableJsonToken.Null: SetToken(JsonToken.Null); return(true); default: throw new ArgumentOutOfRangeException(); } }
private JsValue ConstructGrouping(List <BlittableJsonReaderObject> values) { var jsValues = ConstructValues(); var jsKey = ConstructKey(); var result = new ObjectInstance(Engine) { Extensible = true }; result.Put("values", jsValues, false); result.Put("key", jsKey, false); return(result); JsValue ConstructKey() { if (_singleField) { var index = values[0].GetPropertyIndex(_groupByFields[0].Name); if (index != -1) { BlittableJsonReaderObject.PropertyDetails prop = default; values[0].GetPropertyByIndex(index, ref prop); return(JsValue.FromObject(Engine, prop.Value)); } return(JsValue.Null); } var key = new ObjectInstance(Engine) { Extensible = true }; foreach (var groupByField in _groupByFields) { var index = values[0].GetPropertyIndex(groupByField.Name); if (index != -1) { BlittableJsonReaderObject.PropertyDetails prop = default; values[0].GetPropertyByIndex(index, ref prop); var propertyName = groupByField.Name; if (groupByField is JsNestedField jsnf) { propertyName = jsnf.PropertyName; } var value = groupByField.GetValue(null, prop.Value); JsValue jsValue = value switch { BlittableJsonReaderObject bjro => new BlittableObjectInstance(Engine, null, bjro, null, null, null), Document doc => new BlittableObjectInstance(Engine, null, doc.Data, doc), LazyStringValue lsv => new JsString(lsv.ToString()), LazyCompressedStringValue lcsv => new JsString(lcsv.ToString()), LazyNumberValue lnv => new JsNumber(lnv.ToDouble(CultureInfo.InvariantCulture)), _ => JsValue.FromObject(Engine, value) }; key.Put(propertyName, jsValue, throwOnError: false); } } return(key); } ArrayInstance ConstructValues() { var items = new PropertyDescriptor[values.Count]; for (var i = 0; i < values.Count; i++) { var val = values[i]; if (JavaScriptIndexUtils.GetValue(Engine, val, out var jsValue, isMapReduce: true) == false) { continue; } items[i] = new PropertyDescriptor(jsValue, true, true, true); } var jsArray = new ArrayInstance(Engine, items) { Prototype = Engine.Array.PrototypeObject, Extensible = false }; return(jsArray); } }
public void WriteValue(LazyNumberValue value) { _manualBlittableJsonDocumentBuilder.WriteValue(value); }