/// <summary> /// Execute filter on items of given JSON array using evaluator /// </summary> /// <param name="target">JSON array</param> /// <param name="filter">Filter to apply</param> /// <param name="filterEvaluator">Evaluation function which contains the logic of how given filter is applied</param> /// <returns>Matching results in array format</returns> public SimpleJson.JsonArray ApplyFilter(SimpleJson.JsonArray target, Elements.JAttributeFilter filter, Func <object, object, bool> filterEvaluator) { bool isArrayItemsTypeOfDictionaryObject = false; var resultsToReturn = new SimpleJson.JsonArray(); foreach (var targetItem in target) { if (targetItem is IDictionary <string, object> ) { var targetItemSource = targetItem as IDictionary <string, object>; if (EvaluateFilter(targetItemSource, filter, filterEvaluator)) { resultsToReturn.Add(targetItemSource); } isArrayItemsTypeOfDictionaryObject = true; } } if (isArrayItemsTypeOfDictionaryObject) { return(resultsToReturn); } else { // Right we do not support filtering on array with primitive values, so in that case, return target back return(target); } }
/// <summary> /// Execute filter on given JSON object using evaluator /// </summary> /// <param name="target">JSON object</param> /// <param name="filter">Filter to apply</param> /// <param name="filterEvaluator">Evaluation function which contains the logic of how given filter is applied</param> /// <returns>If given object is matched by filter, returns true. Otherwise, returns false.</returns> public bool EvaluateFilter(IDictionary <string, object> target, Elements.JAttributeFilter filter, Func <object, object, bool> filterEvaluator) { if (target.ContainsKey(filter.Attribute.Name)) { if (filterEvaluator(target[filter.Attribute.Name], filter.Filter.Value)) { return(true); } } return(false); }
/// <summary> /// Apply given filter on JSON data and return matching results /// </summary> /// <param name="dataToFilter">JSON data to which given filter is applied</param> /// <param name="filter">Filter to apply</param> /// <returns>Matching results</returns> private object FilterByAttributes(object dataToFilter, Elements.JAttributeFilter filter) { if (dataToFilter == null || filter == null || !(dataToFilter is SimpleJson.JsonArray || dataToFilter is IDictionary <string, object>)) { return(dataToFilter); } Func <object, object, bool> filterEvaluator = null; if (filter.Filter.FilterType == Elements.JFilter.FilterTypes.Equal) { filterEvaluator = (itemValue, filterValue) => { return(Utils.Comparison.CompareValues(itemValue, filterValue, (i, f) => { return i == f; }, (i, f) => { return i.ToValueString() == f.ToValueString(); })); }; } else if (filter.Filter.FilterType == Elements.JFilter.FilterTypes.GreaterThan) { filterEvaluator = (itemValue, filterValue) => { return(Utils.Comparison.CompareValues(itemValue, filterValue, (i, f) => { return i > f; }, (i, f) => { return i > f; }, (i, f) => { return i > f; })); }; } else if (filter.Filter.FilterType == Elements.JFilter.FilterTypes.GreaterThanOrEqual) { filterEvaluator = (itemValue, filterValue) => { return(Utils.Comparison.CompareValues(itemValue, filterValue, (i, f) => { return i >= f; }, (i, f) => { return i >= f; }, (i, f) => { return i >= f; })); }; } else if (filter.Filter.FilterType == Elements.JFilter.FilterTypes.LessThanOrEqual) { filterEvaluator = (itemValue, filterValue) => { return(Utils.Comparison.CompareValues(itemValue, filterValue, (i, f) => { return i <= f; }, (i, f) => { return i <= f; }, (i, f) => { return i <= f; })); }; } else if (filter.Filter.FilterType == Elements.JFilter.FilterTypes.LessThan) { filterEvaluator = (itemValue, filterValue) => { return(Utils.Comparison.CompareValues(itemValue, filterValue, (i, f) => { return i < f; }, (i, f) => { return i < f; }, (i, f) => { return i < f; })); }; } if (dataToFilter is SimpleJson.JsonArray) { return(ApplyFilter((SimpleJson.JsonArray)dataToFilter, filter, filterEvaluator)); } else if (dataToFilter is IDictionary <string, object> ) { if (EvaluateFilter((IDictionary <string, object>)dataToFilter, filter, filterEvaluator)) { return(dataToFilter); } } return(null); }