Exemple #1
0
        // When there is more than one property accessor, the last accessor needs to be taken out and added to the binary logical predicate.
        // property(property(property operator value)
        private static IPredicateVisitor CombinePredicates(IPredicateVisitor left, IPredicateVisitor right)
        {
            var containerLeft = (ContainerPredicateVisitor)left;

            IPredicateVisitor parent = containerLeft;

            if (parent == null)
            {
                return(new ContainerPredicateVisitor(right, left));
            }

            IPredicateVisitor         innerContainer    = right;
            ContainerPredicateVisitor combinedContainer = null;

            while (parent != null)
            {
                if (CanBeCombined(parent))
                {
                    var container = (ContainerPredicateVisitor)parent;
                    innerContainer    = new ContainerPredicateVisitor(innerContainer, container.Inner);
                    combinedContainer = new ContainerPredicateVisitor(innerContainer, container.Parent);
                    parent            = container.Parent;
                }
            }

            return(combinedContainer);
        }
        // When there is more than one property accessor, the last accessor needs to be taken out and added to the binary logical predicate.
        // property(property(property operator value)
        private static IPredicateVisitor CombinePredicates(IPredicateVisitor left, string operatorSign, IPredicateVisitor right)
        {
            var containerLeft = (ContainerPredicateVisitor)left;
            IPredicateVisitor      innerLeft = containerLeft.Inner;
            BinaryPredicateVisitor binaryPredicateVisitor = new BinaryPredicateVisitor(innerLeft, operatorSign, right);

            IPredicateVisitor parent = containerLeft.Parent;

            if (parent == null)
            {
                return(new ContainerPredicateVisitor(binaryPredicateVisitor, null));
            }

            IPredicateVisitor         innerContainer    = binaryPredicateVisitor;
            ContainerPredicateVisitor combinedContainer = null;

            while (parent != null)
            {
                if (CanBeCombined(parent))
                {
                    var container = (ContainerPredicateVisitor)parent;
                    innerContainer    = new ContainerPredicateVisitor(innerContainer, container.Inner);
                    combinedContainer = new ContainerPredicateVisitor(innerContainer, container.Parent);
                    parent            = container.Parent;
                }
            }

            return(combinedContainer);
        }
        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();
        }
Exemple #5
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);
            }

            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);
        }
        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);
        }
Exemple #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)
        {
            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));
        }
        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 == 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()));
        }
        private static IPredicateVisitor RemoveQuotes(IPredicateVisitor inner)
        {
            if (inner is ConstantPredicateVisitor constantVisitor)
            {
                ConstantPredicateVisitor constantWithoutQuotes = new ConstantPredicateVisitor(constantVisitor.Constant.RemoveQuotes(), true);
                return(constantWithoutQuotes);
            }

            return(inner);
        }
        /// <summary>
        /// Remove Quotes and make it constant predicate visitor with case sensitive
        /// Attribute names must be case sensitive
        /// </summary>
        /// <param name="inner">The inner Constant Predicate Visitor</param>
        /// <returns>Constant Predicate Visitor</returns>
        private static IPredicateVisitor RemoveQuotesWithCaseSensitive(IPredicateVisitor inner)
        {
            if (inner is ConstantPredicateVisitor constantVisitor)
            {
                ConstantPredicateVisitor constantWithoutQuotes = new ConstantPredicateVisitor(constantVisitor.Constant.RemoveQuotes().WrapInBackticksIfNeeded(), true);
                return(constantWithoutQuotes);
            }

            return(inner);
        }
        private string RenderSide(IPredicateVisitor side)
        {
            string result = side.Render();

            if (this.HasLowerPrecedenceOperator(side))
            {
                result = $"({result})";
            }

            return(result);
        }
        private bool HasLowerPrecedenceOperator(IPredicateVisitor side)
        {
            if (side is BinaryLogicalPredicateVisitor logicalPredicateVisitor)
            {
                if (logicalPredicateVisitor.operatorSign == Mapping.Or && this.operatorSign == Mapping.And)
                {
                    return(true);
                }
            }

            return(false);
        }
Exemple #16
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));
        }
        private static bool HasSameParents(IPredicateVisitor left, IPredicateVisitor right)
        {
            bool result = false;

            while (left is ContainerPredicateVisitor containerLeft && right is ContainerPredicateVisitor containerRight)
            {
                result = ArePropertiesEqual(containerLeft, containerRight);
                left   = containerLeft.Inner;
                right  = containerRight.Inner;
            }

            return(result);
        }
        public override TResult Accept <TResult>(IParseTreeVisitor <TResult> visitor)
        {
            IPredicateVisitor <TResult> typedVisitor = visitor as IPredicateVisitor <TResult>;

            if (typedVisitor != null)
            {
                return(typedVisitor.VisitOperand(this));
            }
            else
            {
                return(visitor.VisitChildren(this));
            }
        }
 public void AppendAccessor(AccessorPredicateVisitor accessor)
 {
     if (this.operand != null)
     {
         if (this.operand is IAccessorAppendable accessorAppendablePredicate)
         {
             accessorAppendablePredicate.AppendAccessor(accessor);
         }
     }
     else
     {
         this.operand = accessor;
     }
 }
        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);
        }
Exemple #21
0
 public void AppendAccessor(AccessorPredicateVisitor accessor)
 {
     if (this.parentAccessor == null)
     {
         this.parentAccessor = accessor;
     }
     else
     {
         if (this.parentAccessor is IAccessorAppendable accessorAppendablePredicate)
         {
             accessorAppendablePredicate.AppendAccessor(accessor);
         }
     }
 }
        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));
        }
        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));
        }
Exemple #24
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)
        {
            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));
        }
Exemple #26
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));
        }
Exemple #28
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));
        }
Exemple #29
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));
        }
Exemple #30
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);
        }