Example #1
0
 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}'."),
     });
Example #2
0
 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()}")
            });
Example #4
0
        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();
            }
        }
Example #5
0
        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);
            }
        }
Example #6
0
 public void WriteValue(LazyNumberValue value)
 {
     _manualBlittableJsonDocumentBuilder.WriteValue(value);
 }