Пример #1
0
        public bool Evaluate(out IJsonValue value, IJSONDocument document)
        {
            value = null;
            JSONDocument doc = new JSONDocument();

            foreach (var pair in _document)
            {
                IJsonValue outValue;
                if (pair.Value.Evaluate(out outValue, document))
                {
                    doc.Add(pair.Key, outValue.Value);
                }
                else
                {
                    return(false);
                }
            }

            if (doc.Count > 0)
            {
                value = new ObjectJsonValue(doc);
            }
            return(true);
        }
Пример #2
0
        /// <summary>
        /// Returns a tuple of reduced JSON values.
        /// Bug: Greater than = Greater than equals to.
        /// </summary>
        private static Tuple <IJsonValue, IJsonValue> GetJSONValueRange(IEnumerable <ComparisonPredicate> expressions)
        {
            IJsonValue pin1 = NullValue.Null;
            IJsonValue pin2 = new ObjectJsonValue(new JSONDocument());

            foreach (var compareExpression in expressions)
            {
                //If pin1 is greater than pin2 the result set will be null.
                if (pin1.CompareTo(pin2) > 0)
                {
                    return(null);
                }

                IJsonValue value = compareExpression.ConstantValues[0];
                switch (compareExpression.Condition)
                {
                case Condition.Equals:
                case Condition.Like:
                    if (pin2.CompareTo(value) < 0 || pin1.CompareTo(value) > 0)
                    {
                        return(null);
                    }

                    pin2 = pin1 = value;
                    break;

                case Condition.GreaterThan:
                    if (value.CompareTo(pin2) >= 0)
                    {
                        return(null);
                    }

                    if (pin1.CompareTo(value) < 0)
                    {
                        pin1 = value;
                    }
                    break;

                case Condition.GreaterThanEqualTo:
                    if (value.CompareTo(pin2) > 0)
                    {
                        return(null);
                    }

                    if (pin1.CompareTo(value) < 0)
                    {
                        pin1 = value;
                    }
                    break;

                case Condition.LesserThan:
                    if (value.CompareTo(pin1) <= 0)
                    {
                        return(null);
                    }

                    if (pin2.CompareTo(value) > 0)
                    {
                        pin2 = value;
                    }
                    break;

                case Condition.LesserThanEqualTo:
                    if (value.CompareTo(pin1) < 0)
                    {
                        return(null);
                    }

                    if (pin2.CompareTo(value) > 0)
                    {
                        pin2 = value;
                    }
                    break;

                case Condition.Between:
                    //Both values could be equal.
                    if (value.CompareTo(pin2) > 0 ||
                        value.CompareTo(compareExpression.ConstantValues[0]) > 0)
                    {
                        return(null);
                    }
                    pin1 = value;
                    pin2 = compareExpression.ConstantValues[0];
                    break;

                case Condition.IsNull:
                    if (NullValue.Null.CompareTo(pin1) > 0)
                    {
                        return(null);
                    }

                    pin1 = pin2 = NullValue.Null;
                    break;

                case Condition.IsNotNull:
                    if (NullValue.Null.CompareTo(pin2) == 0)
                    {
                        return(null);
                    }

                    pin1 = new BooleanJsonValue(false);
                    break;

                case Condition.Exists:
                    break;

                case Condition.NotExists:
                    return(null);
                }
            }
            return(new Tuple <IJsonValue, IJsonValue>(pin1, pin2));
        }
Пример #3
0
        public static IJsonValue Wrap(object value)
        {
            if (value is JValue)
            {
                value = ((JValue)value).Value;
            }

            FieldDataType dataType  = JSONType.GetJSONType(value);
            IJsonValue    jsonValue = null;

            switch (dataType)
            {
            case FieldDataType.Array:
                var values = new List <IJsonValue>();
                if (value is System.Collections.ArrayList)
                {
                    var array = (System.Collections.ArrayList)value;
                    foreach (var obj in array)
                    {
                        values.Add(Wrap(obj));
                    }
                }
                else
                {
                    var array = (Array)value;
                    foreach (var obj in array)
                    {
                        values.Add(Wrap(obj));
                    }
                }
                jsonValue = new ArrayJsonValue(values.ToArray());
                break;

            case FieldDataType.Bool:
                jsonValue = new BooleanJsonValue((bool)value);
                break;

            case FieldDataType.DateTime:
                jsonValue = new DateTimeJsonValue((DateTime)value);
                break;

            case FieldDataType.Null:
                jsonValue = new NullValue();
                break;

            case FieldDataType.Number:
                jsonValue = new NumberJsonValue(value);
                break;

            case FieldDataType.Object:
                if (value.GetType() == typeof(JArray))
                {
                    var arr  = (JArray)value;
                    var vals = new List <IJsonValue>();
                    foreach (var obj in arr)
                    {
                        vals.Add(Wrap(obj));
                    }
                    jsonValue = new ArrayJsonValue(vals.ToArray());
                }
                else if (value.GetType() == typeof(IJsonValue[]))
                {
                    var arr = (IJsonValue[])value;
                    //var vals = new List<IJsonValue>();
                    //foreach (var obj in arr)
                    //{
                    //    vals.Add(Wrap(obj));
                    //}
                    jsonValue = new ArrayJsonValue(arr);    //vals.ToArray());
                }
                else
                {
                    jsonValue = new ObjectJsonValue(Serialize(value));
                }
                break;

            case FieldDataType.String:
                jsonValue = new StringJsonValue((string)value);
                break;
            }
            return(jsonValue);
        }