Пример #1
0
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            if (expression.NodeType == ExpressionType.Constant)
            {
                string constantExpression = FormatConstantString(expression);
                return(new ConstantPredicateVisitor(constantExpression));
            }

            MemberExpression memberExpression = expression as MemberExpression;

            var compiledValue = Expression.Lambda(expression, null).Compile().DynamicInvoke(null);
            var result        = compiledValue.ToString();

            switch (compiledValue)
            {
            case DateTime dateTimeValue:

                return(new ConstantPredicateVisitor(dateTimeValue.ToUtcIso8601().WrapInQuotes()));

            case Enum enumResult:
                result = enumResult.GetDescription();
                break;
            }

            if (memberExpression?.Type == typeof(string) || typeof(Enum).IsAssignableFrom(memberExpression?.Type))
            {
                result = result.WrapInQuotes();
            }

            return(new ConstantPredicateVisitor(result));
        }
Пример #2
0
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            // The value null can be passed in Range method and should be rendered as *.
            if (expression.NodeType == ExpressionType.Constant && ((ConstantExpression)expression).Value == null)
            {
                return(new ConstantPredicateVisitor("*"));
            }

            if (expression.NodeType == ExpressionType.Constant)
            {
                return(new ConstantPredicateVisitor(expression.ToString()));
            }

            MemberExpression memberExpression = expression as MemberExpression;
            var compiledValue = Expression.Lambda(expression, null).Compile().DynamicInvoke(null);
            var result        = compiledValue.ToString();

            if (compiledValue is Enum enumResult)
            {
                result = enumResult.GetDescription();
            }

            if (memberExpression?.Type == typeof(string) || typeof(Enum).IsAssignableFrom(memberExpression?.Type))
            {
                result = result.WrapInQuotes();
            }

            return(new ConstantPredicateVisitor(result));
        }
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            BinaryExpression binaryExpression = expression as BinaryExpression;

            if (binaryExpression == null)
            {
                return(null);
            }

            IPredicateVisitor left  = predicateVisitorFactory.Create(binaryExpression.Left);
            IPredicateVisitor right = predicateVisitorFactory.Create(binaryExpression.Right);

            // variants.price.centAmount:range (1 to 30), (40 to 100)
            if (CanCombinePredicateVisitors(left, right))
            {
                return(CombinePredicateVisitors(left, right));
            }

            CollectionPredicateVisitor collectionPredicate = new CollectionPredicateVisitor(new List <IPredicateVisitor>()
            {
                left, right
            });

            return(collectionPredicate);
        }
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (expression == null)
            {
                return(null);
            }

            var innerExpression = methodCallExpression?.Arguments[1];

            if (innerExpression is LambdaExpression lambdaExpression)
            {
                var attributeExpression = lambdaExpression.Body;
                if (attributeExpression.NodeType == ExpressionType.And || attributeExpression.NodeType == ExpressionType.AndAlso)
                {
                    IPredicateVisitor        attributeValuePredicateVisitor = predicateVisitorFactory.Create(((BinaryExpression)attributeExpression).Right);
                    IPredicateVisitor        attributeName  = GetAttributeName(((BinaryExpression)attributeExpression).Left, predicateVisitorFactory);
                    AccessorPredicateVisitor parentAccessor = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]) as AccessorPredicateVisitor;
                    AccessorPredicateVisitor accessor       = new AccessorPredicateVisitor(attributeName, parentAccessor);
                    if (attributeValuePredicateVisitor is IAccessorAppendable accessorAppendablePredicate)
                    {
                        accessorAppendablePredicate.AppendAccessor(accessor);
                    }

                    return(attributeValuePredicateVisitor);
                }
            }

            throw new NotSupportedException();
        }
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression == null)
            {
                return(null);
            }

            IPredicateVisitor        parent     = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);
            List <IPredicateVisitor> parameters = new List <IPredicateVisitor>();

            var methodExpression =
                (MethodCallExpression)methodCallExpression.Arguments[1];

            if (Expression.Lambda(methodExpression).Compile().DynamicInvoke() is IEnumerable <object> arr)
            {
                foreach (var element in arr)
                {
                    parameters.Add(
                        new ConstantPredicateVisitor(element.ToString().WrapInQuotes()));
                }
            }

            CollectionPredicateVisitor collection = new CollectionPredicateVisitor(parameters);
            EqualPredicateVisitor      equal      = new EqualPredicateVisitor(parent, collection);

            return(equal);
        }
Пример #6
0
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression == null)
            {
                return(null);
            }

            string methodName = Mapping.AllowedMethods[methodCallExpression.Method.Name];

            var    memberExpression = methodCallExpression.Arguments[0] as MemberExpression;
            string currentName      = memberExpression.Member.Name;
            var    callerParent     = predicateVisitorFactory.Create(memberExpression.Expression);

            ConstantPredicateVisitor constant = new ConstantPredicateVisitor(currentName);

            // c.Key.In("c14", "c15")
            if (methodCallExpression.Arguments.Count > 1)
            {
                IPredicateVisitor methodArguments = predicateVisitorFactory.Create(methodCallExpression.Arguments[1]);
                var inner = new BinaryPredicateVisitor(constant, methodName, methodArguments);

                return(CombinePredicates(callerParent, inner));
            }

            // c.Key.IsDefined()
            var binaryPredicateVisitor = new BinaryPredicateVisitor(constant, methodName, new ConstantPredicateVisitor(string.Empty));

            return(CombinePredicates(callerParent, binaryPredicateVisitor));
        }
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression == null)
            {
                return(null);
            }

            string methodName = FilterMapping.AllowedGroupMethods[methodCallExpression.Method.Name];
            ConstantPredicateVisitor method     = new ConstantPredicateVisitor(methodName);
            IPredicateVisitor        parent     = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);
            List <IPredicateVisitor> parameters = new List <IPredicateVisitor>();

            if (methodCallExpression.Arguments[1].NodeType != ExpressionType.NewArrayInit)
            {
                return(null);
            }

            foreach (Expression part in ((NewArrayExpression)methodCallExpression.Arguments[1]).Expressions)
            {
                parameters.Add(predicateVisitorFactory.Create(part));
            }

            CollectionPredicateVisitor collection = new CollectionPredicateVisitor(parameters);
            EqualPredicateVisitor      equal      = new EqualPredicateVisitor(method, collection);

            Visitors.AccessorPredicateVisitor accessor = new Visitors.AccessorPredicateVisitor(equal, parent);
            return(accessor);
        }
Пример #8
0
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression == null)
            {
                return(null);
            }

            IPredicateVisitor        parent     = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);
            List <IPredicateVisitor> parameters = new List <IPredicateVisitor>();

            if (methodCallExpression.Arguments[1].NodeType != ExpressionType.NewArrayInit)
            {
                return(null);
            }

            foreach (Expression part in ((NewArrayExpression)methodCallExpression.Arguments[1]).Expressions)
            {
                parameters.Add(predicateVisitorFactory.Create(part));
            }

            CollectionPredicateVisitor collection = new CollectionPredicateVisitor(parameters);
            EqualPredicateVisitor      equal      = new EqualPredicateVisitor(parent, collection);

            return(equal);
        }
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression == null)
            {
                return(null);
            }

            if (methodCallExpression.Arguments[0] == null)
            {
                throw new NotSupportedException();
            }

            IPredicateVisitor innerPredicateVisitor = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);

            var methodName    = methodCallExpression.Method.Name;
            var dynamicInvoke = Expression.Lambda(methodCallExpression.Arguments[0], null).Compile().DynamicInvoke(null);

            if (dynamicInvoke is DateTime dateTime)
            {
                return(methodName == "AsDate" ?
                       new ConstantPredicateVisitor(dateTime.ToUtcIso8601(true).WrapInQuotes()) :
                       new ConstantPredicateVisitor(dateTime.ToUtcIso8601().WrapInQuotes()));
            }

            if (dynamicInvoke is TimeSpan timeSpan && methodName == "AsTime")
            {
                return(new ConstantPredicateVisitor(timeSpan.ToIso8601().WrapInQuotes()));
            }

            return(new ConstantPredicateVisitor(innerPredicateVisitor.Render().WrapInQuotes()));
        }
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            List <IPredicateVisitor> predicateVisitors = new List <IPredicateVisitor>();
            NewArrayExpression       arrayExpression   = expression as NewArrayExpression;

            if (arrayExpression != null)
            {
                foreach (var innerExpression in arrayExpression.Expressions)
                {
                    IPredicateVisitor innerPredicateVisitor = predicateVisitorFactory.Create(innerExpression);
                    predicateVisitors.Add(innerPredicateVisitor);
                }
            }
            else if (IsArrayOrList(expression))
            {
                var dynamicInvoke = Expression.Lambda(expression, null).Compile().DynamicInvoke(null);
                if (dynamicInvoke is IEnumerable array)
                {
                    foreach (var item in array)
                    {
                        var constantOrEnum = IsStringOrEnum(item, out string sItem);
                        var constant       = constantOrEnum
                            ? sItem
                            : item.ToString();
                        predicateVisitors.Add(new ConstantPredicateVisitor(constant));
                    }
                }
            }

            return(new CollectionPredicateVisitor(predicateVisitors));
        }
Пример #11
0
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            var dynamicInvoke = Expression.Lambda(expression, null).Compile().DynamicInvoke(null);
            var compiledValue = dynamicInvoke.ToString().WrapInQuotes();

            return(new ConstantPredicateVisitor(compiledValue));
        }
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression == null)
            {
                return(null);
            }

            if (methodCallExpression.Arguments.Count == 1)
            {
                string            operatorName         = Mapping.AllowedMethods[methodCallExpression.Method.Name];
                IPredicateVisitor cartPredicateVisitor = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);
                return(new UnaryPredicateVisitor(cartPredicateVisitor, operatorName));
            }

            if (methodCallExpression.Arguments.Count == 2)
            {
                string            operatorName            = Mapping.AllowedMethods[methodCallExpression.Method.Name];
                IPredicateVisitor cartPredicateVisitor    = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);
                IEnumerable <IPredicateVisitor> arguments = GetArguments(methodCallExpression.Arguments[1], predicateVisitorFactory);
                if (arguments.ToList().Count > 1 || methodCallExpression.Method.Name == "IsNotIn")
                {
                    CollectionPredicateVisitor collectionPredicateVisitor = new CollectionPredicateVisitor(arguments);
                    return(new ComparisonPredicateVisitor(cartPredicateVisitor, operatorName, collectionPredicateVisitor));
                }
                else
                {
                    return(new ComparisonPredicateVisitor(cartPredicateVisitor, operatorName, arguments.First()));
                }
            }

            return(null);
        }
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression?.Object != null)
            {
                return(predicateVisitorFactory.Create(methodCallExpression.Object));
            }

            return(null);
        }
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            UnaryExpression unaryExpression = expression as UnaryExpression;

            if (unaryExpression == null)
            {
                return(null);
            }

            return(predicateVisitorFactory.Create(unaryExpression.Operand));
        }
Пример #15
0
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            var compiledValue = Expression.Lambda(expression, null).Compile().DynamicInvoke(null).ToString();

            if ((expression as MethodCallExpression)?.Arguments[0].Type == typeof(string))
            {
                compiledValue = compiledValue.WrapInQuotes();
            }

            return(new ConstantPredicateVisitor(compiledValue));
        }
Пример #16
0
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression == null)
            {
                return(null);
            }

            return(predicateVisitorFactory.Create(methodCallExpression.Arguments[0]));
        }
        private static IPredicateVisitor GetAttributeName(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            if (expression is BinaryExpression nameExpression)
            {
                if (nameExpression.Left is MemberExpression memberExpression && memberExpression.Member.Name == "Name")
                {
                    return(RemoveQuotesWithCaseSensitive(predicateVisitorFactory.Create(nameExpression.Right)));
                }
            }

            return(null);
        }
Пример #18
0
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            UnaryExpression unaryExpression = expression as UnaryExpression;

            if (unaryExpression == null)
            {
                return(null);
            }

            IPredicateVisitor cartPredicateVisitorLeft = predicateVisitorFactory.Create(unaryExpression.Operand);

            return(new NotLogicalPredicateVisitor(cartPredicateVisitorLeft));
        }
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            BinaryExpression binaryExpression = expression as BinaryExpression;

            if (binaryExpression == null)
            {
                return(null);
            }

            IPredicateVisitor left  = predicateVisitorFactory.Create(binaryExpression.Left);
            IPredicateVisitor right = predicateVisitorFactory.Create(binaryExpression.Right);

            return(new EqualPredicateVisitor(left, right));
        }
Пример #20
0
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            if (expression is MethodCallExpression methodCallExpression)
            {
                if (methodCallExpression.Object != null)
                {
                    return(predicateVisitorFactory.Create(methodCallExpression.Object));
                }

                return(predicateVisitorFactory.Create(methodCallExpression.Arguments[0]));
            }

            return(null);
        }
Пример #21
0
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression == null)
            {
                return(null);
            }

            IPredicateVisitor current = predicateVisitorFactory.Create(methodCallExpression.Arguments[1]);
            IPredicateVisitor parent  = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);

            return(new Visitors.AccessorPredicateVisitor(current, parent));
        }
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression == null)
            {
                return(null);
            }

            IPredicateVisitor inner     = predicateVisitorFactory.Create(methodCallExpression.Arguments[1]);
            IPredicateVisitor attribute = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);

            return(new ContainerPredicateVisitor(inner, attribute));
        }
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            if (expression is MethodCallExpression methodCallExpression)
            {
                if (methodCallExpression.Object is MemberExpression memberExpression)
                {
                    ContainerPredicateVisitor parentAccessor           = predicateVisitorFactory.Create(memberExpression) as ContainerPredicateVisitor;
                    IPredicateVisitor         constantPredicateVisitor = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);
                    return(new ContainerPredicateVisitor(RemoveQuotes(constantPredicateVisitor), parentAccessor));
                }
            }

            return(null);
        }
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            BinaryExpression binaryExpression = expression as BinaryExpression;

            if (binaryExpression == null)
            {
                return(null);
            }

            IPredicateVisitor predicateVisitorLeft  = predicateVisitorFactory.Create(binaryExpression.Left);
            IPredicateVisitor predicateVisitorRight = predicateVisitorFactory.Create(binaryExpression.Right);
            string            operatorSign          = Mapping.GetOperator(expression.NodeType, Mapping.LogicalOperators);

            return(new BinaryLogicalPredicateVisitor(predicateVisitorLeft, operatorSign, predicateVisitorRight));
        }
Пример #25
0
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression == null)
            {
                return(null);
            }

            IPredicateVisitor inner = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);
            IPredicateVisitor innerWithoutQuotes = RemoveQuotes(inner);
            IPredicateVisitor parent             = predicateVisitorFactory.Create(methodCallExpression.Object);

            return(new Visitors.AccessorPredicateVisitor(innerWithoutQuotes, parent));
        }
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression == null)
            {
                return(null);
            }

            IPredicateVisitor       id     = predicateVisitorFactory.Create(methodCallExpression.Arguments[1]);
            SubtreePredicateVisitor method = new SubtreePredicateVisitor(id);
            IPredicateVisitor       parent = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);

            return(new EqualPredicateVisitor(parent, method));
        }
Пример #27
0
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression == null)
            {
                return(null);
            }

            string methodName = FilterMapping.AllowedMethods[methodCallExpression.Method.Name];
            ConstantPredicateVisitor method = new ConstantPredicateVisitor(methodName);
            IPredicateVisitor        parent = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);

            return(new EqualPredicateVisitor(parent, method));
        }
Пример #28
0
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            UnaryExpression unaryExpression = expression as UnaryExpression;

            if (unaryExpression == null)
            {
                return(null);
            }

            // c.Key == "c14"
            IPredicateVisitor        inner = predicateVisitorFactory.Create(unaryExpression.Operand);
            ConstantPredicateVisitor not   = new ConstantPredicateVisitor(Mapping.Not);

            return(new ContainerPredicateVisitor(inner, not));
        }
Пример #29
0
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            BinaryExpression binaryExpression = expression as BinaryExpression;

            if (binaryExpression == null)
            {
                return(null);
            }

            IPredicateVisitor          left                   = predicateVisitorFactory.Create(binaryExpression.Left);
            string                     operatorSign           = Mapping.GetOperator(expression.NodeType, Mapping.ComparisonOperators);
            IPredicateVisitor          right                  = predicateVisitorFactory.Create(binaryExpression.Right);
            ComparisonPredicateVisitor simplePredicateVisitor = new ComparisonPredicateVisitor(left, operatorSign, right);

            return(simplePredicateVisitor);
        }
        private static IPredicateVisitor GetName(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            BinaryExpression binaryExpression = expression as BinaryExpression;

            if (binaryExpression == null)
            {
                return(null);
            }

            if (binaryExpression.Left is MemberExpression memberExpression && memberExpression.Member.Name == "Name")
            {
                IPredicateVisitor name = predicateVisitorFactory.Create(binaryExpression.Right);
                return(RemoveQuotesWithCaseSensitive(name));
            }

            return(null);
        }