/// <summary> /// Creates a filter that rappresents a between filter /// </summary> /// <param name="fieldName">name of the filter</param> /// <param name="from">From</param> /// <param name="to">To</param> /// <returns>New filter that is a between</returns> public static RestFilter CreateBetweenFilter(string fieldName, object from, object to) { if (string.IsNullOrEmpty(fieldName)) { throw new ArgumentNullException(nameof(fieldName)); } if (from == null) { throw new ArgumentNullException(nameof(from)); } if (to == null) { throw new ArgumentNullException(nameof(to)); } var betweenFilter = new RestFilter { Logic = FilterLogics.And }; betweenFilter.Filters.Add(new RestFilter { Field = fieldName, Operator = FilterOperators.IsGreatherThanOrEqual, Value = from }); betweenFilter.Filters.Add(new RestFilter { Field = fieldName, Operator = FilterOperators.IsLessThanOrEqual, Value = to }); return(betweenFilter); }
/// <summary> /// Clone the current filter /// </summary> /// <returns>Cloned filter</returns> public RestFilter CloneFilter() { var result = new RestFilter(); CloneProperties(this, result); return(result); }
/// <summary> /// Clone properties from a filter to another /// </summary> /// <param name="from">From filter</param> /// <param name="to">To filter</param> private void CloneProperties(RestFilter from, RestFilter to) { if (from == null) { throw new ArgumentNullException(nameof(from)); } if (to == null) { throw new ArgumentNullException(nameof(to)); } to.Field = from.Field; to.IgnoreCase = from.IgnoreCase; to.Logic = from.Logic; to.Value = from.Value; if (from.Filters != null) { to.Filters = new List <RestFilter>(); foreach (var filter in from.Filters) { if (filter == null) { to.Filters.Add(null); } else { var innerFilter = filter.CloneFilter(); to.Filters.Add(innerFilter); } } } }
/// <summary> /// Gets the list that rapresents the smart filter /// </summary> /// <param name="fields">Fields of the table</param> /// <param name="minNum">Min number value (if any)</param> /// <param name="maxNum">Max number value (if any)</param> /// <param name="minDate">Min date value (if any)</param> /// <param name="maxDate">Max date value (if any)</param> /// <returns>List of filters</returns> private RestFilter ComposeSmartFilter(List <FieldMetadata> fields, decimal?minNum, decimal?maxNum, DateTime?minDate, DateTime?maxDate) { var filters = new List <RestFilter>(); foreach (var field in fields) { switch (field.Type) { case FieldDataTypes.String: filters.Add(new RestFilter { Field = field.Name, IgnoreCase = true, Operator = FilterOperators.Contains, Value = Value }); break; case FieldDataTypes.Numeric: if (minNum.HasValue) { if (maxNum.HasValue) { filters.Add(RestFilter.CreateBetweenFilter(field.Name, minNum, maxNum)); } else { filters.Add(new RestFilter { Field = field.Name, Operator = FilterOperators.IsEqual, Value = minNum }); } } break; case FieldDataTypes.Date: case FieldDataTypes.DateTime: if (minDate.HasValue) { if (maxDate.HasValue) { filters.Add(RestFilter.CreateBetweenFilter(field.Name, minDate, maxDate)); } else { filters.Add(new RestFilter { Field = field.Name, Operator = FilterOperators.IsEqual, Value = minDate }); } } break; } } // No filters => return null if (!filters.Any()) { return(null); } // Single filter var maxIndex = filters.Count; if (maxIndex == 1) { return(filters[0]); } // Complex filter var result = new RestFilter { Logic = FilterLogics.Or, Filters = filters }; return(result); }