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