public virtual VfpExpression Visit(VfpComparisonExpression expression)
 {
     return(new VfpComparisonExpression(expression.ExpressionKind,
                                        expression.ResultType,
                                        expression.Left.Accept(this),
                                        expression.Right.Accept(this)));
 }
        public override VfpExpression Visit(VfpComparisonExpression expression)
        {
            // Check the left expression to see if it contains a property expression.
            // Don't need to rewrite the comparison expression of the left side already contains a property expression.
            if (PropertyGatherer.Gather(expression.Left).Any())
            {
                return(expression);
            }

            // Check the right expression to see if it has a property expression.
            if (!PropertyGatherer.Gather(expression.Right).Any())
            {
                return(expression);
            }

            return(reverseExpression(expression));
        }
        public override VfpExpression Visit(VfpProjectExpression expression)
        {
            VfpProjectExpression innerProjectionExpression;
            bool hasNotExpression;

            if (GetInnerProjectionExpression(expression, out innerProjectionExpression, out hasNotExpression))
            {
                var innerNewInstanceExpression = innerProjectionExpression.Projection as VfpNewInstanceExpression;

                if (innerNewInstanceExpression != null)
                {
                    var innerConstExpression = innerNewInstanceExpression.Arguments[0] as VfpConstantExpression;

                    if (innerConstExpression != null)
                    {
                        var countExpression = new VfpConstantExpression(innerConstExpression.ResultType, "COUNT(*)");
                        innerNewInstanceExpression = new VfpNewInstanceExpression(innerNewInstanceExpression.ResultType, new VfpExpressionList(new List <VfpExpression> {
                            countExpression
                        }));
                        innerProjectionExpression = new VfpProjectExpression(innerProjectionExpression.ResultType, innerProjectionExpression.Input, innerNewInstanceExpression);

                        VfpExpression comparison = new VfpComparisonExpression(VfpExpressionKind.LessThan,
                                                                               PrimitiveTypeKind.Boolean.ToTypeUsage(),
                                                                               new VfpConstantExpression(
                                                                                   PrimitiveTypeKind.Int32.ToTypeUsage(), 0),
                                                                               innerProjectionExpression);

                        if (!hasNotExpression)
                        {
                            comparison = new VfpNotExpression(comparison.ResultType, comparison);
                        }

                        innerNewInstanceExpression = new VfpNewInstanceExpression(innerNewInstanceExpression.ResultType, new VfpExpressionList(new List <VfpExpression> {
                            comparison
                        }));
                        innerProjectionExpression = new VfpProjectExpression(expression.ResultType, expression.Input, innerNewInstanceExpression);

                        return(innerProjectionExpression);
                    }
                }
            }

            return(base.Visit(expression));
        }
        private static VfpComparisonExpression reverseExpression(VfpComparisonExpression expression)
        {
            switch (expression.ExpressionKind)
            {
            case VfpExpressionKind.GreaterThan:
                return(expression.Right.LessThan(expression.Left));

            case VfpExpressionKind.GreaterThanOrEquals:
                return(expression.Right.LessThanOrEquals(expression.Left));

            case VfpExpressionKind.LessThan:
                return(expression.Right.GreaterThan(expression.Left));

            case VfpExpressionKind.LessThanOrEquals:
                return(expression.Right.GreaterThanOrEquals(expression.Left));

            default:
                return(expression);
            }
        }
Esempio n. 5
0
 public override VfpExpression Visit(VfpComparisonExpression expression)
 {
     return(Visit((VfpBinaryExpression)expression));
 }
 private static bool IsZeroEqualsZero(VfpComparisonExpression expression)
 {
     return(expression != null && expression.ExpressionKind == VfpExpressionKind.Equals && IsZero(expression.Left as VfpConstantExpression) && IsZero(expression.Right as VfpConstantExpression));
 }
        public override VfpExpression Visit(VfpComparisonExpression expression)
        {
            _expressions.Add(expression);

            return(base.Visit(expression));
        }