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); }
/// <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)); }
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); }