public override VfpExpression Visit(VfpFilterExpression expression) { var isEmptyExpression = expression.Predicate as VfpIsEmptyExpression; if (isEmptyExpression == null) { return(base.Visit(expression)); } var projectExpression = isEmptyExpression.Argument as VfpProjectExpression; if (projectExpression == null) { return(base.Visit(expression)); } var filterExpression = projectExpression.Input.Expression as VfpFilterExpression; var variables = VariableReferenceGatherer.Gather(filterExpression); if (variables.All(x => expression.Input.VariableName != x.VariableName)) { return(base.Visit(expression)); } // TODO: verify inner join //var joinExpression = VfpExpression.Join(VfpExpressionKind.InnerJoin, expression.ResultType, expression.Input, filterExpression.Input, filterExpression.Predicate); //var binding = VfpExpression.Binding(joinExpression, VfpExpression.VariableRef(PrimitiveTypeKind.String.ToTypeUsage(), "X" + (++_count))); //return base.Visit(binding); return(base.Visit(expression)); }
private static VfpExpression GetProjection(VfpFilterExpression filterExpression, string filterVariableName, VfpExpression projectionExpression) { var newInstanceExpression = projectionExpression as VfpNewInstanceExpression; if (newInstanceExpression == null) { return(projectionExpression); } var newInstanceVariableNames = VariableReferenceGatherer.Gather(newInstanceExpression) .Select(x => x.VariableName) .Distinct() .ToArray(); if (newInstanceVariableNames.Length != 1) { return(projectionExpression); } if (filterVariableName != newInstanceVariableNames.First()) { return(projectionExpression); } return(VariableReferenceReplacer.Replace(filterExpression.Input.Variable, newInstanceExpression)); }
public override VfpExpression Visit(VfpFilterExpression expression) { VisitVfpExpressionBinding(expression.Input); WriteLine(Indentation.Same); Write("WHERE "); expression.Predicate.Accept(this); return(expression); }
public override VfpExpression Visit(VfpFilterExpression expression) { var result = base.Visit(expression); expression = result as VfpFilterExpression; if (expression == null) { return(result); } if (IsValidXmlToCursorExpression(expression.Predicate as VfpXmlToCursorExpression)) { var predicate = VfpExpressionBuilder.Constant(0).ExpressionEquals(VfpExpressionBuilder.Constant(0)); return(new VfpFilterExpression(expression.ResultType, expression.Input, predicate)); } return(result); }
public override VfpExpression Visit(VfpFilterExpression expression) { expression = (VfpFilterExpression)base.Visit(expression); var innerFilter = expression.Input.Expression as VfpFilterExpression; if (innerFilter == null) { return(expression); } var variables = VariableReferenceGatherer.Gather(innerFilter.Predicate); if (!variables.Any() || variables.Select(x => x.VariableName).Distinct().Count() > 1) { return(expression); } var predicate = VariableReferenceReplacer.Replace(variables.First(), expression.Predicate); return(innerFilter.Input.Filter(predicate.And(innerFilter.Predicate))); }
private static bool IsZeroEqualsZero(VfpFilterExpression expression) { return(expression != null && IsZeroEqualsZero(expression.Predicate as VfpComparisonExpression)); }
private static IEnumerable <EdmMember> GetKeyMembers(VfpFilterExpression expression) { return(expression == null ? new EdmMember[] { } : GetKeyMembers(expression.Input, expression)); }
private static VfpLimitExpression GetVfpLimitExpression(VfpLimitExpression limitExpression, VfpFilterExpression filterExpression) { var keyMembers = GetKeyMembers(filterExpression); if (!keyMembers.Any()) { return(null); } var sortBinding = GetSortBinding(keyMembers, filterExpression.Input, filterExpression); var newFilter = sortBinding.Filter(filterExpression.Predicate); return(new VfpLimitExpression(limitExpression.ResultType, newFilter, limitExpression.Limit, limitExpression.WithTies)); }
public virtual VfpExpression Visit(VfpFilterExpression expression) { return(new VfpFilterExpression(expression.ResultType, VisitVfpExpressionBinding(expression.Input), expression.Predicate.Accept(this))); }