예제 #1
0
 public void CheckJsonProperty(JsonProperty prop, JsonDataType? expectedType = null, string odataTypeName = null, bool? isArray = null, bool? customMembersIsNull = null)
 {
     if (expectedType != null)
         Assert.AreEqual(expectedType.Value, prop.Type);
     if (odataTypeName != null)
         Assert.AreEqual(odataTypeName, prop.ODataTypeName);
     if (isArray != null)
         Assert.AreEqual(isArray.Value, prop.IsArray);
     if (customMembersIsNull != null && customMembersIsNull.Value)
         Assert.IsNull(prop.CustomMembers);
     else if (customMembersIsNull != null && !customMembersIsNull.Value)
         Assert.IsNotNull(prop.CustomMembers);
 }
예제 #2
0
파일: Either.cs 프로젝트: kittinap/kunnjae
 /// <nodoc />
 EitherTag IEither.OnDeserializing(JsonDataType jsonType) => this.OnDeserializing(jsonType);
예제 #3
0
 private void WriteValue(Array array)
 {
     // This method is called only if WriteValue(object) is called with an array
     // The contract for XmlWriter.WriteValue(object) requires that this object array be written out as a string.
     // E.g. WriteValue(new int[] { 1, 2, 3}) should be equivalent to WriteString("1 2 3").             
     JsonDataType oldDataType = _dataType;
     // Set attribute mode to String because WritePrimitiveValue might write numerical text.
     //  Calls to methods that write numbers can't be mixed with calls that write quoted text unless the attribute mode is explictly string.            
     _dataType = JsonDataType.String;
     StartText();
     for (int i = 0; i < array.Length; i++)
     {
         if (i != 0)
         {
             _nodeWriter.WriteText(JsonGlobals.WhitespaceChar);
         }
         WritePrimitiveValue(array.GetValue(i));
     }
     _dataType = oldDataType;
 }
예제 #4
0
        void InitializeWriter()
        {
            nodeType = JsonNodeType.None;
            dataType = JsonDataType.None;
            isWritingDataTypeAttribute = false;
            wroteServerTypeAttribute = false;
            isWritingServerTypeAttribute = false;
            serverTypeValue = null;
            attributeText = null;

            if (depth != 0)
            {
                depth = 0;
            }
            if ((scopes != null) && (scopes.Length > JsonGlobals.maxScopeSize))
            {
                scopes = null;
            }

            // Can't let writeState be at Closed if reinitializing.
            writeState = WriteState.Start;
            endElementBuffer = false;
            indentLevel = 0;
        }
        public JsonData(object obj)
        {
            if (obj is Boolean) {
                type = JsonDataType.Boolean;
                inst_boolean = (bool) obj;
                return;
            }

            if (obj is Double) {
                type = JsonDataType.Double;
                inst_double = (double) obj;
                return;
            }

            if (obj is Int32) {
                type = JsonDataType.Int;
                inst_int = (int) obj;
                return;
            }

            if (obj is Int64) {
                type = JsonDataType.Long;
                inst_long = (long) obj;
                return;
            }

            if (obj is String) {
                type = JsonDataType.String;
                inst_string = (string) obj;
                return;
            }

            throw new ArgumentException (
                "Unable to wrap the given object with JsonData");
        }
 public JsonData(int number)
 {
     type = JsonDataType.Int;
     inst_int = number;
 }
 void IJsonWrapper.SetLong(long val)
 {
     type = JsonDataType.Long;
     inst_long = val;
     json = null;
 }
 public JsonData(string str)
 {
     type = JsonDataType.String;
     inst_string = str;
 }
예제 #9
0
 public JsonValue(string value, JsonDataType type) : base(type)
 {
     Value = value;
 }
예제 #10
0
 protected JsonItem(JsonDataType dataType)
 {
     DataType = dataType;
 }
예제 #11
0
 public JsonValue(StringMatchData matchData, JsonDataType dataType) : base(dataType)
 {
     _matchData = matchData;
 }
예제 #12
0
        public static bool Compare(string value1, string value2, JsonDataType targetType, BooleanComparisonType comparisonType)
        {
            switch (targetType)
            {
            case JsonDataType.Boolean:
                bool bool_value1, bool_value2;
                if (bool.TryParse(value1, out bool_value1) && bool.TryParse(value2, out bool_value2))
                {
                    switch (comparisonType)
                    {
                    case BooleanComparisonType.Equals:
                        return(bool_value1 == bool_value2);

                    case BooleanComparisonType.NotEqualToBrackets:
                    case BooleanComparisonType.NotEqualToExclamation:
                        return(bool_value1 != bool_value2);

                    default:
                        throw new QueryCompilationException("Operator " + comparisonType.ToString() + " cannot be applied to operands of type \"boolean\".");
                    }
                }
                else
                {
                    return(false);
                }

            case JsonDataType.Bytes:
                switch (comparisonType)
                {
                case BooleanComparisonType.Equals:
                    return(value1 == value2);

                case BooleanComparisonType.NotEqualToBrackets:
                case BooleanComparisonType.NotEqualToExclamation:
                    return(value1 != value2);

                default:
                    return(false);
                }

            case JsonDataType.Int:
                int int_value1, int_value2;
                if (int.TryParse(value1, out int_value1) && int.TryParse(value2, out int_value2))
                {
                    switch (comparisonType)
                    {
                    case BooleanComparisonType.Equals:
                        return(int_value1 == int_value2);

                    case BooleanComparisonType.GreaterThan:
                        return(int_value1 > int_value2);

                    case BooleanComparisonType.GreaterThanOrEqualTo:
                        return(int_value1 >= int_value2);

                    case BooleanComparisonType.LessThan:
                        return(int_value1 < int_value2);

                    case BooleanComparisonType.LessThanOrEqualTo:
                        return(int_value1 <= int_value2);

                    case BooleanComparisonType.NotEqualToBrackets:
                    case BooleanComparisonType.NotEqualToExclamation:
                        return(int_value1 != int_value2);

                    case BooleanComparisonType.NotGreaterThan:
                        return(!(int_value1 > int_value2));

                    case BooleanComparisonType.NotLessThan:
                        return(!(int_value1 < int_value2));

                    default:
                        throw new QueryCompilationException("Operator " + comparisonType.ToString() + " cannot be applied to operands of type \"int\".");
                    }
                }
                else
                {
                    return(false);
                }

            case JsonDataType.Long:
                long long_value1, long_value2;
                if (long.TryParse(value1, out long_value1) && long.TryParse(value2, out long_value2))
                {
                    switch (comparisonType)
                    {
                    case BooleanComparisonType.Equals:
                        return(long_value1 == long_value2);

                    case BooleanComparisonType.GreaterThan:
                        return(long_value1 > long_value2);

                    case BooleanComparisonType.GreaterThanOrEqualTo:
                        return(long_value1 >= long_value2);

                    case BooleanComparisonType.LessThan:
                        return(long_value1 < long_value2);

                    case BooleanComparisonType.LessThanOrEqualTo:
                        return(long_value1 <= long_value2);

                    case BooleanComparisonType.NotEqualToBrackets:
                    case BooleanComparisonType.NotEqualToExclamation:
                        return(long_value1 != long_value2);

                    case BooleanComparisonType.NotGreaterThan:
                        return(!(long_value1 > long_value2));

                    case BooleanComparisonType.NotLessThan:
                        return(!(long_value1 < long_value2));

                    default:
                        throw new QueryCompilationException("Operator " + comparisonType.ToString() + " cannot be applied to operands of type \"long\".");
                    }
                }
                else
                {
                    return(false);
                }

            case JsonDataType.Double:
                double double_value1, double_value2;
                if (double.TryParse(value1, out double_value1) && double.TryParse(value2, out double_value2))
                {
                    switch (comparisonType)
                    {
                    case BooleanComparisonType.Equals:
                        return(double_value1 == double_value2);

                    case BooleanComparisonType.GreaterThan:
                        return(double_value1 > double_value2);

                    case BooleanComparisonType.GreaterThanOrEqualTo:
                        return(double_value1 >= double_value2);

                    case BooleanComparisonType.LessThan:
                        return(double_value1 < double_value2);

                    case BooleanComparisonType.LessThanOrEqualTo:
                        return(double_value1 <= double_value2);

                    case BooleanComparisonType.NotEqualToBrackets:
                    case BooleanComparisonType.NotEqualToExclamation:
                        return(double_value1 != double_value2);

                    case BooleanComparisonType.NotGreaterThan:
                        return(!(double_value1 > double_value2));

                    case BooleanComparisonType.NotLessThan:
                        return(!(double_value1 < double_value2));

                    default:
                        throw new QueryCompilationException("Operator " + comparisonType.ToString() + " cannot be applied to operands of type \"double\".");
                    }
                }
                else
                {
                    return(false);
                }

            case JsonDataType.Float:
                float float_value1, float_value2;
                if (float.TryParse(value1, out float_value1) && float.TryParse(value2, out float_value2))
                {
                    switch (comparisonType)
                    {
                    case BooleanComparisonType.Equals:
                        return(float_value1 == float_value2);

                    case BooleanComparisonType.GreaterThan:
                        return(float_value1 > float_value2);

                    case BooleanComparisonType.GreaterThanOrEqualTo:
                        return(float_value1 >= float_value2);

                    case BooleanComparisonType.LessThan:
                        return(float_value1 < float_value2);

                    case BooleanComparisonType.LessThanOrEqualTo:
                        return(float_value1 <= float_value2);

                    case BooleanComparisonType.NotEqualToBrackets:
                    case BooleanComparisonType.NotEqualToExclamation:
                        return(float_value1 != float_value2);

                    case BooleanComparisonType.NotGreaterThan:
                        return(!(float_value1 > float_value2));

                    case BooleanComparisonType.NotLessThan:
                        return(!(float_value1 < float_value2));

                    default:
                        throw new QueryCompilationException("Operator " + comparisonType.ToString() + " cannot be applied to operands of type \"float\".");
                    }
                }
                else
                {
                    return(false);
                }

            case JsonDataType.String:
                switch (comparisonType)
                {
                case BooleanComparisonType.Equals:
                    return(value1 == value2);

                case BooleanComparisonType.GreaterThan:
                case BooleanComparisonType.GreaterThanOrEqualTo:
                    return(value1.CompareTo(value2) > 0);

                case BooleanComparisonType.LessThan:
                case BooleanComparisonType.LessThanOrEqualTo:
                    return(value1.CompareTo(value2) > 0);

                case BooleanComparisonType.NotEqualToBrackets:
                case BooleanComparisonType.NotEqualToExclamation:
                    return(value1 != value2);

                case BooleanComparisonType.NotGreaterThan:
                    return(value1.CompareTo(value2) <= 0);

                case BooleanComparisonType.NotLessThan:
                    return(value1.CompareTo(value2) >= 0);

                default:
                    throw new QueryCompilationException("Operator " + comparisonType.ToString() + " cannot be applied to operands of type \"string\".");
                }

            case JsonDataType.Date:
                throw new NotImplementedException();

            case JsonDataType.Null:
                return(false);

            default:
                throw new QueryCompilationException("Unsupported data type.");
            }
        }
예제 #13
0
        internal ReflectionCache(Type type)
        {
            Type                 = type;
            TypeName             = type.FullName;
            AssemblyName         = type.AssemblyQualifiedName;
            CircularReferencable = type.IsValueType == false || type != typeof(string);
            IsAbstract           = type.IsUndetermined();
            IsAnonymous          = type.IsAnonymous();

            JsonDataType      = Reflection.GetJsonDataType(type);
            SerializeMethod   = JsonSerializer.GetWriteJsonMethod(type);
            DeserializeMethod = JsonDeserializer.GetReadJsonMethod(type);

            if (JsonDataType == JsonDataType.Enum)
            {
                IsFlaggedEnum = AttributeHelper.HasAttribute <FlagsAttribute> (type, false);
                return;
            }

            if (type.IsPointer)
            {
                throw new JsonSerializationException("Can not serialize pointer type: " + type.AssemblyQualifiedName);
            }
            if (type.IsArray)
            {
                ArgumentTypes = new Type[] { type.GetElementType() };
                CommonType    = type.GetArrayRank() == 1 ? ComplexType.Array : ComplexType.MultiDimensionalArray;
            }
            else
            {
                var t = type;
                if (t.IsGenericType == false)
                {
                    while ((t = t.BaseType) != null)
                    {
                        if (t.IsGenericType)
                        {
                            break;
                        }
                    }
                }
                if (t != null)
                {
                    ArgumentTypes = t.GetGenericArguments();
                    var gt = t.GetGenericTypeDefinition();
                    if (gt.Equals(typeof(Dictionary <,>)))
                    {
                        CommonType = ComplexType.Dictionary;
                    }
                    else if (gt.Equals(typeof(List <>)))
                    {
                        CommonType = ComplexType.List;
                    }
                    else if (gt.Equals(typeof(Nullable <>)))
                    {
                        CommonType      = ComplexType.Nullable;
                        SerializeMethod = JsonSerializer.GetWriteJsonMethod(ArgumentTypes[0]);
                    }
                }
            }
            if (typeof(IEnumerable).IsAssignableFrom(type))
            {
                if (typeof(Array).IsAssignableFrom(type) == false)
                {
                    AppendItem = Reflection.CreateWrapperMethod <AddCollectionItem> (Reflection.FindMethod(type, "Add", new Type[] { null }));
                }
                if (ArgumentTypes != null && ArgumentTypes.Length == 1)
                {
                    ItemSerializer   = JsonSerializer.GetWriteJsonMethod(ArgumentTypes[0]);
                    ItemDeserializer = JsonDeserializer.GetReadJsonMethod(ArgumentTypes[0]);
                }
            }
            if (ArgumentTypes != null)
            {
                ArgumentReflections = new ReflectionCache[ArgumentTypes.Length];
            }
            if (CommonType != ComplexType.Array &&
                CommonType != ComplexType.MultiDimensionalArray &&
                CommonType != ComplexType.Nullable)
            {
                if (type.IsPubliclyAccessible() == false)
                {
                    ConstructorInfo |= ConstructorTypes.NonPublic;
                }
                if (type.IsClass || type.IsValueType)
                {
                    try {
                        Constructor = Reflection.CreateConstructorMethod(type, type.IsVisible == false || typeof(DatasetSchema).Equals(type));
                    }
                    catch (Exception ex) {
                        throw new JsonSerializationException("Error occurred when creating constructor method for type " + type.AssemblyQualifiedName, ex);
                    }
                    if (Constructor != null && Constructor.Method.IsPublic == false)
                    {
                        ConstructorInfo |= ConstructorTypes.NonPublic;
                    }
                    if (Constructor == null)
                    {
                        var c = type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
                        if (c != null && c.Length > 0)
                        {
                            ConstructorInfo |= ConstructorTypes.Parametric;
                        }
                    }

                    Members = Reflection.GetMembers(type);
                }
            }
            //if (typeof (IEnumerable).IsAssignableFrom (type)) {
            //	return;
            //}
            //if (JsonDataType != JsonDataType.Undefined) {
            //	return;
            //}
        }
예제 #14
0
파일: Either.cs 프로젝트: kittinap/kunnjae
 /// <nodoc />
 protected abstract EitherTag OnDeserializing(JsonDataType jsonType);
예제 #15
0
 private void WriteServerTypeAttribute()
 {
     string str = serverTypeValue;
     JsonDataType jsonDataType = dataType;
     NameState _nameState = this.nameState;
     (this).WriteStartElement("__type");
     (this).WriteValue(str);
     WriteEndElement();
     dataType = jsonDataType;
     this.nameState = _nameState;
     wroteServerTypeAttribute = true;
 }
예제 #16
0
        private static JsonProperty ParseProperty(string name, JToken value, JsonSchema containerSchema)
        {
            switch (value.Type)
            {
            case JTokenType.Boolean:
                return(new JsonProperty {
                    Name = name, Type = JsonDataType.Boolean, OriginalValue = value.ToString()
                });

            case JTokenType.Float:
            case JTokenType.Integer:
                return(new JsonProperty {
                    Name = name, Type = JsonDataType.Number, OriginalValue = value.ToString()
                });

            case JTokenType.String:
                return(new JsonProperty {
                    Name = name, Type = JsonDataType.String, OriginalValue = value.ToString()
                });

            case JTokenType.Date:
                return(new JsonProperty {
                    Name = name, Type = JsonDataType.String, OriginalValue = value.ToString()
                });

            case JTokenType.Object:
            {
                var objectSchema = ObjectToSchema((JObject)value);
                if (objectSchema.ContainsKey("@odata.type"))
                {
                    return(new JsonProperty {
                            Name = name, Type = JsonDataType.ODataType, ODataTypeName = objectSchema["@odata.type"].OriginalValue
                        });
                }
                else
                {
                    // See if we can infer type from the parent scehma
                    JsonProperty schemaProperty;
                    JsonDataType propertyType  = JsonDataType.Object;
                    string       odataTypeName = null;
                    if (null != containerSchema && containerSchema.ExpectedProperties.TryGetValue(name, out schemaProperty))
                    {
                        odataTypeName = schemaProperty.ODataTypeName;
                        propertyType  = schemaProperty.Type;
                    }
                    return(new JsonProperty {
                            Name = name, Type = propertyType, ODataTypeName = odataTypeName, CustomMembers = ObjectToSchema((JObject)value)
                        });
                }
            }

            case JTokenType.Array:
            {
                // Array
                JsonDataType propertyType  = JsonDataType.Array;
                string       odataTypeName = null;

                // Infer type from the items in the array
                var firstChild = value.First;
                if (null != firstChild)
                {
                    var objectType = ParseProperty("array[0]", firstChild, null);
                    if (null != objectType)
                    {
                        odataTypeName = objectType.ODataTypeName;
                        propertyType  = objectType.Type;
                    }
                }
                else
                {
                    propertyType = JsonDataType.Array;
                }

                // See if we can do better than just Custom
                if (propertyType == JsonDataType.Object)
                {
                    JsonProperty schemaProperty;
                    if (null != containerSchema && containerSchema.ExpectedProperties.TryGetValue(name, out schemaProperty))
                    {
                        // Use the parent schema's type indication
                        odataTypeName = schemaProperty.ODataTypeName;
                        propertyType  = schemaProperty.Type;
                    }
                }

                Dictionary <string, JsonProperty> members = null;
                if (propertyType == JsonDataType.Object || propertyType == JsonDataType.Array)
                {
                    var firstValue = (JObject)value.First;
                    members = firstValue != null?ObjectToSchema(firstValue) : new Dictionary <string, JsonProperty>();
                }

                return(new JsonProperty {
                        Name = name, Type = propertyType, ODataTypeName = odataTypeName, IsArray = true,
                        OriginalValue = value.ToString(), CustomMembers = members
                    });
            }

            case JTokenType.Null:
                return(new JsonProperty {
                    Name = name, Type = JsonDataType.Object, IsArray = false, OriginalValue = null
                });

            default:
                Console.WriteLine("Unsupported: Property {0} is of type {1} which is not currently supported.", name, value.Type);
                throw new NotSupportedException(string.Format("Unsupported: Property {0} is of type {1} which is not currently supported.", name, value.Type));
            }
        }
예제 #17
0
        MemberCache(MemberInfo memberInfo, Type memberType, string name)
        {
            MemberName = name;
            MemberType = memberType;
            MemberInfo = memberInfo;
            JsonDataType dt = Reflection.GetJsonDataType (memberType);
            DeserializeMethod = JsonDeserializer.GetReadJsonMethod (memberType);
            SerializeMethod = JsonSerializer.GetWriteJsonMethod (memberType);

            if (dt == JsonDataType.Array || dt == JsonDataType.MultiDimensionalArray) {
                ElementType = memberType.GetElementType ();
            }

            IsValueType = memberType.IsValueType;
            IsStruct = (IsValueType && !memberType.IsPrimitive && !memberType.IsEnum && typeof (decimal).Equals (memberType) == false);
            IsClass = memberType.IsClass;
            IsCollection = typeof (ICollection).IsAssignableFrom (memberType) && typeof (byte[]).Equals (memberType) == false;
            if (memberType.IsGenericType) {
                ElementType = memberType.GetGenericArguments ()[0];
                IsNullable = memberType.GetGenericTypeDefinition ().Equals (typeof (Nullable<>));
            }
            if (IsValueType) {
                ChangeType = IsNullable ? ElementType : memberType;
            }
            JsonDataType = dt;
        }
예제 #18
0
 internal static RevertJsonValue GetRevertMethod(JsonDataType type)
 {
     return(_revertMethods[(int)type]);
 }
 void IJsonWrapper.SetDouble(double val)
 {
     type = JsonDataType.Double;
     inst_double = val;
     json = null;
 }
예제 #20
0
 public JsonData(bool boolean)
 {
     type         = JsonDataType.Boolean;
     inst_boolean = boolean;
 }
 public JsonData(bool boolean)
 {
     type = JsonDataType.Boolean;
     inst_boolean = boolean;
 }
예제 #22
0
 public JsonData(double number)
 {
     type        = JsonDataType.Double;
     inst_double = number;
 }
        private IDictionary EnsureDictionary()
        {
            if (type == JsonDataType.Object)
                return (IDictionary) inst_object;

            if (type != JsonDataType.None)
                throw new InvalidOperationException (
                    "Instance of JsonData is not a dictionary");

            type = JsonDataType.Object;
            inst_object = new Dictionary<string, JsonData> ();
            object_list = new List<KeyValuePair<string, JsonData>> ();

            return (IDictionary) inst_object;
        }
예제 #24
0
 public JsonData(int number)
 {
     type     = JsonDataType.Int;
     inst_int = number;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="JsonDataAttribute"/> class.
 /// </summary>
 /// <param name="dataType">Type of the data.</param>
 /// <param name="encode">if set to <c>true</c> [encode].</param>
 public JsonDataAttribute(JsonDataType dataType, bool encode)
 {
     this.DataType = dataType;
     this.Encode = encode;
 }
예제 #26
0
 public JsonData(long number)
 {
     type      = JsonDataType.Long;
     inst_long = number;
 }
예제 #27
0
        private void InitializeWriter()
        {
            _nodeType = JsonNodeType.None;
            _dataType = JsonDataType.None;
            _isWritingDataTypeAttribute = false;
            _wroteServerTypeAttribute = false;
            _isWritingServerTypeAttribute = false;
            _serverTypeValue = null;
            _attributeText = null;

            if (_depth != 0)
            {
                _depth = 0;
            }
            if ((_scopes != null) && (_scopes.Length > JsonGlobals.maxScopeSize))
            {
                _scopes = null;
            }

            // Can't let writeState be at Closed if reinitializing.
            _writeState = WriteState.Start;
            _endElementBuffer = false;
            _indentLevel = 0;
        }
예제 #28
0
 public JsonData(string str)
 {
     type        = JsonDataType.String;
     inst_string = str;
 }
예제 #29
0
        public override void WriteEndElement()
        {
            if (IsClosed)
            {
                ThrowClosed();
            }

            if (_depth == 0)
            {
                throw new XmlException(SR.JsonEndElementNoOpenNodes);
            }
            if (HasOpenAttribute)
            {
                throw new XmlException(SR.Format(SR.JsonOpenAttributeMustBeClosedFirst, "WriteEndElement"));
            }

            _endElementBuffer = false;

            JsonNodeType token = ExitScope();
            if (token == JsonNodeType.Collection)
            {
                _indentLevel--;
                if (_indent)
                {
                    if (_nodeType == JsonNodeType.Element)
                    {
                        _nodeWriter.WriteText(WHITESPACE);
                    }
                    else
                    {
                        WriteNewLine();
                        WriteIndent();
                    }
                }
                _nodeWriter.WriteText(JsonGlobals.EndCollectionChar);
                token = ExitScope();
            }
            else if (_nodeType == JsonNodeType.QuotedText)
            {
                // For writing "
                WriteJsonQuote();
            }
            else if (_nodeType == JsonNodeType.Element)
            {
                if ((_dataType == JsonDataType.None) && (_serverTypeValue != null))
                {
                    throw new XmlException(SR.Format(SR.JsonMustSpecifyDataType, JsonGlobals.typeString, JsonGlobals.objectString, JsonGlobals.serverTypeString));
                }

                if (IsWritingNameWithMapping && !WrittenNameWithMapping)
                {
                    // Ending </item> without writing item attribute
                    // Not providing a better error message because localization deadline has passed.
                    throw new XmlException(SR.Format(SR.JsonMustSpecifyDataType, JsonGlobals.itemString, string.Empty, JsonGlobals.itemString));
                }

                // the element is empty, it does not have any content, 
                if ((_dataType == JsonDataType.None) ||
                    (_dataType == JsonDataType.String))
                {
                    _nodeWriter.WriteText(JsonGlobals.QuoteChar);
                    _nodeWriter.WriteText(JsonGlobals.QuoteChar);
                }
            }
            else
            {
                // Assert on only StandaloneText and EndElement because preceding if
                //    conditions take care of checking for QuotedText and Element.
                Fx.Assert((_nodeType == JsonNodeType.StandaloneText) || (_nodeType == JsonNodeType.EndElement),
                    "nodeType has invalid value " + _nodeType + ". Expected it to be QuotedText, Element, StandaloneText, or EndElement.");
            }
            if (_depth != 0)
            {
                if (token == JsonNodeType.Element)
                {
                    _endElementBuffer = true;
                }
                else if (token == JsonNodeType.Object)
                {
                    _indentLevel--;
                    if (_indent)
                    {
                        if (_nodeType == JsonNodeType.Element)
                        {
                            _nodeWriter.WriteText(WHITESPACE);
                        }
                        else
                        {
                            WriteNewLine();
                            WriteIndent();
                        }
                    }
                    _nodeWriter.WriteText(JsonGlobals.EndObjectChar);
                    if ((_depth > 0) && _scopes[_depth] == JsonNodeType.Element)
                    {
                        ExitScope();
                        _endElementBuffer = true;
                    }
                }
            }

            _dataType = JsonDataType.None;
            _nodeType = JsonNodeType.EndElement;
            _nameState = NameState.None;
            _wroteServerTypeAttribute = false;
        }
예제 #30
0
 void IJsonWrapper.SetBoolean(bool val)
 {
     type         = JsonDataType.Boolean;
     inst_boolean = val;
     json         = null;
 }
예제 #31
0
        private void InitializeWriter()
        {
            nodeType = JsonNodeType.None;
            dataType = JsonDataType.None;
            isWritingDataTypeAttribute = false;
            wroteServerTypeAttribute = false;
            isWritingServerTypeAttribute = false;
            serverTypeValue = null;
            attributeText = null;
            depth = 0;

            if (scopes != null && scopes.Length > 25)
                scopes = null;
            writeState = WriteState.Start;
            endElementBuffer = false;
        }
예제 #32
0
 void IJsonWrapper.SetDouble(double val)
 {
     type        = JsonDataType.Double;
     inst_double = val;
     json        = null;
 }
예제 #33
0
 private void WriteValue(Array array)
 {
     JsonDataType jsonDataType = dataType;
     dataType = JsonDataType.String;
     StartText();
     for (int index = 0; index < array.Length; ++index)
     {
         if (index != 0)
             nodeWriter.Write(" ");
         WritePrimitiveValue(array.GetValue(index));
     }
     dataType = jsonDataType;
 }
예제 #34
0
 void IJsonWrapper.SetInt(int val)
 {
     type     = JsonDataType.Int;
     inst_int = val;
     json     = null;
 }
예제 #35
0
        internal ReflectionCache(Type type)
        {
            Type = type;
            TypeName = type.FullName;
            AssemblyName = type.AssemblyQualifiedName;

            JsonDataType = Reflection.GetJsonDataType (type);
            SerializeMethod = JsonSerializer.GetWriteJsonMethod (type);
            DeserializeMethod = JsonDeserializer.GetReadJsonMethod (type);

            if (JsonDataType == JsonDataType.Enum) {
                IsFlaggedEnum = AttributeHelper.HasAttribute<FlagsAttribute> (type, false);
                return;
            }

            if (type.IsArray) {
                ArgumentTypes = new Type[] { type.GetElementType () };
                CommonType = type.GetArrayRank () == 1 ? ComplexType.Array : ComplexType.MultiDimensionalArray;
            }
            else {
                var t = type;
                if (t.IsGenericType == false) {
                    while ((t = t.BaseType) != null) {
                        if (t.IsGenericType) {
                            break;
                        }
                    }
                }
                if (t != null) {
                    ArgumentTypes = t.GetGenericArguments ();
                    var gt = t.GetGenericTypeDefinition ();
                    if (gt.Equals (typeof (Dictionary<,>))) {
                        CommonType = ComplexType.Dictionary;
                    }
                    else if (gt.Equals (typeof (List<>))) {
                        CommonType = ComplexType.List;
                    }
                    else if (gt.Equals (typeof (Nullable<>))) {
                        CommonType = ComplexType.Nullable;
                        SerializeMethod = JsonSerializer.GetWriteJsonMethod (ArgumentTypes[0]);
                    }
                }
            }
            if (typeof(IEnumerable).IsAssignableFrom (type)) {
                if (typeof(Array).IsAssignableFrom (type) == false) {
                    AppendItem = Reflection.CreateWrapperMethod<AddCollectionItem> (Reflection.FindMethod (type, "Add", new Type[1] { null }));
                }
                if (ArgumentTypes != null && ArgumentTypes.Length == 1) {
                    ItemSerializer = JsonSerializer.GetWriteJsonMethod (ArgumentTypes[0]);
                    ItemDeserializer = JsonDeserializer.GetReadJsonMethod (ArgumentTypes[0]);
                }
            }
            if (ArgumentTypes != null) {
                ArgumentReflections = new ReflectionCache[ArgumentTypes.Length];
            }
            if (CommonType != ComplexType.Array
                && CommonType != ComplexType.MultiDimensionalArray
                && CommonType != ComplexType.Nullable) {
                var t = type;
                if (type.IsNested == false && type.IsPublic == false) {
                    ConstructorInfo |= ConstructorTypes.NonPublic;
                }
                else {
                    while (t != null && t.IsNested) {
                        if (t.IsNestedPublic == false) {
                            ConstructorInfo |= ConstructorTypes.NonPublic;
                        }
                        t = t.DeclaringType;
                    }
                }
                if (type.IsClass || type.IsValueType) {
                    Constructor = Reflection.CreateConstructorMethod (type, type.IsVisible == false || typeof (DatasetSchema).Equals (type));
                    if (Constructor != null && Constructor.Method.IsPublic == false) {
                        ConstructorInfo |= ConstructorTypes.NonPublic;
                    }
                    if (Constructor == null) {
                        var c = type.GetConstructors (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
                        if (c != null && c.Length > 0) {
                            ConstructorInfo |= ConstructorTypes.Parametric;
                        }
                    }

                    Members = Reflection.GetMembers (type);
                }
            }
            //if (typeof (IEnumerable).IsAssignableFrom (type)) {
            //	return;
            //}
            //if (JsonDataType != JsonDataType.Undefined) {
            //	return;
            //}
        }
예제 #36
0
 void IJsonWrapper.SetLong(long val)
 {
     type      = JsonDataType.Long;
     inst_long = val;
     json      = null;
 }
 void IJsonWrapper.SetBoolean(bool val)
 {
     type = JsonDataType.Boolean;
     inst_boolean = val;
     json = null;
 }
예제 #38
0
 void IJsonWrapper.SetString(string val)
 {
     type        = JsonDataType.String;
     inst_string = val;
     json        = null;
 }
 void IJsonWrapper.SetInt(int val)
 {
     type = JsonDataType.Int;
     inst_int = val;
     json = null;
 }
예제 #40
0
 public override void SetValue(string pValue)
 {
     mType  = JsonDataType.StringValue;
     mValue = pValue;
 }
 void IJsonWrapper.SetString(string val)
 {
     type = JsonDataType.String;
     inst_string = val;
     json = null;
 }
예제 #42
0
 public override void SetValue(float pValue)
 {
     mType  = JsonDataType.FloatValue;
     mValue = pValue;
 }
 public JsonData(double number)
 {
     type = JsonDataType.Double;
     inst_double = number;
 }
예제 #44
0
 public override void SetValue(double pValue)
 {
     mType  = JsonDataType.DoubleValue;
     mValue = pValue;
 }
 public JsonData(long number)
 {
     type = JsonDataType.Long;
     inst_long = number;
 }
예제 #46
0
 public override void SetValue(int pValue)
 {
     mType  = JsonDataType.IntValue;
     mValue = pValue;
 }
        private IList EnsureList()
        {
            if (type == JsonDataType.Array)
                return (IList) inst_array;

            if (type != JsonDataType.None)
                throw new InvalidOperationException (
                    "Instance of JsonData is not a list");

            type = JsonDataType.Array;
            inst_array = new List<JsonData> ();

            return (IList) inst_array;
        }
예제 #48
0
 public override void SetValue(long pValue)
 {
     mType  = JsonDataType.LongValue;
     mValue = pValue;
 }
 private static object MakeSwaggerProperty(JsonDataType type, string customDataType, string description)
 {
     Dictionary<string, object> definition = null;
     if (type == JsonDataType.ODataType)
     {
         definition = new Dictionary<string, object> {
             { "$ref", "#/definitions/" + customDataType.SwaggerResourceName() }
         };
     }
     else
     {
         definition = new Dictionary<string, object>
         {
             { "type", type.SwaggerType() }
         };
     }
     if (!string.IsNullOrEmpty(description))
     {
         definition.Add("description", description);
     }
     return definition;
 }
예제 #50
0
 public override void SetValue(bool pValue)
 {
     mType  = JsonDataType.BoolValue;
     mValue = pValue;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="JsonDataAttribute"/> class.
 /// </summary>
 /// <param name="dataType">Type of the data.</param>
 public JsonDataAttribute(JsonDataType dataType)
     : this(dataType, false)
 {
 }
예제 #52
0
 protected JsonData(JsonDataType type)
 {
     Type = type;
 }
예제 #53
0
        public override void WriteEndAttribute()
        {
            if (IsClosed)
            {
                ThrowClosed();
            }
            if (!HasOpenAttribute)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
                    new XmlException(SR.GetString(SR.JsonNoMatchingStartAttribute)));
            }

            Fx.Assert(!(isWritingDataTypeAttribute && isWritingServerTypeAttribute),
                "Can not write type attribute and __type attribute at the same time.");

            if (isWritingDataTypeAttribute)
            {
                switch (attributeText)
                {
                    case JsonGlobals.numberString:
                        {
                            ThrowIfServerTypeWritten(JsonGlobals.numberString);
                            dataType = JsonDataType.Number;
                            break;
                        }
                    case JsonGlobals.stringString:
                        {
                            ThrowIfServerTypeWritten(JsonGlobals.stringString);
                            dataType = JsonDataType.String;
                            break;
                        }
                    case JsonGlobals.arrayString:
                        {
                            ThrowIfServerTypeWritten(JsonGlobals.arrayString);
                            dataType = JsonDataType.Array;
                            break;
                        }
                    case JsonGlobals.objectString:
                        {
                            dataType = JsonDataType.Object;
                            break;
                        }
                    case JsonGlobals.nullString:
                        {
                            ThrowIfServerTypeWritten(JsonGlobals.nullString);
                            dataType = JsonDataType.Null;
                            break;
                        }
                    case JsonGlobals.booleanString:
                        {
                            ThrowIfServerTypeWritten(JsonGlobals.booleanString);
                            dataType = JsonDataType.Boolean;
                            break;
                        }
                    default:
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
                            new XmlException(SR.GetString(SR.JsonUnexpectedAttributeValue, attributeText)));
                }

                attributeText = null;
                isWritingDataTypeAttribute = false;

                if (!IsWritingNameWithMapping || WrittenNameWithMapping)
                {
                    WriteDataTypeServerType();
                }
            }
            else if (isWritingServerTypeAttribute)
            {
                serverTypeValue = attributeText;
                attributeText = null;
                isWritingServerTypeAttribute = false;

                // we are writing __type after type="object" (enforced by WSE)
                if ((!IsWritingNameWithMapping || WrittenNameWithMapping) && dataType == JsonDataType.Object)
                {
                    WriteServerTypeAttribute();
                }
            }
            else if (IsWritingNameAttribute)
            {
                WriteJsonElementName(attributeText);
                attributeText = null;
                nameState = NameState.IsWritingNameWithMapping | NameState.WrittenNameWithMapping;
                WriteDataTypeServerType();
            }
            else if (isWritingXmlnsAttribute)
            {
                if (!string.IsNullOrEmpty(attributeText) && isWritingXmlnsAttributeDefaultNs)
                {
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument("ns", SR.GetString(SR.JsonNamespaceMustBeEmpty, attributeText));
                }

                attributeText = null;
                isWritingXmlnsAttribute = false;
                isWritingXmlnsAttributeDefaultNs = false;
            }
        }
예제 #54
0
 public ScalarValue(string value, JsonDataType dataType)
 {
     this.value    = value;
     this.dataType = dataType;
 }
예제 #55
0
 private void WriteServerTypeAttribute()
 {
     string value = _serverTypeValue;
     JsonDataType oldDataType = _dataType;
     NameState oldNameState = _nameState;
     WriteStartElement(JsonGlobals.serverTypeString);
     WriteValue(value);
     WriteEndElement();
     _dataType = oldDataType;
     _nameState = oldNameState;
     _wroteServerTypeAttribute = true;
 }
예제 #56
0
 public FieldValue(int fieldIndex)
 {
     this.fieldIndex = fieldIndex;
     dataType        = JsonDataType.String;
 }
예제 #57
0
        public override void WriteEndAttribute()
        {
            if (IsClosed)
            {
                ThrowClosed();
            }
            if (!HasOpenAttribute)
            {
                throw new XmlException(SR.JsonNoMatchingStartAttribute);
            }

            Fx.Assert(!(_isWritingDataTypeAttribute && _isWritingServerTypeAttribute),
                "Can not write type attribute and __type attribute at the same time.");

            if (_isWritingDataTypeAttribute)
            {
                switch (_attributeText)
                {
                    case JsonGlobals.numberString:
                        {
                            ThrowIfServerTypeWritten(JsonGlobals.numberString);
                            _dataType = JsonDataType.Number;
                            break;
                        }
                    case JsonGlobals.stringString:
                        {
                            ThrowIfServerTypeWritten(JsonGlobals.stringString);
                            _dataType = JsonDataType.String;
                            break;
                        }
                    case JsonGlobals.arrayString:
                        {
                            ThrowIfServerTypeWritten(JsonGlobals.arrayString);
                            _dataType = JsonDataType.Array;
                            break;
                        }
                    case JsonGlobals.objectString:
                        {
                            _dataType = JsonDataType.Object;
                            break;
                        }
                    case JsonGlobals.nullString:
                        {
                            ThrowIfServerTypeWritten(JsonGlobals.nullString);
                            _dataType = JsonDataType.Null;
                            break;
                        }
                    case JsonGlobals.booleanString:
                        {
                            ThrowIfServerTypeWritten(JsonGlobals.booleanString);
                            _dataType = JsonDataType.Boolean;
                            break;
                        }
                    default:
                        throw new XmlException(SR.Format(SR.JsonUnexpectedAttributeValue, _attributeText));
                }

                _attributeText = null;
                _isWritingDataTypeAttribute = false;

                if (!IsWritingNameWithMapping || WrittenNameWithMapping)
                {
                    WriteDataTypeServerType();
                }
            }
            else if (_isWritingServerTypeAttribute)
            {
                _serverTypeValue = _attributeText;
                _attributeText = null;
                _isWritingServerTypeAttribute = false;

                // we are writing __type after type="object" (enforced by WSE)
                if ((!IsWritingNameWithMapping || WrittenNameWithMapping) && _dataType == JsonDataType.Object)
                {
                    WriteServerTypeAttribute();
                }
            }
            else if (IsWritingNameAttribute)
            {
                WriteJsonElementName(_attributeText);
                _attributeText = null;
                _nameState = NameState.IsWritingNameWithMapping | NameState.WrittenNameWithMapping;
                WriteDataTypeServerType();
            }
            else if (_isWritingXmlnsAttribute)
            {
                if (!string.IsNullOrEmpty(_attributeText) && _isWritingXmlnsAttributeDefaultNs)
                {
                    throw new ArgumentException(SR.Format(SR.JsonNamespaceMustBeEmpty, _attributeText));
                }

                _attributeText = null;
                _isWritingXmlnsAttribute = false;
                _isWritingXmlnsAttributeDefaultNs = false;
            }
        }
예제 #58
0
        public override FieldObject Evaluate(RawRecord record)
        {
            //string value1 = f1.Evaluate(record);
            //string value2 = f2.Evaluate(record);
            string       value1     = f1.Evaluate(record)?.ToValue;
            string       value2     = f2.Evaluate(record)?.ToValue;
            JsonDataType targetType = DataType();

            switch (targetType)
            {
            case JsonDataType.Boolean:
                bool bool_value1, bool_value2;
                if (bool.TryParse(value1, out bool_value1) && bool.TryParse(value2, out bool_value2))
                {
                    switch (binaryType)
                    {
                    case BinaryExpressionType.BitwiseAnd:
                        //return (bool_value1 ^ bool_value2).ToString();
                        return(new StringField((bool_value1 ^ bool_value2).ToString(), JsonDataType.Boolean));

                    case BinaryExpressionType.BitwiseOr:
                        //return (bool_value1 | bool_value2).ToString();
                        return(new StringField((bool_value1 | bool_value2).ToString(), JsonDataType.Boolean));

                    case BinaryExpressionType.BitwiseXor:
                        //return (bool_value1 ^ bool_value2).ToString();
                        return(new StringField((bool_value1 ^ bool_value2).ToString(), JsonDataType.Boolean));

                    default:
                        throw new QueryCompilationException("Operator " + binaryType.ToString() + " cannot be applied to operands of type \"boolean\".");
                    }
                }
                else
                {
                    throw new QueryCompilationException(string.Format("Cannot cast \"{0}\" or \"{1}\" to values of type \"boolean\"",
                                                                      value1, value2));
                }

            case JsonDataType.Bytes:
                switch (binaryType)
                {
                case BinaryExpressionType.Add:
                    //return value1 + value2.Substring(2);    // A binary string starts with 0x
                    return(new StringField(value1 + value2.Substring(2), JsonDataType.Bytes));

                default:
                    throw new QueryCompilationException("Operator " + binaryType.ToString() + " cannot be applied to operands of type \"bytes\".");
                }

            case JsonDataType.Int:
                int int_value1, int_value2;
                if (int.TryParse(value1, out int_value1) && int.TryParse(value2, out int_value2))
                {
                    switch (binaryType)
                    {
                    case BinaryExpressionType.Add:
                        //return (int_value1 + int_value2).ToString();
                        return(new StringField((int_value1 + int_value2).ToString(), JsonDataType.Int));

                    case BinaryExpressionType.BitwiseAnd:
                        //return (int_value1 & int_value2).ToString();
                        return(new StringField((int_value1 & int_value2).ToString(), JsonDataType.Int));

                    case BinaryExpressionType.BitwiseOr:
                        //return (int_value1 | int_value2).ToString();
                        return(new StringField((int_value1 | int_value2).ToString(), JsonDataType.Int));

                    case BinaryExpressionType.BitwiseXor:
                        //return (int_value1 ^ int_value2).ToString();
                        return(new StringField((int_value1 ^ int_value2).ToString(), JsonDataType.Int));

                    case BinaryExpressionType.Divide:
                        //return (int_value1 / int_value2).ToString();
                        return(new StringField((int_value1 / int_value2).ToString(), JsonDataType.Int));

                    case BinaryExpressionType.Modulo:
                        //return (int_value1 % int_value2).ToString();
                        return(new StringField((int_value1 % int_value2).ToString(), JsonDataType.Int));

                    case BinaryExpressionType.Multiply:
                        //return (int_value1 * int_value2).ToString();
                        return(new StringField((int_value1 * int_value2).ToString(), JsonDataType.Int));

                    case BinaryExpressionType.Subtract:
                        //return (int_value1 - int_value2).ToString();
                        return(new StringField((int_value1 - int_value2).ToString(), JsonDataType.Int));

                    default:
                        //return "";
                        return(new StringField(""));
                    }
                }
                else
                {
                    throw new QueryCompilationException(string.Format("Cannot cast \"{0}\" or \"{1}\" to values of type \"int\"",
                                                                      value1, value2));
                }

            case JsonDataType.Long:
                long long_value1, long_value2;
                if (long.TryParse(value1, out long_value1) && long.TryParse(value2, out long_value2))
                {
                    switch (binaryType)
                    {
                    case BinaryExpressionType.Add:
                        //return (long_value1 + long_value2).ToString();
                        return(new StringField((long_value1 + long_value2).ToString(), JsonDataType.Long));

                    case BinaryExpressionType.BitwiseAnd:
                        //return (long_value1 & long_value2).ToString();
                        return(new StringField((long_value1 & long_value2).ToString(), JsonDataType.Long));

                    case BinaryExpressionType.BitwiseOr:
                        //return (long_value1 | long_value2).ToString();
                        return(new StringField((long_value1 | long_value2).ToString(), JsonDataType.Long));

                    case BinaryExpressionType.BitwiseXor:
                        //return (long_value1 ^ long_value2).ToString();
                        return(new StringField((long_value1 ^ long_value2).ToString(), JsonDataType.Long));

                    case BinaryExpressionType.Divide:
                        //return (long_value1 / long_value2).ToString();
                        return(new StringField((long_value1 / long_value2).ToString(), JsonDataType.Long));

                    case BinaryExpressionType.Modulo:
                        //return (long_value1 % long_value2).ToString();
                        return(new StringField((long_value1 % long_value2).ToString(), JsonDataType.Long));

                    case BinaryExpressionType.Multiply:
                        //return (long_value1 * long_value2).ToString();
                        return(new StringField((long_value1 * long_value2).ToString(), JsonDataType.Long));

                    case BinaryExpressionType.Subtract:
                        //return (long_value1 - long_value2).ToString();
                        return(new StringField((long_value1 - long_value2).ToString(), JsonDataType.Long));

                    default:
                        //return "";
                        return(new StringField(""));
                    }
                }
                else
                {
                    throw new QueryCompilationException(string.Format("Cannot cast \"{0}\" or \"{1}\" to values of type \"long\"",
                                                                      value1, value2));
                }

            case JsonDataType.Double:
                double double_value1, double_value2;
                if (double.TryParse(value1, out double_value1) && double.TryParse(value2, out double_value2))
                {
                    switch (binaryType)
                    {
                    case BinaryExpressionType.Add:
                        //return (double_value1 + double_value2).ToString();
                        return(new StringField((double_value1 + double_value2).ToString(), JsonDataType.Double));

                    case BinaryExpressionType.Divide:
                        //return (double_value1 / double_value2).ToString();
                        return(new StringField((double_value1 / double_value2).ToString(), JsonDataType.Double));

                    case BinaryExpressionType.Modulo:
                        //return (double_value1 % double_value2).ToString();
                        return(new StringField((double_value1 % double_value2).ToString(), JsonDataType.Double));

                    case BinaryExpressionType.Multiply:
                        //return (double_value1 * double_value2).ToString();
                        return(new StringField((double_value1 * double_value2).ToString(), JsonDataType.Double));

                    case BinaryExpressionType.Subtract:
                        //return (double_value1 - double_value2).ToString();
                        return(new StringField((double_value1 - double_value2).ToString(), JsonDataType.Double));

                    default:
                        throw new QueryCompilationException("Operator " + binaryType.ToString() + " cannot be applied to operands of type 'double'.");
                    }
                }
                else
                {
                    throw new QueryCompilationException(string.Format("Cannot cast \"{0}\" or \"{1}\" to values of type \"double\"",
                                                                      value1, value2));
                }

            case JsonDataType.Float:
                float float_value1, float_value2;
                if (float.TryParse(value1, out float_value1) && float.TryParse(value2, out float_value2))
                {
                    switch (binaryType)
                    {
                    case BinaryExpressionType.Add:
                        //return (float_value1 + float_value2).ToString();
                        return(new StringField((float_value1 + float_value2).ToString(), JsonDataType.Float));

                    case BinaryExpressionType.Divide:
                        //return (float_value1 / float_value2).ToString();
                        return(new StringField((float_value1 / float_value2).ToString(), JsonDataType.Float));

                    case BinaryExpressionType.Modulo:
                        //return (float_value1 % float_value2).ToString();
                        return(new StringField((float_value1 % float_value2).ToString(), JsonDataType.Float));

                    case BinaryExpressionType.Multiply:
                        //return (float_value1 * float_value2).ToString();
                        return(new StringField((float_value1 * float_value2).ToString(), JsonDataType.Float));

                    case BinaryExpressionType.Subtract:
                        //return (float_value1 - float_value2).ToString();
                        return(new StringField((float_value1 - float_value2).ToString(), JsonDataType.Float));

                    default:
                        throw new QueryCompilationException("Operator " + binaryType.ToString() + " cannot be applied to operands of type 'float'.");
                    }
                }
                else
                {
                    throw new QueryCompilationException(string.Format("Cannot cast \"{0}\" or \"{1}\" to values of type \"float\"",
                                                                      value1, value2));
                }

            case JsonDataType.String:
                switch (binaryType)
                {
                case BinaryExpressionType.Add:
                    //return value1 + value2;
                    return(new StringField(value1 + value2));

                default:
                    throw new QueryCompilationException("Operator " + binaryType.ToString() + " cannot be applied to operands of type \"string\".");
                }

            case JsonDataType.Date:
                throw new NotImplementedException();

            case JsonDataType.Null:
                return(null);

            default:
                throw new QueryCompilationException("Unsupported data type.");
            }
        }
예제 #59
0
        public override void WriteStartElement(string prefix, string localName, string ns)
        {
            if (localName == null)
            {
                throw new ArgumentNullException(nameof(localName));
            }
            if (localName.Length == 0)
            {
                throw new ArgumentException(SR.JsonInvalidLocalNameEmpty, nameof(localName));
            }
            if (!string.IsNullOrEmpty(prefix))
            {
                if (string.IsNullOrEmpty(ns) || !TrySetWritingNameWithMapping(localName, ns))
                {
                    throw new ArgumentException(SR.Format(SR.JsonPrefixMustBeNullOrEmpty, prefix), nameof(prefix));
                }
            }
            if (!string.IsNullOrEmpty(ns))
            {
                if (!TrySetWritingNameWithMapping(localName, ns))
                {
                    throw new ArgumentException(SR.Format(SR.JsonNamespaceMustBeEmpty, ns), nameof(ns));
                }
            }
            if (IsClosed)
            {
                ThrowClosed();
            }
            if (HasOpenAttribute)
            {
                throw new XmlException(SR.Format(SR.JsonOpenAttributeMustBeClosedFirst, "WriteStartElement"));
            }
            if ((_nodeType != JsonNodeType.None) && _depth == 0)
            {
                throw new XmlException(SR.JsonMultipleRootElementsNotAllowedOnWriter);
            }

            switch (_nodeType)
            {
                case JsonNodeType.None:
                    {
                        if (!localName.Equals(JsonGlobals.rootString))
                        {
                            throw new XmlException(SR.Format(SR.JsonInvalidRootElementName, localName, JsonGlobals.rootString));
                        }
                        EnterScope(JsonNodeType.Element);
                        break;
                    }
                case JsonNodeType.Element:
                    {
                        if ((_dataType != JsonDataType.Array) && (_dataType != JsonDataType.Object))
                        {
                            throw new XmlException(SR.JsonNodeTypeArrayOrObjectNotSpecified);
                        }
                        if (_indent)
                        {
                            WriteNewLine();
                            WriteIndent();
                        }
                        if (!IsWritingCollection)
                        {
                            if (_nameState != NameState.IsWritingNameWithMapping)
                            {
                                WriteJsonElementName(localName);
                            }
                        }
                        else if (!localName.Equals(JsonGlobals.itemString))
                        {
                            throw new XmlException(SR.Format(SR.JsonInvalidItemNameForArrayElement, localName, JsonGlobals.itemString));
                        }
                        EnterScope(JsonNodeType.Element);
                        break;
                    }
                case JsonNodeType.EndElement:
                    {
                        if (_endElementBuffer)
                        {
                            _nodeWriter.WriteText(JsonGlobals.MemberSeparatorChar);
                        }
                        if (_indent)
                        {
                            WriteNewLine();
                            WriteIndent();
                        }
                        if (!IsWritingCollection)
                        {
                            if (_nameState != NameState.IsWritingNameWithMapping)
                            {
                                WriteJsonElementName(localName);
                            }
                        }
                        else if (!localName.Equals(JsonGlobals.itemString))
                        {
                            throw new XmlException(SR.Format(SR.JsonInvalidItemNameForArrayElement, localName, JsonGlobals.itemString));
                        }
                        EnterScope(JsonNodeType.Element);
                        break;
                    }
                default:
                    throw new XmlException(SR.JsonInvalidStartElementCall);
            }

            _isWritingDataTypeAttribute = false;
            _isWritingServerTypeAttribute = false;
            _isWritingXmlnsAttribute = false;
            _wroteServerTypeAttribute = false;
            _serverTypeValue = null;
            _dataType = JsonDataType.None;
            _nodeType = JsonNodeType.Element;
        }
예제 #60
0
        public override bool Evaluate(RawRecord record)
        {
            //string value1 = firstScalarFunction.Evaluate(record);
            //string value2 = secondScalarFunction.Evaluate(record);
            string value1 = firstScalarFunction.Evaluate(record)?.ToValue;
            string value2 = secondScalarFunction.Evaluate(record)?.ToValue;

            JsonDataType type1 = firstScalarFunction.DataType();
            JsonDataType type2 = secondScalarFunction.DataType();

            JsonDataType targetType = type1 > type2 ? type1 : type2;

            if (value1 == null || value2 == null)
            {
                return(false);
            }

            switch (targetType)
            {
            case JsonDataType.Boolean:
                bool bool_value1, bool_value2;
                if (bool.TryParse(value1, out bool_value1) && bool.TryParse(value2, out bool_value2))
                {
                    switch (comparisonType)
                    {
                    case BooleanComparisonType.Equals:
                        return(bool_value1 == bool_value2);

                    case BooleanComparisonType.NotEqualToBrackets:
                    case BooleanComparisonType.NotEqualToExclamation:
                        return(bool_value1 != bool_value2);

                    default:
                        throw new QueryCompilationException("Operator " + comparisonType.ToString() + " cannot be applied to operands of type \"boolean\".");
                    }
                }
                else
                {
                    throw new QueryCompilationException(string.Format("Cannot cast \"{0}\" or \"{1}\" to values of type \"boolean\"",
                                                                      value1, value2));
                }

            case JsonDataType.Bytes:
                switch (comparisonType)
                {
                case BooleanComparisonType.Equals:
                    return(value1 == value2);

                case BooleanComparisonType.NotEqualToBrackets:
                case BooleanComparisonType.NotEqualToExclamation:
                    return(value1 != value2);

                default:
                    throw new NotImplementedException();
                }

            case JsonDataType.Int:
                int int_value1, int_value2;
                if (int.TryParse(value1, out int_value1) && int.TryParse(value2, out int_value2))
                {
                    switch (comparisonType)
                    {
                    case BooleanComparisonType.Equals:
                        return(int_value1 == int_value2);

                    case BooleanComparisonType.GreaterThan:
                        return(int_value1 > int_value2);

                    case BooleanComparisonType.GreaterThanOrEqualTo:
                        return(int_value1 >= int_value2);

                    case BooleanComparisonType.LessThan:
                        return(int_value1 < int_value2);

                    case BooleanComparisonType.LessThanOrEqualTo:
                        return(int_value1 <= int_value2);

                    case BooleanComparisonType.NotEqualToBrackets:
                    case BooleanComparisonType.NotEqualToExclamation:
                        return(int_value1 != int_value2);

                    case BooleanComparisonType.NotGreaterThan:
                        return(!(int_value1 > int_value2));

                    case BooleanComparisonType.NotLessThan:
                        return(!(int_value1 < int_value2));

                    default:
                        throw new QueryCompilationException("Operator " + comparisonType.ToString() + " cannot be applied to operands of type \"int\".");
                    }
                }
                else
                {
                    throw new QueryCompilationException(string.Format("Cannot cast \"{0}\" or \"{1}\" to values of type \"int\"",
                                                                      value1, value2));
                }

            case JsonDataType.Long:
                long long_value1, long_value2;
                if (long.TryParse(value1, out long_value1) && long.TryParse(value2, out long_value2))
                {
                    switch (comparisonType)
                    {
                    case BooleanComparisonType.Equals:
                        return(long_value1 == long_value2);

                    case BooleanComparisonType.GreaterThan:
                        return(long_value1 > long_value2);

                    case BooleanComparisonType.GreaterThanOrEqualTo:
                        return(long_value1 >= long_value2);

                    case BooleanComparisonType.LessThan:
                        return(long_value1 < long_value2);

                    case BooleanComparisonType.LessThanOrEqualTo:
                        return(long_value1 <= long_value2);

                    case BooleanComparisonType.NotEqualToBrackets:
                    case BooleanComparisonType.NotEqualToExclamation:
                        return(long_value1 != long_value2);

                    case BooleanComparisonType.NotGreaterThan:
                        return(!(long_value1 > long_value2));

                    case BooleanComparisonType.NotLessThan:
                        return(!(long_value1 < long_value2));

                    default:
                        throw new QueryCompilationException("Operator " + comparisonType.ToString() + " cannot be applied to operands of type \"long\".");
                    }
                }
                else
                {
                    throw new QueryCompilationException(string.Format("Cannot cast \"{0}\" or \"{1}\" to values of type \"long\"",
                                                                      value1, value2));
                }

            case JsonDataType.Double:
                double double_value1, double_value2;
                if (double.TryParse(value1, out double_value1) && double.TryParse(value2, out double_value2))
                {
                    switch (comparisonType)
                    {
                    case BooleanComparisonType.Equals:
                        return(double_value1 == double_value2);

                    case BooleanComparisonType.GreaterThan:
                        return(double_value1 > double_value2);

                    case BooleanComparisonType.GreaterThanOrEqualTo:
                        return(double_value1 >= double_value2);

                    case BooleanComparisonType.LessThan:
                        return(double_value1 < double_value2);

                    case BooleanComparisonType.LessThanOrEqualTo:
                        return(double_value1 <= double_value2);

                    case BooleanComparisonType.NotEqualToBrackets:
                    case BooleanComparisonType.NotEqualToExclamation:
                        return(double_value1 != double_value2);

                    case BooleanComparisonType.NotGreaterThan:
                        return(!(double_value1 > double_value2));

                    case BooleanComparisonType.NotLessThan:
                        return(!(double_value1 < double_value2));

                    default:
                        throw new QueryCompilationException("Operator " + comparisonType.ToString() + " cannot be applied to operands of type \"double\".");
                    }
                }
                else
                {
                    throw new QueryCompilationException(string.Format("Cannot cast \"{0}\" or \"{1}\" to values of type \"double\"",
                                                                      value1, value2));
                }

            case JsonDataType.Float:
                float float_value1, float_value2;
                if (float.TryParse(value1, out float_value1) && float.TryParse(value2, out float_value2))
                {
                    switch (comparisonType)
                    {
                    case BooleanComparisonType.Equals:
                        return(float_value1 == float_value2);

                    case BooleanComparisonType.GreaterThan:
                        return(float_value1 > float_value2);

                    case BooleanComparisonType.GreaterThanOrEqualTo:
                        return(float_value1 >= float_value2);

                    case BooleanComparisonType.LessThan:
                        return(float_value1 < float_value2);

                    case BooleanComparisonType.LessThanOrEqualTo:
                        return(float_value1 <= float_value2);

                    case BooleanComparisonType.NotEqualToBrackets:
                    case BooleanComparisonType.NotEqualToExclamation:
                        return(float_value1 != float_value2);

                    case BooleanComparisonType.NotGreaterThan:
                        return(!(float_value1 > float_value2));

                    case BooleanComparisonType.NotLessThan:
                        return(!(float_value1 < float_value2));

                    default:
                        throw new QueryCompilationException("Operator " + comparisonType.ToString() + " cannot be applied to operands of type \"float\".");
                    }
                }
                else
                {
                    throw new QueryCompilationException(string.Format("Cannot cast \"{0}\" or \"{1}\" to values of type \"float\"",
                                                                      value1, value2));
                }

            case JsonDataType.String:
                switch (comparisonType)
                {
                case BooleanComparisonType.Equals:
                    return(value1 == value2);

                case BooleanComparisonType.GreaterThan:
                case BooleanComparisonType.GreaterThanOrEqualTo:
                    return(value1.CompareTo(value2) > 0);

                case BooleanComparisonType.LessThan:
                case BooleanComparisonType.LessThanOrEqualTo:
                    return(value1.CompareTo(value2) > 0);

                case BooleanComparisonType.NotEqualToBrackets:
                case BooleanComparisonType.NotEqualToExclamation:
                    return(value1 != value2);

                case BooleanComparisonType.NotGreaterThan:
                    return(value1.CompareTo(value2) <= 0);

                case BooleanComparisonType.NotLessThan:
                    return(value1.CompareTo(value2) >= 0);

                default:
                    throw new QueryCompilationException("Operator " + comparisonType.ToString() + " cannot be applied to operands of type \"string\".");
                }

            case JsonDataType.Date:
                throw new NotImplementedException();

            case JsonDataType.Null:
                return(false);

            default:
                throw new QueryCompilationException("Unsupported data type.");
            }
        }