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