public void Test_Field_Case_NotChanged() { // arrange FilterQueryLanguage fql = new FilterQueryLanguage { FilterQueries = new[] { new FilterQuery { Logic = LogicTypes.OR, Field = "name", // camel case field FilterItems = new[] { new FilterItem { Operation = OperationTypes.EQ, Value = "Test", IsPreset = false, } } } }, Logic = LogicTypes.AND }; // act Assert.ThrowsException <ArgumentException>(() => FilterHelper.Convert <TestModel>(fql)); }
public void Test_WithPropertyCaseFix() { // arrange FilterQueryLanguage fql = new FilterQueryLanguage { FilterQueries = new[] { new FilterQuery { Logic = LogicTypes.OR, Field = "name", // camel case field FilterItems = new[] { new FilterItem { Operation = OperationTypes.EQ, Value = "Test", IsPreset = false, } } } }, Logic = LogicTypes.AND }; // act var exp = FilterHelper.Convert <TestModel>(fql, (value) => FilterHelper.ToPascalCase(value)); // assert Assert.AreEqual("(model.Name == \"Test\")", exp.Body.ToString()); }
public void TestCovert() { // arrange FilterQueryLanguage fql = new FilterQueryLanguage { FilterQueries = new[] { new FilterQuery { Logic = LogicTypes.OR, Field = "Name", FilterItems = new[] { new FilterItem { Operation = OperationTypes.EQ, Value = "Test", IsPreset = false, } } } }, Logic = LogicTypes.AND }; // act var exp = FilterHelper.Convert <TestModel>(fql); // assert Assert.AreEqual("(model.Name == \"Test\")", exp.Body.ToString()); }
public static Expression <Func <TModel, bool> > Convert <TModel>(FilterQueryLanguage fql, Func <string, string> fieldNameConverter) where TModel : class { var builder = new FilterExpressionBuilder <TModel>(fql.Logic); foreach (var filter in fql.FilterQueries) { bool isGroup = filter.FilterItems.Count > 1; if (isGroup) { builder.BeginGroup(filter.Logic); } foreach (var item in filter.FilterItems) { Action <string, string, bool> action; switch (item.Operation) { case OperationTypes.EQ: action = builder.BuildEquals; break; case OperationTypes.NEQ: action = builder.BuildNotEquals; break; case OperationTypes.GT: action = builder.BuildGreaterThan; break; case OperationTypes.LT: action = builder.BuildLessThan; break; case OperationTypes.GTE: action = builder.BuildGreaterThanOrEquals; break; case OperationTypes.LTE: action = builder.BuildLessThanOrEquals; break; case OperationTypes.CONTAINS: action = builder.BuildContains; break; case OperationTypes.STARTS: action = builder.BuildStartsWith; break; case OperationTypes.ENDS: action = builder.BuildEndsWith; break; default: throw new NotImplementedException(String.Format("Operator type {0} has not been implemented.", item.Operation)); } action(fieldNameConverter(filter.Field), item.Value, item.IsPreset); } if (isGroup) { builder.EndGroup(); } } return(builder.GetResult()); }
public static Expression <Func <TModel, bool> > Convert <TModel>(FilterQueryLanguage fql) where TModel : class { return(Convert <TModel>(fql, (value) => value)); }