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));
        }
コード例 #3
0
        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);
        }
コード例 #5
0
        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));
 }
コード例 #7
0
 private static IEnumerable <EdmMember> GetKeyMembers(VfpFilterExpression expression)
 {
     return(expression == null ? new EdmMember[] { } : GetKeyMembers(expression.Input, expression));
 }
コード例 #8
0
        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));
        }
コード例 #9
0
 public virtual VfpExpression Visit(VfpFilterExpression expression)
 {
     return(new VfpFilterExpression(expression.ResultType, VisitVfpExpressionBinding(expression.Input), expression.Predicate.Accept(this)));
 }